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
,依赖关系现在消失了。