4

Можно ли определить, есть ли конкретное событие DOM любой обработчик события, связанный с ним (включая обработку событий браузера по умолчанию) - в пределы Greasemonkey кода Фирефокса (EcmaScript 5.1 strict mode)?Обнаружение по умолчанию обработки событий

До сих пор мне удалось отменить обработку события щелчка при выборе текста, но я хотел бы, чтобы отменить обработку моего события во всех следующих ситуациях где нажмите событие инициирует действие по умолчанию:

  • ыбор текст на странице
  • отображается
  • контекстного меню (т.е. правая кнопка мыши)
  • ссылки следует (левая кнопкой мыши на <a>)
  • элементы формы манипулируют (текст получает окно фокус и курсор начнет мигать, выбрана кнопка радио, ...)
  • какой-то другой код JavaScript, который обрабатывает событие (например, Появится всплывающее диалоговое окно справки)

Есть всеобъемлющая все механизм для этого или мне нужно по буквам все ситуации, в моем коде явно?

После кода, как я обнаруживаю, что выбор случился:

var toggleHighlight = function(){ 
    var oldTargt; 
    return function(e){ 
     targt = e.target; 
     sel = window.getSelection(); 
     if (!sel.isCollapsed && sel.containsNode(targt, true)) { 
      return; 
     } 
     ... 
     oldTargt = targt; 
}() 
document.addEventListener('click', toggleHighlight); 

Примечание:
- Я не хочу, чтобы остановить распространение с моим сценарием, я хочу, чтобы остановить мой сценарий, если событие будет распространяются на другой обработчик.
- Меня не интересуют решения JQuery-event-handlers-only, если они не поймают обработчики событий браузера по умолчанию.
- Если эта функция действительно не существует, процитируйте некоторые статьи или блоги, а не только свое мнение.
- Особые предложения приветствуются, но меня интересует главным образом существование общего решения.

Update: приемлемые решения включают в себя:

  • исчерпывающий (МОГЛИ) перечень if условий, которые мне нужно, чтобы проверить
  • без яваскрипта пути доступного из плагина Firefox
  • объяснения как Firefox знает, что щелчок на действительном элементе <a> должен инициировать перезагрузку нового URL +, как эта логика недоступна из javascript/plugins.
+0

Нет, нет никакого подвоха-все-событий решения. Я могу только подумать о том, чтобы подключиться к «документу» и проверить, не было ли по умолчанию запрещено определенные события (и это даже не будет работать, если распространение остановлено) – Bergi

+0

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

+1

Затем просто добавьте ['if (! e.defaultPrevented)'] (https://developer.mozilla.org/en-US/docs/DOM /event.defaultPrevented) в функцию 'toggleHighlight'. – Bergi

ответ

2

Этот вопрос является почти дубликатом "How to do an action only when there is no default in Javascript/jQuery?", за исключением того, что в качестве скрипта Greasemonkey есть еще одна (сложная) опция, доступная вам.

С вашего вопроса, похоже, вы хотите установить default action для узлов, у которых их нет, а затем прервать это действие по умолчанию, если какой-либо другой обработчик событий запускается для данного события.Для этого нет «механизма для удержания», и практически любая техническая попытка, которую вы пытаетесь, может привести к сбою какой-либо страницы. Вот почему:

  1. Ни javascript, ни API Greasemonkey не предоставляют механизм для перечисления событий для данного узла. Был an old proposal, но он никогда не был реализован.

    Однако Firefox дополнение можно перечислить события через nsIEventListenerService, так что есть возможность , что вы могли бы написать помощник надстройки для той части, которая взаимодействует с Greasemonkey. Подробности (путь) выходит за рамки этого вопроса.

  2. Аналогичным образом не существует механизма для обнаружения предшествующих событий в цепочке событий из Event object, если не установлено значение event.defaultPrevented. (Обычно этого не будет.)

  3. Даже если бы вы могли перечислить прослушиватели событий для узла X, что не поможет прослушивающим устройствам на родительских узлах. Современные JS-библиотеки могут, а иногда и делать, сделать любой старый узел кликабельным. И/или они могут установить слушателя на, скажем, document, что получает все события щелчка, но фактически не do ничего, кроме того, когда исходной целью был какой-то определенный узел.


Хороший компромисс стратегия должен следовать примеру этого другого вопроса и ничего для узлов с действием в по умолчанию не делать.
Чтобы отредактировать щелчки правой кнопкой или щелчком по центру, отметьте event.which.

Так что вы можете добавить следующие фрагменты в чеках:

return function(e){ 
    targt = e.target; 
    sel  = window.getSelection(); 

    if (e.which != 1) { 
     return; //-- Abort on anything that is not a left-click. 
    } 
    if (e.defaultPrevented) { 
     return; //-- The one time we know that some other handler fired. 
    } 
    if (isInteractiveElement (targt)) { 
     // Do nothing for elements that trigger browser actions 
     return; 
    } 
    ... 

где:

function isInteractiveElement (node) { 
    var intElems = [ 
     //-- Must be uppercase 
     "A", "BUTTON", "INPUT", "TEXTAREA", "VIDEO", "MAP", "OBJECT" 
    ]; 
    if (intElems.indexOf (node.nodeName) >= 0) { 
     return true; 
    } 
    else if (node.nodeName === "BODY") { 
     return false; 
    } 

    return isInteractiveElement (node.parentNode); 
} 
+0

не лучший ответ в течение долгого времени, поэтому я, наконец, принял это, я все равно оставил свой сценарий Greasemonkey, теперь я использую трех- клики + ':: - moz-selection', чтобы выделить текст с красивым цветом – Aprillion

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