问题是何时通过触发添加和 执行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
差异作为一个document
或window
属性。
另一个警告涉及保留 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)