2013-05-02 11 views
25

Buduję rozszerzenie przeglądarki Chrome i muszę umieścić nakładkę html na kilku stronach internetowych. W tej chwili używam JQuery .Get do wyciągnięcia html z mojego serwera. W celu poprawy wydajności zastanawiam się, czy możliwe jest dołączenie html jako pliku do katalogu rozszerzenia i bezpośredni dostęp do źródła? Czy ktoś wie, czy to jest możliwe?Wpisywanie kodu HTML do strony ze skryptu treści

UPDATE

sugestia Roba spełnia swoje zadanie (patrz odpowiedź zaakceptowane). Jedynym dodatkowym krokiem jest zarejestrowanie pliku w manifeście pod numerem web_accessible_resources.

{ 
    ... 
    "web_accessible_resources": [ 
    "myimportfile1.html", 
    "myimportfile2.html" 
    ], 
    ... 
} 

Odpowiedz

37

Tak, to możliwe. Użyj chrome.extension.getURL, aby uzyskać bezwzględny URL dla zasobu. Na przykład:

Krok 1:

$.get(chrome.extension.getURL('/template.html'), function(data) { 
    $(data).appendTo('body'); 
    // Or if you're using jQuery 1.8+: 
    // $($.parseHTML(data)).appendTo('body'); 
}); 

Krok 2:

Zarejestruj zasobu w manifeście pod web_accessible_resources: Zobacz https://developer.chrome.com/extensions/manifest#web_accessible_resources (Zapewnione przez @QFDev)

+5

Działa idealnie, dzięki! Jedynym dodatkowym krokiem jest zarejestrowanie zasobu w manifeście w web_accessible_resources: http://developer.chrome.com/extensions/manifest.html#web_accessible_resources – QFDev

+0

@QFDev, gdzie umieścisz ten kod? – Chamnap

+1

@Chamnap również w moim przypadku miałem ten kod w moim skrypcie treści. – QFDev

5

To jest moje podejście:

var xmlHttp = null; 

xmlHttp = new XMLHttpRequest(); 
xmlHttp.open("GET", chrome.extension.getURL ("src/inject/inject.html"), false); 
xmlHttp.send(null); 

var inject = document.createElement("div"); 
inject.innerHTML = xmlHttp.responseText 
document.body.insertBefore (inject, document.body.firstChild); 

Bez jQuery itp.

+0

Wygląda na to, że przeglądarka Chrome ma przestarzałe XMLHttpRequest() w głównym wątku. Właśnie to dostaję, kiedy zaadoptowałem ten kod dla przeglądarkiAction.metoda kliknięcia: 'Synchroniczne XMLHttpRequest w głównym wątku jest przestarzałe ze względu na jego szkodliwe skutki dla użytkownika końcowego. Aby uzyskać dodatkową pomoc, sprawdź http: // xhr.spec.whatwg.org/.' – baskint

+2

zmień ostatni parametr '.open()' na 'true' i będzie asynchroniczny – Kamil

+0

Aby ustawić asynchroniczny, musiałem zmienić ostatni parametr '.open()' na 'true' i zawiń ostatnie trzy linie kodu w' xmlHttp.onload = function() {...} – richardkmiller

0

Jeśli używasz kątowa w rozszerzeniu Chrome, można skorzystać z ng-include

var injectedContent = document.createElement("div"); 
injectedContent.setAttribute("ng-include", ""); 
//ng-include src value must be wrapped in single quotes 
injectedContent.setAttribute("src", "'" + chrome.extension.getURL("template.html") + "'"); 
existingElement.appendChild(injectedContent); 
1

używam tego kodu. To tylko 3 linie kodu i nie potrzebujesz żadnych śmieci jQuery.

var iframe = document.createElement ('iframe'); 
iframe.src = chrome.extension.getURL ('iframe.html'); 
document.body.appendChild (iframe); 
0

Innym ze sposobów jest użycie nowego Fetch API:

Jeśli nazwa pliku jest modal.html - aktualizacja manifest.json odpowiednio

"web_accessible_resources": [ 
    "modal.html", 
], 

i wstrzyknąć go tak:

fetch(chrome.extension.getURL('/modal.html')) 
    .then(response => response.text()) 
    .then(data => { 
     document.body.innerHTML += data; 
     // other code 
     // eg update injected elements, 
     // add event listeners or logic to connect to other parts of the app 
    }).catch(err => { 
     // handle error 
    }); 
Powiązane problemy