为什么jQuery无法将鼠标悬停处理程序附加到Flash对象?

时间:2011-08-12 15:42:17

标签: javascript jquery dom

由于某种原因,jQuery(1.6.2)无法将鼠标悬停处理程序附加到Flash对象。

有趣的是,getElementById().onmouseover = ...按预期工作。

// fail
$('#content-banner').mouseover(function () {alert(1)});
// success
document.getElementById("content-banner").onmouseover = function (evt) { alert(3); };

有关详细信息,请参阅live example at jsFiddle

什么阻止jQuery附加处理程序?


更新

快速解决方法是按ShankarSangoli的建议使用live()。但问题仍然存在。 为什么jQuery无法附加处理程序?

2 个答案:

答案 0 :(得分:14)

jQuery不支持data()<applet><embed>上的<object>。由于jQuery的事件处理程序堆栈依赖data()来工作,因此在对象上调用mouseover()会失败。

所以,只要你不使用jQuery的事件处理,你就可以了:

var banner = $('#content-banner');
banner.live ( 'mouseover', ... ); // works, becuse live hooks to document not to banner
banner[0].onmouseover = ... ; // works
banner[0].addEventListener('mouseover', ... , false); // also works

如果深入研究代码,可以看到classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'的对象存在异常,即Flash,但classid仅适用于IE。因此,简短的回答是避免在对象上使用jQuery事件。

答案 1 :(得分:5)

使用jQuery live由于在加载页面后初始化flash,因此无法找到该元素。工作demo


<强>更新

重申Sheepy's answer:jQuery维护dom元素的data中的事件处理程序,但由于它不支持data(),因此事件永远不会附加。另一种方法是使用live将事件附加到根文档上,但将按预期工作。