Ответ 1
По-видимому, document.addEventListener()
ненадежна и, следовательно, моя ошибка. Используйте window.addEventListener()
с теми же параметрами.
Это не дает ошибки, и я помещаю 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);
По-видимому, document.addEventListener()
ненадежна и, следовательно, моя ошибка. Используйте window.addEventListener()
с теми же параметрами.
Проблема КОГДА добавлено событие и ВЫПОЛНЕНО с помощью запуска
(модификация свойства 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)
GlobalEventHandlers.onload
в качестве обработчика событий.Я думаю, что это то, что должно работать, но я получаю такое же поведение, как @Yet Another User, поэтому событие load
на document
никогда не запускается.
Я думаю, что мы чего-то не замечаем. @Yet Другой пользователь, вы сказали, что делать это на документе не является надежным. Как вы пришли к такому выводу?