Javascript IE抛出了一个“;“所需对象”;尝试从其他窗口/帧使用事件对象时出错

Javascript IE抛出了一个“;“所需对象”;尝试从其他窗口/帧使用事件对象时出错,javascript,internet-explorer,iframe,javascript-events,event-handling,Javascript,Internet Explorer,Iframe,Javascript Events,Event Handling,我在正在开发的脚本中发现了一个JavaScript错误。我将其缩减为一对相当简洁的页面,仍然会产生错误: 如果您在Internet Explorer 8(或者可能是6或7)中加载第一个页面,请给它半秒钟的时间运行脚本,然后单击中的“Google”链接,您应该会看到一条错误消息: (您可能需要取消选中工具>Internet选项>高级>“禁用脚本调试(Internet Explorer)”并选中“显示关于每个脚本错误的通知”以下两行以查看错误消息。) 启动调试器会显示一条非常有洞察力的消息

我在正在开发的脚本中发现了一个JavaScript错误。我将其缩减为一对相当简洁的页面,仍然会产生错误:

如果您在Internet Explorer 8(或者可能是6或7)中加载第一个页面,请给它半秒钟的时间运行脚本,然后单击
中的“Google”链接,您应该会看到一条错误消息:

(您可能需要取消选中
工具>Internet选项>高级>“禁用脚本调试(Internet Explorer)”
并选中
“显示关于每个脚本错误的通知”
以下两行以查看错误消息。)

启动调试器会显示一条非常有洞察力的消息“需要对象”:

罪魁祸首是:

target = event_object.target || event_object.srcElement;
我认为这是有效的代码——至少在Firefox中是有效的。我的最佳猜测是,试图从一个帧访问另一个帧的事件对象时存在一个问题,这与为什么不能依赖
instanceof
来检测数组(如果它们是在不同的窗口/帧中创建的)(如果没有意义,请在上搜索“上下文”)

这听起来像是一个有效的理论吗?如果是,我能做些什么来解决这个问题?如果可能,我需要保留相同的通用代码结构/功能:

  • 页面上的
    中有一个链接
  • 中的脚本调用父页面上的函数,该函数使用指定的
    id
    属性将事件处理程序附加到
    中的元素
  • 单击该
    d链接触发事件,该事件调用父页面上的函数,默认情况下传递事件对象
  • 父页面上的函数以跨浏览器兼容的方式从事件对象确定有关已单击元素(代码)的信息
我还想继续使用事件委派,并将所有函数保留在父文档中,只需使用
d文档中的参数调用它们。不过,如果你对其他方法有任何建议,我很乐意听听


提前感谢您的帮助!如果您需要更多关于我的要求或我正在尝试做什么的解释,请告诉我-我希望有一种更好的方式来访问或传递我不知道的事件对象-一种“哦,是的,您只需要像这样做”的解决方案。我希望这不是一厢情愿

容易固定。您需要iframe的
窗口中的事件对象。将iframe的
窗口
对象存储在存储其文档的位置旁边:

var iframe_win = document.getElementsByTagName('iframe')[0].contentWindow;
。。。并更新事件处理程序函数中获取事件对象的行:

event_object = event_object || iframe_win.event;

容易修复。您需要iframe的
窗口中的事件对象。将iframe的
窗口
对象存储在存储其文档的位置旁边:

var iframe_win = document.getElementsByTagName('iframe')[0].contentWindow;
。。。并更新事件处理程序函数中获取事件对象的行:

event_object = event_object || iframe_win.event;


IE对从一个页面迁移到另一个页面的对象非常敏感,这是肯定的。我所知道的最好的解决方案是将对象序列化为JSON,并在页面之间移动一个简单的字符串。然后,收件人页面可以重新创建对象的假版本。但是,在IE8中,第一个页面对我来说很好。谢谢,尖头-当您单击第一个页面上的“Google”链接时,您没有看到JavaScript错误(需要等待大约半秒,脚本才能连接事件处理程序)?你确定你已经将IE设置为显示所有JavaScript错误吗?不,我没有看到任何错误。。。我做网页开发,所以我的IE最好给我显示错误!不过,我现在会再次检查。哇,感谢您提醒我,我的测试床IE实例出现了问题:-)@Tim Down已经发布了实际问题-您将在父窗口中看到
窗口。事件
,当实际的事件对象将出现在框架窗口中时,IE对于从一个页面迁移到另一个页面的对象变得非常松懈,这是肯定的。我所知道的最好的解决方案是将对象序列化为JSON,并在页面之间移动一个简单的字符串。然后,收件人页面可以重新创建对象的假版本。但是,在IE8中,第一个页面对我来说很好。谢谢,尖头-当您单击第一个页面上的“Google”链接时,您没有看到JavaScript错误(需要等待大约半秒,脚本才能连接事件处理程序)?你确定你已经将IE设置为显示所有JavaScript错误吗?不,我没有看到任何错误。。。我做网页开发,所以我的IE最好给我显示错误!不过,我现在会再次检查。哇,感谢您提醒我,我的测试床IE实例出现了问题:-)@Tim Down已经发布了实际问题-您将在父窗口中看到
window.event
,而实际的事件对象将出现在框架窗口中。是的。我没有看到错误,因为我的IE被嘘了,但这就是问题所在。太棒了,谢谢蒂姆!成功了。contentWindow属性是否兼容跨浏览器?
contentWindow
是非标准的,但至少在所有浏览器的最新版本中都受支持。DOM的标准方式是
contentDocument.defaultView
。我决定不提它来让事情复杂化,因为您已经在使用
contentWindow
:)早期的Chrome版本不支持
contentWindow
,所以您应该尽可能使用
contentDocument
。是的。我没有看到错误,因为我的IE被嘘了,但这就是问题所在。太棒了,谢谢蒂姆!成功了。contentWindow属性是否兼容跨浏览器?
contentWindow
是非标准的,但至少在所有浏览器的最新版本中都受支持。DOM的标准方式是
contentDocument.defaultView
。我决定