Слушатель событий получает нулевую информацию, если выполняется после загрузки документа - PullRequest
0 голосов
/ 22 декабря 2018

Я работал над расширением для Chrome.

Чтобы работать, он должен передать глобальную переменную окна, установленную веб-сайтом, в основной скрипт расширения с помощью CustomEvent.
Обычно этоотлично работает, когда страница загружается в активную вкладку, но всякий раз, когда она загружается как не сфокусированная вкладка, или когда выполнение сценария расширения задерживается иным образом, объект события, полученный слушателем, имеет атрибут детализации null.

Для ясности, весь объект детализации события null, а не только необходимая переменная.Я сделал обходной путь для этого, прикрепив необходимую переменную к документу в виде строки JSON, но я хотел бы понять, что не так с событием.

Ниже приведены соответствующие части кода.

manifest.json:

"content_scripts": [ {
          "js": [ "main.js", "jquery-3.3.1.js"],
          "matches": [ "*://*.site.com/*"],
          "run_at": "document_end"
       } ],
"permissions": [ "declarativeContent", "activeTab", "storage", "*://*.site.com/*" ],
"web_accessible_resources": [ "injectedScript.js" ]

main.js:

$(function() {

        document.addEventListener('globalPasser', function(response) {
            if(response.detail){
                // store variables
            }

        }, true);

        var passGlobals = document.createElement('script');
        passGlobals.src = chrome.extension.getURL('injectedScript.js');
        (document.head||document.documentElement).appendChild(passGlobals);
        passGlobals.onload = function() {
            passGlobals.remove();
        };
    }

injectedScript.js:

var newEvent = new CustomEvent('globalPasser', {detail:{variable: neededGlobalVariable}});
document.dispatchEvent(newEvent);

1 Ответ

0 голосов
/ 24 декабря 2018

Обходной путь / исправление состоит в том, чтобы просто «дезинфицировать» данные с помощью JSON:

document.dispatchEvent(
  new CustomEvent('globalPasser',
    JSON.parse(JSON.stringify({
      detail: {
        variable: neededGlobalVariable
      }
    }))
  )
);

Проблема в этом случае вызвана наличием функций JS внутри данных - иногда - возможно, когда сайт все еще работаетобрабатывает что-то.Узлы DOM вызвали бы ту же проблему.

Намеренно или нет, но Chrome прерывает сериализацию всего объекта detail и передает его как null, поскольку https://crbug.com/85158, и это поведение странным образом отличается от обмена сообщениями расширения, который пропускает такие несериализуемые вещи: {foo: functionRef, bar: 123} передается как {bar: 123}.

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