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

时间:2013-05-06 17:56:35

标签: javascript greasemonkey addeventlistener

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

5 个答案:

答案 0 :(得分:74)

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

答案 1 :(得分:5)

问题是 WHEN 通过触发添加 EXECUTED 事件 (可以通过检查属性列表来验证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', ... ) ......?

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

或者,另一种查看情况的方式,如果代码是可执行的并且已执行,则 ALREADY 已作为已完成交易加载并追溯检查何时在尚未加载和加载之间发生的转换是先验既成事实

首先是:加载并执行代码或使用代码的功能虽然没有加载?

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

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

即。从任意页面,此链接将执行加载,但不太可能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)

答案 2 :(得分:0)

这种情况在2017年第四季度再次发生。发射太晚了。在domcontentloaded事件已被解雇之后。

该怎么做:

  • 我使用@run-at document-start代替了document-end
  • 将firefox更新为57。

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

  

即使作为(私人)脚本编写者,我也很困惑为什么我的脚本无效。

     

最可能的问题是在运行脚本之前触发了'DOMContentLoaded'事件。现在,在你回来说@ run-at document-start设置之前,目前还没有完全支持该指令。由于WebExtensions非常异步,因此无法确定何时执行某些操作。当FF59滚动时,我们将有#2663这将有所帮助。它实际上可以帮助很多事情,也可以进行调试。

答案 3 :(得分:0)

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

document.addEventListener('DOMContentLoaded',fnName);

希望这对某些人有帮助。

答案 4 :(得分:0)

根据HTML living standard规范,load事件为

文档加载完成后,在窗口处触发;资源加载完成后,对包含资源(例如img,嵌入)的元素触发

即在load对象上未触发事件。

信用: Why does document.addEventListener(‘load’, handler) not work?