この問題を解決するために、IE には onmouseenter と onmouseleave があります。
ffにそれがないのは残念です。改めて思ったのですが、なぜこのような優れた関数が ff で引用されないのでしょうか?
ie には onpropertychange もありますが、ff には存在しません。 。 。
FF の onmouseenter および onmouseleave と互換性を持たせるために、比較例に js が導入されています。:
var xb =
{
evtHash: [],
ieGetUniqueID: function(_elem)
{
if (_elem === window) { return 'ウィンドウ'; }
else if (_elem === document) { return 'theDocument'; }
else { return _elem.uniqueID; }
},
addEvent: function(_elem, _evtName, _fn, _useCapture)
{
if (typeof _elem.addEventListener != '未定義')
{
if (_evtName == 'mouseenter')
{ _elem.addEventListener('mouseover', xb.mouseEnter(_fn), _useCapture); }
else if (_evtName == 'mouseleave')
{ _elem.addEventListener('mouseout', xb.mouseEnter(_fn), _useCapture); }
else
{ _elem.addEventListener(_evtName, _fn, _useCapture); }
}
else if (typeof _elem.attachEvent != '未定義')
{
var key = '{FNKEY::obj_' xb.ieGetUniqueID(_elem) '::evt_' _evtName '::fn_' _fn '}';
var f = xb.evtHash[キー];
if (typeof f != '未定義')
{ return; }
f = function()
{
_fn.call(_elem);
};
xb.evtHash[キー] = f;
_elem.attachEvent('on' _evtName, f);
// IE のメモリ リークをクリーンアップするためにアンロード イベントをウィンドウにアタッチします
window.attachEvent('onunload', function()
{
_elem.detachEvent('on' _evtName 、f)
});
キー = null;
//f = null; /* これを無効にしないでください。そうしないと、切り離すことができなくなります */
}
else
{ _elem['on' _evtName] = _fn; }
},
removeEvent: function(_elem, _evtName, _fn, _useCapture)
{
if (typeof _elem.removeEventListener != '未定義')
{ _elem.removeEventListener(_evtName, _fn, _useCapture); }
else if (typeof _elem.detachEvent != '未定義')
{
var key = '{FNKEY::obj_' xb.ieGetUniqueID(_elem) '::evt' '::fn_ ' _fn '}';
var f = xb.evtHash[キー];
if (typeof f != 'unknown')
{
_elem.detachEvent('on' _evtName, f);
delete xb.evtHash[キー];
}
key = null;
//f = null; /* これを無効にしないでください。そうしないと、切り離すことができなくなります */
}
},
mouseEnter: function(_pFn)
{
return function(_evt)
{
var relTarget = _evt.popularTarget;
if (this == relTarget || xb.isAChildOf(this, relTarget))
{ return;
_pFn.call(this, _evt);
}
},
isAChildOf: function(_parent, _child)
{
if (_parent == _child) { return false };
while (_child && _child != _parent)
{ _child = _child.parentNode; }
return _child == _parent;
}
};
本篇文章出典 cssrain.cn 翻訳链接:http://www.cssrain.cn/article.asp?id=952