2013-10-09 2 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

Uncaught TypeError: Object [объект глобальный] не имеет никакого метода «attachEvent»

На следующей строке:

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

Прикрепление отладчик, target является объект окна, который, как и следовало ожидать, не имеет метод attachEvent() в Chrome.

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); 
    } 

Является ли это ошибка в сценарии Microsoft Ajax? Хром? Или это вызвано некоторым условием на странице?

В любом случае, как я могу его решить?

+0

Что такое 'document.attachEvent'? (в консоли) – SLaks

+0

Ну, у Chrome нет 'attachEvent', это метод IE. Поэтому возникает вопрос: почему '!! document.attachEvent', похоже, оценивается как« истинный »? –

+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(), и в этом случае вам нужно будет найти альтернативное решение.

Смежные вопросы