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

Sau*_*aul 5 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); };
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅jsFiddle上的实例.

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


更新

根据ShankarSangoli的live()建议,可以快速解决问题.但问题仍然存在.为什么jQuery无法附加处理程序?

She*_*epy 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
Run Code Online (Sandbox Code Playgroud)

如果您深入研究代码,您会发现对象有一个异常classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',即Flash,但classid仅适用于IE.因此,简短的回答是避免在对象上使用jQuery事件.


Sha*_*oli 5

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


更新

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