2012-04-13 2 views
2

Я собираюсь найти узкие места событий javascript на данной странице, будь то щелчок, фокусировка текстового поля или что-то в этом роде.Отключить определенное событие для страницы браузера

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

Итак, мне нужен способ, например, отключить ВСЕ специальные вызовы вызовов, которые нужно вызывать. Поэтому мне нужна возможность предотвратить запуск любого события клика. Возможно ли это на любом из этих достойных браузеров (Chrome, FF, Safari, Opera)? Потому что, если бы это предоставило мне способ изолировать тип события и какой обратный вызов события является узким местом.

Прежде, чем кто-нибудь предложит мне использовать вкладку «Сценарий» в инструментах разработчика Chrome для установки контрольных точек прослушивателя событий, я уже выяснил, что щелчок по определенному текстовому полю является проблемой (он вызывает обратные вызовы с 4 щелчками и, по-видимому, там там много делегирования событий), но я бы хотел отключить события click на уровне браузера, чтобы проверить, действительно ли я нахожусь на правильном пути, чтобы точно определить виновника узких мест.

+0

http://www.quirksmode.org/js/events_order.html# link9 это помогает? – Guilherme

ответ

2

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

var events = 'click change focus'.split(' '), // add more as needed 
    eLen = events.length, 
    eI = 0, 
    els = document.getElementsByTagName('*'), 
    len = els.length, 
    i = 0, 
    el; 

for (; i < len; i++) { 
    el = els[i]; 
    for (eI = 0; eI < eLen; eI++) { 
     el['on' + events[eI]] = null; 
    } 
} 
0

Я думаю, что эта ссылка решает вашу проблему:

jQuery: Trap all click events before they happen?

document.addEventListener('click', function(e) { 
    e.stopPropagation(); 
}, true); 

Я думаю, что это путь

+0

Это будет работать, если в очереди не было событий с щелчком мыши, не так ли? В любом случае, я мог бы также удалить те предварительно прикрепленные события щелчка документа, а затем прикрепить обратный вызов выше.Я просто подумал, что может существовать какой-то браузерный способ сделать это. – leandroico

+0

Проверьте ответ в стеке oher с помощью 'true' в методе' addEventListener', вы устанавливаете это событие на фазу захвата, поэтому он будет запускаться первым, даже если это последние строки кода или если вы ' перезаписывать в консоли –

1

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

Практически каждый js lib out переносит обработчик событий в функцию, все, что вам нужно сделать, это добавить немного кода, чтобы пропустить вызов фактического прослушивателя, если установлена ​​какая-либо переменная.

I.e.

var DO_NOT_FIRE = ['click', 'change']; 

И внутри обернутой слушателя:

// I'll just assume Array.prototype.indexOf is present for the sake of clarity 
if(DO_NOT_FIRE.indexOf(eventType) == -1) 
{ 
    originalListener.call(_this, evt); 
} 
0

Я сделал sample on jsfiddler, который делает то, что вам нужно .. Вы можете распространить ее на другие типы событий .. не так элегантно, как Джеймс Бонд , но делает трюк

по существу, я прохожу все элементы, которые имеют события, возложенные на него, и проверить, имеют ли они событие щелчка (проверка только для одного, следовательно, [...].click[0]) и используя функцию unbind

// some elements that I'll bind a click event handler through jquery 
<input type="button" id="btn1" value="click 1" /> 
<input type="button" id="btn2" value="click 2" /> 
<input type="button" id="btn3" value="click 3" />​ 

// bind all buttons to some fake click handler 
var btn_Click = function(e) { 
    alert("clicked button " + $(this).attr("id")); 
}; 

$("input[type='button']").on("click", btn_Click); 

// defining which events to block 
var events_to_block = ['click']; 

// filtering and unbinding the handler for click 

var x = document.getElementsByTagName("*"); 
$(x).each(function() { 
    var x_events = $.data(this, 'events'); 
    if(x_events !== undefined) { 
     if(-1 != events_to_block.indexOf("click")) { 
      if((x_events.click !== undefined) && (x_events.click !== null)) { 
       if($(this).attr("id") !== "btn2") { 
        $(this).unbind("click", x_events.click[0].handler); 
       } 
      } 
     } 
    } 
}); 

PS: Я намеренно кнопку 2-й (btn2) 'разрешено', чтобы сохранить событие только для демонстрации

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