5

Jestem już blisko, by moje rozszerzenie Chrome działało idealnie, ale mam teraz jeden ostatni numer.Rozszerzenie przeglądarki Chrome - skrypty zawartości układają się wiele razy od linków AJAX/nawigacji

Problem wydaje się być związane z treścią skryptu wielokrotnie wtryskiwany jest na stronach takich jak Facebook, gdzie cała strona nie jest ładowany po kliknięciu łącza, etc ...

Myślę, że problem jest związany z strona jest bardzo zależna od AJAX.

Jeśli odświeżam całą stronę lub załaduję ją po raz pierwszy, to nie ma problemu. Moje przebiegi rozszerzeń i skrypt treści jest wstrzykiwany prawidłowo.

Jeśli jednak załaduję stronę po raz pierwszy, a następnie kliknę link w witrynie, "sekcja zawartości" Facebooka załaduje każdy kliknięty link, podczas gdy pływający niebieski pasek nawigacji na górze nie " t odśwież lub zmień w ogóle.

I.E. cała strona nie przeładowuje się. Ponieważ zarówno "sekcja treści" witryny, jak i pasek nawigacyjny znajdują się w tej samej ramce, skrypt treści jest ciągle wstrzykiwany innym razem dla każdego klikniętego łącza.

W końcu widzę w moim dzienniku konsoli, że działa 2X, 3X, 4X, 5X itd .. Kiedy klikam na więcej linków, liczba zwiększa się o 1 za każdym razem.

Więc moje pytanie brzmi:

Czy istnieje prosty sposób sprawdzić, czy skrypt zawartość jest już obecna/aktywna przed wstrzyknięciem go ponownie? Lub co jeszcze może być wykorzystane jako obejście dla takiej sytuacji?

Odpowiedz

1

Podobny problem wystąpił podczas pisania skryptu treści dla mojego rozszerzenia, dlatego dodałem unikatowy atrybut do elementu <body> każdej strony z nazwą rozszerzenia i jego wersją.

Pierwszą rzeczą, którą robi skrypt zawartości, jest sprawdzenie, czy ten atrybut już skrypty i zatrzymuje się, jeśli tak. W przeciwnym razie doda ten atrybut (o wartości true) i będzie kontynuował swój cel.

Jeśli chcesz zobaczyć moją solution;

Nieco bardziej skomplikowanym aspektem tej techniki jest pobranie wersji przy użyciu message passing i przeanalizowanie manifestu (pobranego w żądaniu AJAX) w obiekcie JSON.

Aby zobaczyć dokładnie, jak osiągnąłem to spojrzenie na init i onRequestHelper funkcji ;

Oczywiście można po prostu mocno zakodować wersję lub całkowicie ją pominąć. Dopóki nazwa atrybutu jest unikalna.

+0

Dzięki za linki i próbki kodu! – delta9

+0

Wierzę, że zaktualizowany link do jego rozwiązania jest teraz https://github.com/neocotic/template/blob/master/chrome/bin/lib/content.js –

+0

Dzięki @SarahVessels, zaktualizowałem wszystkie odpowiednie linki. – Alasdair

1

W ramce nadrzędnej można dodać window.doneInjecting = true; lub coś podobnego? (lub może dodać do strony ukryty element - nie jestem pewien, czy ramka podrzędna może uzyskać dostęp do zmiennych JavaScript swojego rodzica)

Ale po prostu ustawienie prostej flagi, aby za każdym razem, gdy wstrzyknięty został skrypt treści, sprawdź, czy flaga istnieje i jest kontynuowana tylko wtedy, gdy tak nie jest?

1

onUpdated pożary po każdej zmianie stanu karty.wystarczy załadować skrypty treści w changeInfo.status == "complete"

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
chrome.tabs.getSelected(null, function(tab) { 
    // Do some stuff 
    if (changeInfo.status == "complete") 
    { 
     // load your scripts here 
     chrome.tabs.executeScript(tabId, {file: "jquery.js"}); 
     chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"}); 
    } 
}); 
}); 
Powiązane problemy