Почему не документирует.addEventListener ('load', function) работает в скрипте greasemonkey?

это не дает ошибки, и я поставил console.log('loaded userscript wifi-autologin') на console.log работает, но предполагаемый эффект документа.addEventListener не происходит. Сделав еще немного отладки, заставив его напечатать, что addEventListener был вызван, я обнаружил, что он не вызывается.

исходный код скрипта:

// ==UserScript==
// @name        wifi-autologin
// @namespace   lf-ns
// @description Hopefully autologins to a captive portal
// @include     *://1.1.1.1/*
// @version     1
// @run-at document-end
// ==/UserScript==

document.addEventListener('load', submitAction);

3 ответов


видимо, document.addEventListener() ненадежно, и, следовательно, моя ошибка. Использовать window.addEventListener() с теми же параметрами, вместо.


проблема , когда событие добавляется и выполнена через триггерные (the document onload изменение свойств можно проверить, изучив список свойств).

когда это выполняется и изменяется onload относительно onload событие триггера:

document.addEventListener('load', ... );

до, во время или после загрузки и/или рендеринга HTML страницы?
Это простой scURIple (вырезать & вставить в URL) "работает" без alerting, как наивно ожидалось:

data:text/html;charset=utf-8,
    <html content editable><head>
          <script>
                document.addEventListener('load', function(){ alert(42) } );
          </script>
          </head><body>goodbye universe - hello muiltiverse</body>
    </html>

означает ли загрузка, что содержимое скрипта было выполнено?

немного из этого расширения мира ...
Рассмотрим небольшое изменение:

data:text/html;charset=utf-8,
    <html content editable><head>
          <script>
              if(confirm("expand mind?"))document.addEventListener('load', function(){ alert(42) } );
          </script>
        </head><body>goodbye universe - hello muiltiverse</body>
    </html>

и был ли HTML загружен или нет.

рендеринг, безусловно, ожидает с goodbye universe - hello muiltiverse не видно на экране, но, не confirm( ... ) должны быть уже загружено для выполнения? ... и так document.addEventListener('load', ... ) ... ?

другими словами, можете ли вы выполнить код для проверки самозагрузки, когда сам код еще не загружен?

или, другой способ взглянуть на ситуацию, если код является исполняемым и выполняется, то он имеет уже был загружен как сделанная сделка и ретроактивно проверить, когда произошел переход между еще не загружен и загружен a priori fait accompli.

так что сначала: загрузка и выполнение кода или использование функциональности кода, хотя и не загружены?

onload как window свойство работает, потому что оно подчинено объекту, а не самореферентно, как в document случае, т. е.. это С помощью document, которые определяют загруженный вопрос err ситуации.

PS.: Когда следующее не удается alert(...)? (лично испытал попался х):

предостережение: если загрузка не будет такой же окно очень быстро ... избиение-это порядок дня
Итак, что действительно нужно ниже при использовании одноименного окна:

window.open(URIstr1,"w") .
   addEventListener('load', 
      function(){ alert(42); 
         window.open(URIstr2,"w") .
            addEventListener('load', 
               function(){ alert(43); 
                  window.open(URIstr3,"w") .
                     addEventListener('load', 
                        function(){ alert(44); 
                 /*  ...  */
                        } )
               } )
      } ) 

в качестве альтернативы, продолжайте каждый последовательный window.open С:
alert("press Ok either after # alert shows pending load is done or inspired via divine intervention" );

data:text/html;charset=utf-8,
    <html content editable><head><!-- tagging fluff --><script>

        window.open(
            "data:text/plain, has no DOM or" ,"Window"
         ) . addEventListener('load', function(){ alert(42) } )

        window.open(
            "data:text/plain, has no DOM but" ,"Window"
         ) . addEventListener('load', function(){ alert(4) } )

        window.open(
            "data:text/html,<html><body>has DOM and", "Window"
         ) . addEventListener('load', function(){ alert(2) } )

        window.open(
            "data:text/html,<html><body>has DOM and", "noWindow"
         ) . addEventListener('load', function(){ alert(1) } )

        /* etc. including where body has onload=... in each appropriate open */

    </script><!-- terminating fluff --></head></html>

, который подчеркнет onload различия в качестве document или window собственность.

другое предостережение касается сохранения XSS, межсайтовых сценариев и SOP, тех же правил политики происхождения, которые могут позволить загружать URI HTML, но не изменяя его содержимое, чтобы проверить его. Если scURIple запускается как букмарклет/scriplet из того же источника / сайта, то, возможно, успех.

ie. С произвольной страницы эта ссылка будет выполнять загрузку, но вряд ли сделает alert('done'):

    <a href="javascript:window.open('view-source:http://google.ca') . 
                   addEventListener( 'load',  function(){ alert('done') }  )"> src. vu </a>

но если ссылка закладкой, а затем щелкнул при просмотре google.ca страница, это совсем другое.

тестовой среде:

 window.navigator.userAgent = 
   Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (Splashtop-v1.2.17.0)

это произошло еще в прошлом квартале 2017 года . greasemonkey стреляет слишком поздно . после domcontentloaded событие уже было запущено.

что делать:

  • Я @run-at document-start вместо document-end
  • обновлено firefox до 57.

from:https://github.com/greasemonkey/greasemonkey/issues/2769

даже как (частный) сценарист Я смущен, почему мой сценарий не работает.

наиболее вероятная проблема заключается в том, что событие DOMContentLoaded запускается до запуска сценария. Теперь, прежде чем вы вернетесь и скажете, что @run-at document-start установлен, эта директива не полностью поддерживается на данный момент. Из-за очень асинхронного характера WebExtensions мало гарантии, когда что-то будет выполнено. Когда ff59 катится, у нас будет #2663, который поможет. Это действительно поможет многим вещам, отладка тоже.