Подтвердить что ты не робот

Эмуляция модели захвата события W3C в IE

Можно ли эмулировать захват событий в 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();
}, true);

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

Я нашел метод setCapture, но он не похож на модель захвата W3.

4b9b3361

Ответ 1

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

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

  • Напишите оболочку для addEvent с параметром захвата
  • Если требуется захват, выполните следующие

    • Зарегистрируйте простое событие bubbling с функцией, которая
    • Идет полностью вверх по родительской цепочке, сохраняет все элементы в Array
    • Отправляет назад этот Array вызов исходного обработчика событий для каждого из элементов

Ответ 2

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

Ответ 3

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

и он используется для реализации какого-либо типа drag & drop

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

if (document.addEventListener) document.addEventListener("click", function(e){e.preventDefault();},false);
else if (document.attachEvent) document.attachEvent("onclick", function(){window.event.returnValue = false;});