2011-07-10 12 views
5

En el archivo manifest.json, declaro que yo quiero para inyectar algunas secuencias de comandos, así:En la extensión de Chrome, las secuencias de comandos de contenido no pueden afectar dentro del iframe.

{ 
    "name": "my extension", 

    "version": "1.0", 

    "background_page": "background.html", 

    "permissions": ["contextMenus", "tabs", "http://*.example.com/*"], 

    "content_scripts": [ 
     { 
      "matches": 
       [ 
       "http://*.taobao.com/*", 
       "http://*.yintai.com/*" 
       ], 
      "run_at": "document_idle", 
      "js": ["jquery-1.5.1.min.js","jquery-ui-1.8.13.custom.min.js", "contentscript.js"], 
      "all_frames": true 
     } 
    ] 
} 

En el guión de contenidos, se crea un iframe, entre otras cosas. Funciona bien hasta ahora. De esta manera:

$('<div id="my_notifier"></div>').appendTo($('body')).html('<iframe src="http://example.com"></iframe>'); 

El problema es, dentro del marco flotante, no hereda nada de los guiones de contenido. Si quiero usar jQuery, tengo que usar <script src=... para incluirlo nuevamente dentro del iframe.

Prefiero no incluir jQuery nuevamente porque ya lo puse en la extensión. No deseo que el usuario descargue jQuery una y otra vez en cada página en la que la extensión deba ejecutarse.

He intentado con el atributo "all_frames": true, pero no funciona.

Por favor, asesorar. Gracias.

Edit: example.com añadió al atributo matches así:

"content_scripts": [ 
    { 
     "matches": 
      [ 
      "http://*.taobao.com/*", 
      "http://*.yintai.com/*", 
      "http://*.example.com/*" 
      ], 
     "run_at": "document_idle", 
     "js": ["jquery-1.5.1.min.js","jquery-ui-1.8.13.custom.min.js", "contentscript.js"], 
     "all_frames": true 
    } 
] 

Pero no funciona.

Para ser más claro, por ejemplo el contenido del iframe (example.com) es:

<!DOCTYPE HTML> 

<html> 
<head> 
    <title>Untitled</title> 
</head> 

<body> 

<div></div> 

<script type="text/javascript"> 
    $('div').html('hi'); 

</script> 

</body> 
</html> 

Habrá un error: $ no está definido

Para que funcione, tengo que utilizar:

<!DOCTYPE HTML> 

<html> 
<head> 
    <title>Untitled</title> 
</head> 

<body> 

<div></div> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
<script type="text/javascript"> 
    $('div').html('hi'); 

</script> 

</body> 
</html> 
+0

¿Puedes mostrar tu manifiesto completo con el conjunto 'all_frames' y tu código de script de contenido que crea iframe? – serg

+0

Ok, he editado la pregunta. – Betty

+0

Hola Betty, ahora que Serg ha resuelto el problema inicial, eche un vistazo a esta pregunta al esperar hasta que el marco se haya cargado para acceder a ella: http: // stackoverflow.com/questions/4669089/how-to-inject-an-iframe-panel-to-a-google-chrome-extension-and-add-click-event-in – Darin

Respuesta

4

Es necesario añadir la URL de su iframe http://example.com a la lista y especificar el contenido de guiones para inyectar: ​​

"content_scripts": [ 
     { 
      "matches": 
       [ 
       "http://*.taobao.com/*", 
       "http://*.yintai.com/*" 
       ], 
      "run_at": "document_idle", 
      "js": ["jquery-1.5.1.min.js","jquery-ui-1.8.13.custom.min.js", "contentscript.js"] 
     },{ 
      "matches":["http://example.com/*"], 
      "run_at": "document_idle", 
      "js": ["jquery-1.5.1.min.js"], 
      "all_frames": true 
     } 
    ] 
+0

He intentado a su manera, y de otra manera simplemente agregando example.com al atributo 'matches', pero sin suerte. Ver la pregunta editada. PD: presioné enter para obtener una nueva línea, y me sorprendió encontrar que el comentario fue enviado. >< – Betty

+0

@Betty No funcionaría de la manera que desee. Los scripts de contenido son sandbox, una página normal no puede acceder a jquery inyectado como script de contenido. Si el marco de example.com es parte de su extensión y usted tiene control total sobre él, puede mover todo el javascript de esa página a un script de contenido e inyectarlo junto con jquery. – serg

+0

Gracias @serg. El contenido de mi marco de example.com se genera dinámicamente, por lo que no puedo ponerlo en la extensión. Creo que eso significa que no puedo hacer lo que quiero. Tendré que usar

0

Si la materia rendimiento para usted, si yo recomiendo usar javascript puro en vez de jQuery, y la diferencia de rendimiento será perceptible para las páginas pesados ​​que contiene varios iFrames; especialmente si se utilizan funciones de jQuery como anexar y filtro y selectores complicados.

Cuestiones relacionadas