Почему не документирует.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) "работает" без alert
ing, как наивно ожидалось:
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, который поможет. Это действительно поможет многим вещам, отладка тоже.