Эмулировать модель захвата событий W3C в IE - PullRequest
15 голосов
/ 03 сентября 2010

Можно ли эмулировать захват событий в Internet Explorer?

Пример:

<a>one</a>
<a>two</a>
<a>three3</a>

<script>
var links = document.getElementsByTagName("A");
for (var i=0; i < links.length; i++) {
  links[i].onclick = function(){
    alert("clicked");
  };
}
</script>

Я хочу предотвратить запуск всех этих событий щелчка.Я могу сделать это с одним наблюдателем событий:

document.addEventListener("click", function(e) {
    e.stopPropagation();
    e.preventDefault();
}, <strong><i>true</i></strong>);

Как я могу сделать то же самое в IE?IE <9 не поддерживает <code>addEventListener.Он поддерживает attachEvent, но у него нет опции useCapture.

Я нашел метод setCapture , но он не выглядит связанным с моделью захвата W3.

Ответы [ 6 ]

5 голосов
/ 26 ноября 2010

Обычно это невозможно из-за порядка событий .В IE события начнут пузыриться с целевого элемента без фазы захвата, поэтому вы не сможете их поймать заранее.

Есть только одна вещь, которую вы можете сделать, и это только возможно, если выуправлять всеми обработчиками событий.

  1. Запись оболочки для addEvent с параметром захвата
  2. Если требуется захват, выполните следующее

    1. Зарегистрируйте простое всплывающее событие с функцией, которая
    2. проходит всю родительскую цепочку, сохраняя все элементы в Array
    3. Путешествие назад это Array, вызывая оригинальный обработчик событий для каждого из элементов
3 голосов
/ 23 сентября 2012

Проект Uniform Event Model из JavaScript Lab, похоже, эмулирует фазу захвата.Перейдите на страницу загрузки библиотеки JSLab DOM Correction , выберите все и выберите формат комментария.Затем загрузите код и найдите в нем слово «захват».Я не проверял библиотеку и не читал большую часть ее кода.

2 голосов
/ 07 октября 2011

setCapture используется для сохранения некоторых действий мыши за пределами окна браузера

и используется для реализации перетаскивания

если вы поместили элемент в конец окна браузера, событие mousemove перестает работать

если вы установите setCapture (), событие mousemove продолжит работать вне окна браузера

https://developer.mozilla.org/en/DOM/element.setCapture

и связанный с ним способ освобождения захвата

https://developer.mozilla.org/en/DOM/document.releaseCapture

так, это не имеет ничего общего с моделью событий захвата и нет никакого известного способа эмулировать его в Internet Explorer стандартным способом!

надеюсь, это поможет!

1 голос
/ 26 января 2011

IE имеет метод Element.setCapture (), который может оказаться полезным. http://msdn.microsoft.com/en-us/library/ms536742(v=vs.85).aspx. Он позволяет вам направить все события мыши на элемент, который вызвал setCapture ()

0 голосов
/ 07 сентября 2015

Лучший способ, если вы используете только всплывающее окно для кликов:

if (document.addEventListener) document.addEventListener("click", function(e){e.preventDefault();},false);
else if (document.attachEvent) document.attachEvent("onclick", function(){window.event.returnValue = false;});
0 голосов
/ 06 сентября 2015
function myFunction(e) {
   if (!e) var e = window.object;//legacy event object
   if (e.preventDefault) e.preventDefault();//prevent firing in W3C model
   return false; //exit event, no firing, listener must registered to anchor tag
}    
var x = document.getElementsByTagName("A");

if (x.item(0).addEventListener) { 
    for (var i = 0, l = x.length; i < l; i++) {
        x.item(i).addEventListener("click",myFunction,false);
    }
}//W3C model
else if (x.item(0).attachEvent) {
    for (var i = 0, l = x.length; i < l; i++) {
        x.item(i).attachEvent("onclick",myFunction);
        }
    }// legacy browsers
...