Ошибка Chrome — запуск onDOMContentLoaded до загрузки любого DOM

#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 , нет ли «дополнительных» событий, которые вы видите.