Как запустить личное событие в Javascript - PullRequest
10 голосов
/ 08 января 2010

Я не могу запускать личные события, используя Javascript в IE. В Firefox отлично работает.

Мой код:

var evento; 
if(document.createEventObject)  
{  
   evento = document.createEventObject();  
   document.fireEvent('eventoPersonal', evento);     
}  
//FF  
else  
{  
    evento = document.createEvent('Events');  
    evento.initEvent('eventoPersonal',true,false);  
    document.dispatchEvent(evento);  
}

Но при попытке выполнить document.fireEvent('eventoPersonal', evento); в IE это не работает. Как я могу запустить НЕТ пользовательских событий в IE?

В Internet Explorer я получаю сообщение об ошибке: «Неверные аргументы» в строке выполнения document.fireEvent('eventoPersonal', evento);

Ответы [ 6 ]

39 голосов
/ 09 июля 2010

Дин Эдвардс описывает, как запускать врезные события в IE.

http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/

Это в нижней части статьи

var currentHandler;

if (document.addEventListener) {

  // We've seen this code already

} else if (document.attachEvent) { // MSIE

  document.documentElement.fakeEvents = 0; // an expando property

  document.documentElement.attachEvent("onpropertychange", function(event) {
    if (event.propertyName == "fakeEvents") {
      // execute the callback
      currentHandler();
    }
  });

  dispatchFakeEvent = function(handler) {
    // fire the propertychange event
    document.documentElement.fakeEvents++;
  };
}
2 голосов
/ 09 июля 2010

Я думаю, что ответ - в IE вы не можете запускать события, которых нет в этом списке:

MSDN - События DHTML

Из того, что я могу собрать, фреймворки хранят реестр "пользовательских" имен событий, и вы должны использовать их специфичные для реализации триггеры и для обработки функций для пользовательских событий. Например, прототип использует событие ondatavailable для прохождения своих пользовательских событий за кулисами.

1 голос
/ 18 февраля 2014

В IE11 document.dispatchEvent по-прежнему не работает, но теперь attachEvent также отсутствует, поэтому другое решение также не будет работать. Впрочем, я придумал еще более уродливый. :) Это включает в себя замену метода addEventListener и продолжается так:

var oldEventListener = document.addEventListener;

document.addEventListener = function (event, func, capture) {
    if (event == "MyPreciousCustomEvent") {
        document.MyPreciousCustomEvent = func;
    }

    oldEventListener.call(document, event, func, capture);
};

...

$(function () {
    try {
        document.MyPreciousCustomEvent("MyPreciousCustomEvent", {});
    } catch (e) {}
});

Надеюсь, это кому-нибудь поможет.

1 голос
/ 08 января 2010

Вы можете рассмотреть возможность использования библиотеки для абстрагирования. Оба прототипа JQuery будет обрабатывать это для вас. Jquery особенно хорош в том, что позволяет создавать события с очень простым кодом.

Документация Jquery доступна здесь: http://docs.jquery.com/Events

0 голосов
/ 16 января 2013

Да, ссылаясь на @Don Albrecht, вы можете использовать метод jquery trigger () подробнее на http://api.jquery.com/trigger/

0 голосов
/ 08 января 2010

Когда я читаю соответствующую страницу статьи MSDN о методе createEventObject, кажется, что он не используется для создания настраиваемого события - он используется для создания настраиваемых объектов, которые можно передать уже существующим событиям.

Описание : Создает объект event для передачи контекстной информации о событии при использовании метода fireEvent .

http://msdn.microsoft.com/en-us/library/ms536390%28VS.85%29.aspx

Обновление : вы получаете сообщение об ошибке «Недопустимые аргументы», поскольку EventoPersonal не является допустимым событием для запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...