2011-07-10 7 views
5

W pliku manifest.json oświadczam, że chcę, aby wprowadzić pewne skrypty, tak:Rozszerzenie Chrome nie może wpływać na elementy 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 
     } 
    ] 
} 

W skrypcie partnerskiej utworzyć iframe, między innymi. Do tej pory działa dobrze. W ten sposób:

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

Problem polega na tym, że wewnątrz elementu iframe nie dziedziczy on niczego ze skryptów treści. Jeśli chcę używać jQuery, muszę użyć <script src=..., aby dołączyć go ponownie do elementu iframe.

Wolę nie włączać jQuery, ponieważ już umieściłem go w rozszerzeniu. Nie chcę, aby użytkownik ponownie pobierał jQuery na każdej stronie, na której musi być uruchomione rozszerzenie.

Próbowałem już atrybutu "all_frames": true, ale to nie działa.

Prosimy o radę. Dzięki.

Edit: dodałem example.com do atrybutu jak to matches:

"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 
    } 
] 

Ale to nie działa.

Aby być jaśniejsze, powiedzmy zawartość iframe (example.com) wynosi:

<!DOCTYPE HTML> 

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

<body> 

<div></div> 

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

</script> 

</body> 
</html> 

Nie będzie błąd: $ nie jest zdefiniowana

Aby działać, muszę używać:

<!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

Czy możesz pokazać swój pełny manifest za pomocą zestawu 'all_frames' i kodu skryptu treści, który tworzy element iframe? – serg

+0

Ok, edytowałem pytanie. – Betty

+0

Hej Betty, teraz, gdy Serg rozwiązał początkowy problem, spójrz na to pytanie podczas oczekiwania na załadowanie ramki, aby uzyskać do niej dostęp: http: // stackoverflow.com/questions/4669089/how-to-inject-an-iframe-panel-to-a-google-chrome-extension-and-add-click-event-in- – Darin

Odpowiedz

4

trzeba dodać swoją iframe url http://example.com do listy i określić zawartość skrypty do wstrzyknięcia:

"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

Próbowałem już w inny sposób, po prostu dodając example.com do atrybutu "mecze", ale bez powodzenia. Zobacz edytowane pytanie. PS: Nacisnąłem enter, aby uzyskać nową linię, i byłem zaskoczony, że komentarz został wysłany. >< – Betty

+0

@Betty Nie działałoby tak, jak chcesz. Skrypty z treścią są piaskowane, zwykła strona nie może uzyskać dostępu do jquery wstrzykniętego jako skrypt zawartości. Jeśli frame example.com jest częścią twojego rozszerzenia i masz nad nim pełną kontrolę, możesz przenieść cały javascript z tej strony do skryptu treści i wstrzyknąć go razem z jquery. – serg

+0

Dziękuję @serg. Zawartość mojej ramki example.com jest generowana dynamicznie, więc nie mogę umieścić jej w rozszerzeniu. Myślę, że to oznacza, że ​​tego, czego chcę, nie można zrobić. Będę musiał użyć

0

Jeśli sprawa wydajność dla ciebie, jeśli polecam stosowanie czystego javascript zamiast jQuery, a różnica wydajność będzie widoczna dla ciężkich stron, które zawiera kilka iFrames; szczególnie jeśli używasz funkcji jquery takich jak dodawać i filtr i skomplikowanych selektorów.

Powiązane problemy