为什么 document.addEventListener (‘ load’,function)不能在 greasemonkey 脚本中工作?

它没有给出错误,并且我放入了一个 console.log('loaded userscript wifi-autologin'),这样 console.log就可以工作了,但是 document.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);
192526 次浏览

显然,document.addEventListener()是不可靠的,因此,我的错误。使用具有相同参数的 window.addEventListener(),而不是。

问题是 事件是通过触发添加 处决 (可以通过检查属性列表来验证 document onload属性修改)。

什么时候相对于 onload事件触发器执行和修改 onload:

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

在加载和/或呈现页面的 HTML 之前、期间或之后?
这个简单的 scURIple (剪切并粘贴到 URL)“工作”如同天真的预期一样:

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

换句话说,当代码本身尚未加载时,是否可以执行代码来检查自加载?

或者,从另一个角度来看,如果代码是可执行的并且已经执行,那么它已经作为一个已完成的交易加载了 < em > ALREADY ,并且回溯性地检查在尚未加载和加载之间发生的转换是 既成事实

那么,先加载并执行代码还是使用未加载的代码的功能呢?

onload作为 window属性可以工作,因为它从属于对象,而不像 document那样是自引用的,即。是 window的内容,通过 document,决定了加载问题的错误情况。

附注: 什么时候 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作为 documentwindow属性的差异。

另一个警告是保留 XSS、跨网站脚本和 SOP,相同的起源策略规则,这些规则允许加载 HTML URI,但不能修改其内容以检查是否相同。如果 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)

这种情况在2017年最后一个季度再次发生。油猴子开火太晚了。在 domcontent 加载事件已经被激发之后。

怎么做:

  • 我用 @run-at document-start代替文档结尾
  • 把火狐更新到57。

发信人: https://github.com/greasemonkey/greasemonkey/issues/2769

即使作为一个(私人)脚本编写者,我也很困惑为什么我的脚本不能工作。

最有可能的问题是在运行脚本之前触发了“ DOMContentLoaded”事件。现在,在您返回并说@run-at document-start 已设置之前,该指令目前还不完全受支持。由于 WebExtended 的非同步特性,几乎不能保证什么时候执行某些东西。当 FF59滚动,我们将有 # 2663,这将有所帮助。它实际上会帮助很多事情,调试也是。

为了得到页面加载时下拉框的值,我使用

document.addEventListener('DOMContentLoaded',fnName);

希望这对某人有帮助。

根据 HTML 生活标准规范,load事件是

当文档完成加载时,在 Window 激发; 当包含资源的元素(例如 img,embed)的资源完成加载时,激发

load事件是 document对象上的 不是解雇

Credit: < a href = “ https://course.wicg.io/t/Why-does-document-addeventlisten-load-handler-not-work/1194/2”rel = “ noReferrer”> 为什么 document.addEventListener (‘ load’,handler)不工作?

对于像我这样的菜鸟来说,排名第一的答案是不正确的。 document.addEventListener()不是完美的,但它是可靠的。

简单的答案是 document.addEventListener('load', function)不起作用是因为 load事件在 窗户上触发,而不是在 文件上触发。

请参阅此处的文档 -https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event

window.addEventListener('load', runsWhenReady); //✅ load fires on the window and works.


document.addEventListener('DOMContentLoaded', runsWhenReady); //✅ domcontent fires on the document and works


document.addEventListener('load', runsWhenReady); //🚫 this WILL NOT work. load doesn't fire on the document.