#javascript #google-chrome #google-chrome-extension
#javascript #google-chrome #google-chrome-расширение
Вопрос:
Я настроил прослушиватель событий в моем background.js файл:
chrome.webNavigation.onDOMContentLoaded.addListener(function (info) {
// Checks for the URL bar navigation and not any child frames
if (info.frameId === 0){
var url = info.url;
console.log('visit: ' url);
}
});
Я бы ожидал, что запись в журнале a покажет URL текущей страницы при загрузке dom. Проблема возникает при вводе поиска в омнибоксе. Допустим, я посещаю www.twitter.com достаточно часто, чтобы он кэшировался, когда я ввожу поиск, начинающийся с «t» в сводном окне.
Если я введу поисковый запрос «testing123» в сводном окне, я увижу запись в журнале, в которой говорится «посещение:http://www.twitter.com /«. То же самое произойдет, если я введу поисковый запрос «обратные вызовы»: я увижу запись в журнале с надписью «visit:http://www.cnn.com «Они регистрируются даже до того, как я нажимаю enter при поиске. Я предполагаю, что это связано с тем, что Chrome выполняет какую-то предварительную выборку для часто посещаемых URL-адресов, но я все еще думаю, что это неожиданное поведение.
Кто-нибудь может подтвердить? Спасибо.
Редактировать: Я пробовал некоторые другие методы вебнавигации, но я все еще вижу некоторые несоответствия:
onComitted
— Срабатывает почти все время.
onHistoryStateUpdated
— Некоторое время срабатывал
onTabReplaced
— Не запускался, поскольку предварительная визуализация не выполнялась.
Редактировать 2: Следующий код помог мне разобраться в событиях, которые запускались на неактивных вкладках. (Дополнительные пояснения см. в комментариях 5/6.)
chrome.webNavigation.onCommitted.addListener(
function (info) {
// Checks for the URL bar navigation and not any child frames
if (info.frameId === 0){
chrome.tabs.query({active: true, currentWindow: true}, function (tab) {
// Ensures that the listener is only attached to the active tab
if (tab[0].id === info.tabId){
// Everything's good! Do your work here
}
});
}
}
);
Комментарии:
1. Может быть предварительная отрисовка. Что, если добавить
chrome.webNavigation.onTabReplaced
прослушиватель событий? Я предполагаю, что вы увидите, что события onDOMContentLoaded соответствуют последним событиям.2. Итак, вы предлагаете обернуть прослушиватель onDomContentLoaded в onTabReplaced? Я понимаю, что событие onTabReplaced следует запускать реже, но мне все равно понадобятся URL, frameId и т.д. Информация из события onDOMContentLoaded.
3. Нет, я предлагаю использовать это событие, чтобы выяснить, действительно ли проблема вызвана предварительным рендерингом. И, возможно, игнорировать событие, если происходит событие onTabReplaced.
4. Я предполагаю, что это не предварительный рендеринг. Событие onTabReplaced никогда не запускается в моем том же варианте использования, что и выше. Может ли это быть ошибкой, о которой стоит сообщить?
5.
onTabReplaced
сработает только в том случае, если вы действительно открыли URL и он был предварительно отрисован, если я правильно понимаю. Вы должны проверитьinfo.tabId
, нет ли «дополнительных» событий, которые вы видите.