Подтвердить что ты не робот

Почему document.addEventListener('load', function) не работает в greasemonkey script?

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

Источник script:

// ==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);
4b9b3361

Ответ 1

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

Ответ 2

Проблема КОГДА добавлено событие и ВЫПОЛНЕНО с помощью запуска (модификация свойства document onload может быть проверена путем изучения списка свойств).

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

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

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

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>

Выполняется ли загрузка содержимого script?

Немного из этого мирового расширения...
Рассмотрим небольшую модификацию:

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', ... )...?

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

Или, еще один способ взглянуть на ситуацию, если код исполняемый и выполненный, он имеет УЖЕ, который был загружен как выполненная сделка и ретроактивно проверяет, произошел переход между еще не загруженным и загруженный является априорным свершившимся фактом.

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

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

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

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

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, Cross Site Scripting и SOP, Same Origin Policy, которые могут позволить загружать URI HTML, но не изменять его содержимое, чтобы проверить его. Если scURIple запускается как букмарклет/скрипт из того же самого источника/сайта, то возможно успех.

т. С произвольной страницы эта ссылка будет выполнять загрузку, но вряд ли сделает 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)

Ответ 3

Я думаю, что это то, что должно работать, но я получаю такое же поведение, как @Yet Another User, поэтому событие load на document никогда не запускается.

Я думаю, что мы чего-то не замечаем. @Yet Другой пользователь, вы сказали, что делать это на документе не является надежным. Как вы пришли к такому выводу?