chrome .webNavigation.onHistoryStateUpdated выполняется несколько раз при перенаправлениях - PullRequest
0 голосов
/ 06 февраля 2020

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

Поразительно, что API истории не делает различий между перенаправлениями и кликами по ссылкам, он сообщает о них как о типе link из transitionType.

executeScript по умолчанию выполняется только при верхний фрейм (frameId 0), так что это не проблема. И я также использовал frameId и parentFrameId свойства функции обратного вызова, хотя я знал, что это не решит проблему, потому что, как я уже сказал, при нажатии на ссылки, скрипт выполняется только один раз, но когда браузер перенаправляет его, он выполняется дважды.

BackgroundScript:

chrome.webNavigation.onHistoryStateUpdated.addListener(function(obj){
    if (obj.frameId === 0 && obj.parentFrameId === -1){
        chrome.tabs.executeScript({
            file: 'js/contentScript.js',
            runAt: 'document_end'
        });
        console.log(obj.transitionType);
    }
});

ContentScript:

console.log("executed!");

1 Ответ

1 голос
/ 06 февраля 2020
Событие

onHistoryStateUpdated запускается не только при действиях браузера назад / вперед, но и когда сценарии сайта используют методы window.history, поэтому это может произойти даже 1000 раз за навигацию, если страница вызывает API много раз, нет limit.

Если проблема заключается в многократном выполнении скрипта, вы можете просто отправить сообщение первым и ввести его, только если ответ не получен. Или используйте глобальную переменную в сценарии содержимого, см. , как избежать многократного динамического внедрения одного и того же сценария при использовании chrome .tabs.executeScript .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...