2013-10-09 42 views
0

我有一個WebForms的頁面,其包括MicrosoftAjax.debug.js(4.1.7.123),其爲腳本資源:對象[對象全球]無方法「的attachEvent」

// Name:  MicrosoftAjax.debug.js 
// Assembly: AjaxControlToolkit 
// Version:  4.1.7.123 
// FileVersion: 4.1.7.
// (c) 2010 CodePlex Foundation 

在負載該腳本自所調用最終調用這個函數:

var attachEvent = !!document.attachEvent; 

... 

function listenOnce(target, name, ieName, callback, isReadyState, isScript) { 
    function onEvent() { 
     if (!attachEvent || !isReadyState || /loaded|complete/.test(target.readyState)) { 
      if (attachEvent) { 
       target.detachEvent(ieName || ("on" + name), onEvent); 
      } 
      else { 
       target.removeEventListener(name, onEvent, false); 
       if (isScript) { 
        target.removeEventListener("error", onEvent, false); 
       } 
      } 
      callback.apply(target); 
      target = null; 
     } 
    } 
    if (attachEvent) { 
     target.attachEvent(ieName || ("on" + name), onEvent); 
    } 
    else { 
     if (target.addEventListener) { 
     target.addEventListener(name, onEvent, false); 
     } 
     if (isScript) { 
      target.addEventListener("error", onEvent, false); 
     } 
    } 
} 

的問題是,在Chrome中,我發現了以下JavaScript錯誤:

遺漏的類型錯誤:對象[對象全球]有沒有方法「的attachEvent」

在下面一行:

target.attachEvent(ieName || ("on" + name), onEvent); 

附加調試,target是窗口對象,正如你所期望沒有在Chrome中attachEvent()方法。

document.attachEvent()如下功能:

function (sType, fHandler) { 
     var shortTypeName = sType.replace(/on/, ""); 
     fHandler._ieEmuEventHandler = function (e) { 
      window.event = e; 
      return fHandler(); 
     }; 
     this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); 
    } 

這是微軟的Ajax腳本錯誤?鉻?或者是由頁面上的某些條件引起的?

無論哪種方式,我該如何解決它?

+0

什麼是'document.attachEvent'? (在控制檯中) – SLaks

+0

那麼,Chrome沒有'attachEvent',這是一個IE方法。所以問題是,爲什麼'!! document.attachEvent'似乎評估爲'true'? –

+0

我已經更新了關於document.attachEvent的問題 –

回答

1

你不應該重新分配document.attachEvent開始,所以你可能想擺脫這一點。因爲這個,attachEvent是真的。這並不意味着target.attachEvent存在,但。看起來你應該檢查if (!!target.attachEvent)之前撥打target,而不是隻看你的attachEvent變量。

+0

您正確地重新分配了document.attachEvent。但是,代碼是AjaxControlToolkit中的腳本資源。我可以更新Codeplex上的源代碼,但我會暫時刪除違規的庫進行重新分配。 –

0

我會離開這個問題,以防其他人遇到同樣的問題。但是,錯誤是由遺留的Javascript庫重新分配document.attachEvent()方法引起的。

這是有問題的代碼:

function emulateAttachEvent() { 
    HTMLDocument.prototype.attachEvent = 
    HTMLElement.prototype.attachEvent = function (sType, fHandler) { 
     var shortTypeName = sType.replace(/on/, ""); 
     fHandler._ieEmuEventHandler = function (e) { 
      window.event = e; 
      return fHandler(); 
     }; 
     this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); 
    }; 
    HTMLDocument.prototype.detachEvent = 
    HTMLElement.prototype.detachEvent = function (sType, fHandler) { 
     var shortTypeName = sType.replace(/on/, ""); 
     if (typeof fHandler._ieEmuEventHandler == "function") 
      this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false); 
     else 
      this.removeEventListener(shortTypeName, fHandler, true); 
    }; 
} 

幸運的是,我能夠移除舊庫。然而,如果您有一個真正的案例來重新分配document.attachEvent()方法,這將無濟於事,在這種情況下,您需要提出一種替代解決方案。

相關問題