Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “如何开火”;“满负荷”;IE中的文档事件_Javascript_Unit Testing_Internet Explorer_Events_Document - Fatal编程技术网

Javascript “如何开火”;“满负荷”;IE中的文档事件

Javascript “如何开火”;“满负荷”;IE中的文档事件,javascript,unit-testing,internet-explorer,events,document,Javascript,Unit Testing,Internet Explorer,Events,Document,我目前正在为检测文档就绪性的Javascript方法开发单元测试。这段代码已经是框架级的,所以请避免提及jQuery或其他库中已经实现了这段代码 我已使用以下代码成功模拟了“readystatechange”更改事件: var event; event = document.createEventObject(); event.type = 'readystatechange'; document.fireEvent('onreadystatechange',event); 我未能对“加载”事

我目前正在为检测文档就绪性的Javascript方法开发单元测试。这段代码已经是框架级的,所以请避免提及jQuery或其他库中已经实现了这段代码

我已使用以下代码成功模拟了“readystatechange”更改事件:

var event;
event = document.createEventObject();
event.type = 'readystatechange';
document.fireEvent('onreadystatechange',event);
我未能对“加载”事件执行相同的操作。以下代码导致IE7中的无效参数错误,该错误由最后一行的fireEvent调用引发:

event = document.createEventObject();
event.type = 'load';
document.fireEvent('onload',event);
以前有没有人做过,或者没有做过?我还对以不同方式启动该活动的任何建议感兴趣

编辑:根据Crescent Fresh的建议,我将代码更改为:

event = document.createEventObject();
event.type = 'load';
document.body.fireEvent('onload',event);
不再有错误,但“onload”的侦听器不会启动。下面是我如何配置它的:

document.attachEvent('onload',listener);

加载事件将在文档(包括图像等外部资源)已完全加载时触发,而不是之前

您尝试触发
readystatechange
的结果是什么?
readyState
值是否确实发生了变化?无论是否,这也没有多大用处:要么使用未更改的
readyState
触发事件,要么使用未有效反映文档状态的
readyState
触发事件。

根据,对于
文档
,没有
onload
事件

您需要
window.onload
document.body.onload
。这些在IE中是相同的:由于历史原因,
实际上设置了
window.onload
,因此MS决定将
document.body.onload
作为
window.onload
的别名


正如Eric在评论中提到的那样,这样做的问题是,似乎没有办法手动触发窗口事件,这意味着Eric的问题可能没有解决方案。

出于某种原因,似乎IE在加载DOM后用空对象覆盖了
窗口的
onload
属性。当您试图从DOM元素的任何事件处理程序中访问它时,至少是这样

<!DOCTYPE html>
<html>
  <head>
    <title>Test by Josh</title>
    <script type="text/javascript">
      window.onload = function() {
        alert("Test");
      }
      alert(typeof window.onload);
    </script>
  </head>
  <body>
    <h1 onclick="alert(typeof window.onload);">Test</h1>
  </body>
</html>

我现在想不出任何其他方法来解决这个问题。

加载
事件实际上在
document.body
上触发。因此您可以改为尝试
document.body.firevent('onload',event)
。不过,我怀疑它是否真的会触发连接到
onload
的句柄。如果是的话,我会很震惊……你是100%正确的。触发document.body上的事件不会出错,但不会触发与document.attachEvent关联的侦听器。@Eric:我也这么想。这是一个令人不快的人。@Eric您可能还应该附加到
文档.body.attachEvent()
而不仅仅是
文档.attachEvent()
@gnarf:no<代码>@NickFitz谢谢你的回答。我没有试图更改document.readyState的值,它在测试之前(因为我需要等待readyState变为“完成”)和测试之后保持“完成”。请记住,这段代码是为单元测试编写的。@NickFitz:Eric只是试图为本地单元测试模拟真实世界的
load
事件。如果它是为单元测试编写的,那么您根本不需要触发任何事件。只需创建一个具有已知值的模拟事件对象并直接调用事件处理程序,然后检查它是否为这些值生成了正确的结果。否则这不是单元测试,这是一个集成测试:您正在测试代码是如何与浏览器的内部事件处理机制集成的。@NickFitz,除了我没有对事件处理程序进行单元测试:)我正在为一个方法编写单元测试,该方法替换并过滤窗口和文档上的addEventListener和attachEvent。@Christoph:很好,Crescent Fresh已经提到:我应该在document.body上触发事件。关于window.onload的评论很有趣,但没有太大帮助,因为window没有fireEvent方法。@Christoph感谢您编辑您的答案。我接受它作为这个有趣讨论的结论。@Josh Stodola有趣。。。我今天发现document.attachEvent不是IE中的函数:当然可以调用它,但是(typeof document.attachEvent)返回“object”,document.attachEvent.call和document.attachEvent.apply都未定义。。。这个浏览器永远不会停下来给我惊喜。
<!DOCTYPE html>
<html>
  <head>
    <title>Test by Josh</title>
    <script type="text/javascript">
      window.onload = function() {
        alert("Test");
      }         
    </script>
  </head>
  <body>
    <h1 onclick="window.onloadfix()">Test</h1>
    <!-- Could potentially be injected via server-side include if needed -->
    <script type="text/javascript">
      window.onloadfix = function() {
        window.onload();
      }
    </script>
  </body>
</html>