2013-08-24 2 views
7

Я хочу выполнить функцию скрипта содержимого всякий раз, когда обновляется вкладка. Проблема в том, что иногда обновление табуляции является ajax (без перезагрузки страницы), при этом все еще меняется URL-адрес страницы. Поэтому старый скрипт контента, который был введен, все еще существует на странице. Результатом этого является несколько экземпляров сценария контента, который вводится и запускается на одной странице.определить, был ли внедрен скрипт содержимого расширенного содержимого Chrome/скрипт содержимого. Guard:

Итак, я ищу механизм для ввода сценария контента, только если ранее не был введен какой-либо такой же сценарий содержимого. Есть идеи?

+0

Так что я интересно, если бы вы были в состоянии найти рабочее решение, кроме пытается отправить сообщение и ждать ответ от сценария контента? – c00000fd

+0

@ c00000fd: пересматривая этот вопрос, я думаю, что решение Rob W проще, в том смысле, что оно не зависит от передачи хром-сообщений. –

ответ

14

Вы можете попробовать отправить сообщение в сценарий содержимого (Message Passing). Если скрипт контента успешно возвращает ответ, это означает, что сценарий содержимого уже существует, иначе возвращается пустой ответ, вы можете проверить пустой ответ и ввести сценарий содержимого.

фона:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) { 
     if (response) { 
      console.log("Already there"); 
     } 
     else { 
      console.log("Not there, inject contentscript"); 
     } 
    }); 
}); 

ContentScript:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     if (request.greeting == "hello") 
      sendResponse({message: "hi"}); 
}); 
+0

Пробовал это. Но вы знаете только об ошибке в обратном вызове sendMessage. И вы не можете поймать ошибку, вызванную функцией обратного вызова. –

+0

@KevenWang см. Мой обновленный ответ –

7

Реализация включаемый охрану чрезвычайно прост:

(function() { 
    if (window.hasRun) return; 
    window.hasRun = true; 
    // Rest of code 
})(); 

Если вы хотите программно впрыснуть content script, рассмотреть возможность использования одного из webNavigation событий (например, onCommitted) вместо chrome.tabs.onUpdated. В отличие от событий tabs события webNavigation также запускаются для навигации по кадрам и предлагают способ объявить URL-фильтр заранее.

+0

Полезно знать о WebNavigation! С этим включите охрану, сам код по-прежнему вводится. После многих навигаций на эту страницу может быть добавлено множество сценариев контента. Это может вызвать проблемы с производительностью? Есть ли способ для инъекций, проверяя отсутствие скрипта контента? –

+0

Все сценарии содержимого из одного и того же расширения выполняются в том же контексте. Не беспокойтесь о производительности. –

+1

Все сценарии контента из одного и того же продления выполняются в том же контексте ... ** до тех пор, пока расширение не будет перезагружено **. Будьте осторожны, если вы перезагрузите расширение - это приведет к запуску двух расширений. – vaughan

Смежные вопросы