由于某种原因,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无法附加处理程序?
答案 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
将事件附加到根文档上,但将按预期工作。