Javascript WebKitObserver在Safari中不工作?
我需要监视元素的显示状态。我正在使用以下代码Javascript WebKitObserver在Safari中不工作?,javascript,safari,webkit,Javascript,Safari,Webkit,我需要监视元素的显示状态。我正在使用以下代码 if WebKitMutationObserver? observer = new WebKitMutationObserver observerFunc observer.observe el, {attributes:true} else el.addEventListener "DOMAttrModified",(event)-> wrapper.style.display = el.style.d
if WebKitMutationObserver?
observer = new WebKitMutationObserver observerFunc
observer.observe el, {attributes:true}
else
el.addEventListener "DOMAttrModified",(event)->
wrapper.style.display = el.style.display
return
但是,这在Safari中不起作用
此外,在Chrome的开发者工具即时窗口中键入“WebKitMutationObserver”将给出输出
function WebKitMutationObserver() { [native code] }
在Safari(V5.1.7)中,这会给出一个错误消息
“找不到变量:WebKitMutationObserver”
是否Safari不支持WebKitObserver?如果是这样的话,我有没有其他的选择呢?最新的Safari(6.0)确实包括WebKitMutationObserver
。对于较旧的Safari,我们使用了一些代码,当您使用setAttribute
或removeAttribute
更改属性时,这些代码会伪造DOMAttrModified
事件。请注意,如果浏览器本身在内部更改属性,则此操作不起作用
var win = window;
var doc = win.document;
var attrModifiedWorks = false;
var listener = function () { attrModifiedWorks = true; };
doc.documentElement.addEventListener("DOMAttrModified", listener, false);
doc.documentElement.setAttribute("___TEST___", true);
doc.documentElement.removeAttribute("___TEST___", true);
doc.documentElement.removeEventListener("DOMAttrModified", listener, false);
if (!attrModifiedWorks)
{
This.DOMAttrModifiedUnsupported = true;
win.HTMLElement.prototype.__setAttribute = win.HTMLElement.prototype.setAttribute;
win.HTMLElement.prototype.setAttribute = function fixDOMAttrModifiedSetAttr (attrName, newVal)
{
var prevVal = this.getAttribute(attrName);
this.__setAttribute(attrName, newVal);
newVal = this.getAttribute(attrName);
if (newVal != prevVal)
{
var evt = doc.createEvent("MutationEvent");
evt.initMutationEvent
( "DOMAttrModified"
, true
, false
, this
, prevVal || ""
, newVal || ""
, attrName
, (prevVal == null) ? win.MutationEvent.ADDITION : win.MutationEvent.MODIFICATION
);
this.dispatchEvent(evt);
}
}
win.HTMLElement.prototype.__removeAttribute = win.HTMLElement.prototype.removeAttribute;
win.HTMLElement.prototype.removeAttribute = function fixDOMAttrModifiedRemoveAttr (attrName)
{
var prevVal = this.getAttribute(attrName);
this.__removeAttribute(attrName);
var evt = doc.createEvent("MutationEvent");
evt.initMutationEvent("DOMAttrModified", true, false, this, prevVal, "", attrName, win.MutationEvent.REMOVAL);
this.dispatchEvent(evt);
}
}
}
它似乎不在Safari 5.1.7(雪豹)中;对于
窗口,我得到了未定义的。看来Safari真的不支持WebkitMutationObserver或DOMAttrModified。我想知道是否有任何方法可以在不使用window.setInterval的情况下实现相同的行为(对于我在页面上的众多元素来说,这会变得非常难看).谢谢Erik:)我最后更改了功能列表,以避免完全处理这些内容。这取决于jQuery的外观。@jocull:依赖性非常小。我已经删除了对bind
和unbind
的调用,将它们替换为addEventListener
和removeEventListener
,依赖关系现在消失了。