Czy można wstrzyknąć treść skryptu tylko wtedy, gdy typ zawartości dokumentu pasuje do określonego wzorca? W rzeczywistości mój cel jest znacznie prostszy: potrzebuję mojego skryptu zawartości wstrzykniętego do dokumentów HTML tylko (na razie jest on również wstrzykiwany w dokumentach XML). Skrypty zawartości należy wstrzykiwać w "document_start".Jak ograniczyć skrypt zawartości rozszerzenia Chrome do określonych typów treści?
Odpowiedz
Doszłam do podobnego problemu i rozwiązałem go w następujący sposób.
Zamiast ograniczać różnorodność dokumentów, w których zastrzykuje się skrypt zawartości, w oparciu o dokumenty "Content-Type
, postanowiłem wstrzyknąć skrypt do wszystkich dokumentów, ale wykonać go tylko we właściwych dokumentach.
Odbywa się to poprzez analizę document.xmlVersion
i document.doctype
właściwości:
document.doctype
nie musi byćnull
w dokumencie HTML;document.xmlVersion
nie może byćnull
w dokumencie XML;
Tak, to jest łatwy w użyciu jednej z nich, aby odróżnić jedno od drugiego typu i „bind” tylko wszystkie niezbędne skrypt rzeczy we właściwym czasie. W szczególności można wstrzyknąć mały program ładujący skrypt, który ładuje dodatkowe, ewentualnie ciężkie rzeczy, warunkowo.
Chrome nadal nie zapewnia żadnych sposobów ograniczenia wprowadzania skryptów według typu dokumentu.
Najbardziej niezawodny sposób to zrobić przez chrome.webRequest.onHeadersReceived
, który pozwala na zapytanie i zachowanie informacji w nagłówku odpowiedzi (w tym Content-Type
). Niestety ten interfejs API nie jest obecnie dostępny w stabilnych wersjach Chrome. (Możesz używać eksperymentalnego API w bieżących wersjach Chrome, ale nie będziesz w stanie publikować rozszerzeń, które go używają.)
Jednym z możliwych rozwiązań jest ustalenie, czy wstrzykiwany dokument jest traktowany przez Chrome jako XML. (A jeśli tak, przestań przetwarzać dokument.) Hackem do tego celu jest sprawdzenie, czy document.getElementById('webkit-xml-viewer-source-xml')
jest null
. Ta część przeglądarki przeglądarki XML Chrome/webkita.
Co zrobić, jeśli skrypt treści dodaje detektor zdarzeń czekający na załadowanie dokumentu przed wykonaniem akcji? Na przykład: "document.addEventListener (" DOMContentLoaded ", function() {do.stuff()};'. – cheeken
Tego właśnie powinienem uniknąć, mój skrypt musi zostać wykonany jako pierwszy (przed załadowaniem dokumentu) – spektom
Rozumiem. W takim przypadku nie mam innych zaleceń. – cheeken