Расширение Chrome: как перезагрузить / повторно выполнить скрипт содержимого по запросу Ajax - PullRequest
6 голосов
/ 07 сентября 2011

Я пытаюсь выполнить скрипт содержимого для определенного сайта (добавить кнопку или изменить ссылку), однако я хотел бы сделать это, когда пользователь просматривает сайт.

Проблема в том, что веб-страница создается динамически с помощью запросов AJAX при просмотре пользователем.

Я решил эту проблему ранее, написав расширение, фактически вставив свой javascript в веб-страницу.

Мне было интересно, есть ли лучшая альтернатива - просто зарегистрироваться в событии ajaxComplete или что-то подобное в моем скрипте контента, чтобы я мог выполнить его заново.

Я могу сделать следующее:

function listener()
{
    console.debug("listener fired.");
}
document.addEventListener("DOMSubtreeModified", listener, false);

Однако это происходит слишком много раз при загрузке одной страницы.

Ответы [ 2 ]

8 голосов
/ 07 сентября 2011

Нет прослушивателя ajax, о котором я знаю, но в любом случае это не сильно поможет, так как вам нужно отлавливать при изменении страницы, а не отправлять / получать запрос ajax (изменение страницы обычно происходит позже и может быть не связано на ajax-запрос вообще).

DOMSubtreeModified - правильный путь, просто установите защиту от слишком частых вызовов:

function listener()
{
    console.debug("listener fired.");
}

var timeout = null;
document.addEventListener("DOMSubtreeModified", function() {
    if(timeout) {
        clearTimeout(timeout);
    }
    timeout = setTimeout(listener, 500);
}, false);

Таким образом, он вызовет listener, если в течение 500 мс не было других событий.

5 голосов
/ 08 сентября 2011

Лучший ответ, который я нашел, был немного интересным и включал в себя передачу сообщений между скриптами содержимого и файлом background.html.

Я выложу код, затем объясню:

Background.html

  function updatePageAction(tabId)
  {
    chrome.tabs.sendRequest(tabId, {is_content_script: true}, function(response) {
      if (response.is_content_script)
        chrome.pageAction.show(tabId);
    });
  };

  chrome.tabs.onUpdated.addListener(function(tabId, change, tab) {
    if (change.status == "complete") {
      updatePageAction(tabId);
    }
  });

content_script.js

// The background page is asking us to find an address on the page.
if (window == top) {
  chrome.extension.onRequest.addListener(function(req, sender, sendResponse) {
        if (req.is_content_script)
            start_content_script();
            sendResponse({is_content_script: true});
  });
};

Вы хотите решить обновление или повторное выполнение скрипта при изменениях DOM. К счастью, изменения DOM включали изменение URL (хотя это были изменения AJAX DOM для обновления страницы). Изменение URL, однако, вызывает событие onUpdated. Однако каждая вкладка запускает эти «события», и мы хотим убедиться, что мы заботимся только о той, в которой мы также сопоставили наши скрипты содержимого (вы можете указать соответствие в манифесте!).

Передав сообщение на скрипт content_script, выполняемый на текущей вкладке, мы спрашиваем: «Вы сценарий моего контента? Если да, пожалуйста, перезапустите».

...