65

它没有给出错误,我放了一个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);
4

5 回答 5

109

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

于 2013-05-06T20:16:16.943 回答
8

为了在页面加载时获取下拉框的值,我使用

document.addEventListener('DOMContentLoaded',fnName);

希望这对某人有所帮助。

于 2019-05-31T12:38:29.147 回答
8

问题是何时通过触发添加 执行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>

加载是否意味着脚本内容已被执行?

有点超出这个世界的扩展......
考虑一个轻微的修改:

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的内容 via 。document

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差异作为一个documentwindow属性。

另一个警告涉及保留 XSS、跨站点脚本和 SOP、同源策略规则,这些规则可能允许加载 HTML URI 但不修改其内容以检查是否相同。如果 scURIple 作为来自同一来源/站点的书签/脚本运行,那么可能会成功。

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)
于 2016-03-25T19:43:18.637 回答
4

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

当文档完成加载时在窗口触发;当资源完成加载时,在包含资源(例如 img、embed)的元素上触发

load事件不会在对象上触发。document

信用: 为什么 document.addEventListener('load', handler) 不起作用?

于 2020-11-17T23:10:37.987 回答
0

这种情况在 2017 年最后一个季度再次发生。油脂猴开火太晚了。在 domcontentloaded 事件已经被触发之后。

该怎么办:

  • 我用@run-at document-start 而不是文档端
  • 火狐更新到 57。

来自:https ://github.com/greasemonkey/greasemonkey/issues/2769

即使作为(私人)脚本作家,我也很困惑为什么我的脚本不起作用。

最可能的问题是在脚本运行之前触发了“DOMContentLoaded”事件。现在,在您返回并说已设置 @run-at document-start 之前,该指令目前尚不完全支持。由于 WebExtensions 非常异步的性质,几乎无法保证何时执行某些操作。当 FF59 推出时,我们将拥有 #2663,这将有所帮助。它实际上会帮助很多事情,也可以调试。

于 2018-01-08T08:27:08.287 回答