mdn manejo eventos event con javascript javascript-events event-handling greasemonkey ecmascript-5

eventos - manejo del dom con javascript



Detecta el manejo de eventos predeterminado (1)

Esta pregunta es casi un duplicado de "¿Cómo hacer una acción solo cuando no hay un valor predeterminado en Javascript / jQuery?" , excepto que como un script de Greasemonkey hay una opción más (complicada) disponible para ti.

A partir de su pregunta, parece que desea establecer una acción predeterminada para los nodos que no tienen uno, y luego cancelar esa acción predeterminada si cualquier otro controlador de eventos se activa para un evento determinado. No existe un "mecanismo general" para esto, y casi cualquier técnica que intente podría arruinar alguna página. Este es el por qué:

  1. Ni javascript ni la API de Greasemonkey proporcionan ningún mecanismo para listar eventos para un nodo dado. Había una propuesta anterior , pero nunca se implementó.

    Sin embargo, los complementos de Firefox pueden enumerar eventos a través de nsIEventListenerService , por lo que existe la posibilidad de que pueda escribir un complemento auxiliar para esa parte, que se conecta con Greasemonkey. Los detalles están (camino) más allá del alcance de esta pregunta.

  2. Del mismo modo, no hay ningún mecanismo para detectar eventos previos en una cadena de eventos desde el objeto Evento , a menos que se establezca event.defaultPrevented . (Por lo general no lo será)

  3. Incluso si pudiera enumerar los detectores de eventos para el nodo X , eso no ayudará con los escuchas de recuperación en los nodos principales. Las bibliotecas modernas de JS pueden, y algunas veces lo hacen, hacer clic en cualquier nodo antiguo. Y / o pueden configurar un detector en, por ejemplo, un document que obtiene todos los eventos de clic, pero que en realidad no hace nada excepto cuando el destino original era un nodo específico.

Una buena estrategia de compromiso es seguir el ejemplo de esa otra pregunta y no hacer nada por los nodos con una acción predeterminada .
Para manejar los clics con el botón derecho o centrar los clics, verifique event.which .

Por lo tanto, puede agregar los siguientes fragmentos a sus cheques:

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; } ...

dónde:

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); }

¿Es posible detectar si un evento DOM en particular tiene un controlador de eventos vinculado (incluido el manejo de eventos predeterminado del navegador) dentro del código Greasemonkey de Firefox ( modo estricto EcmaScript 5.1 ) ?

Hasta ahora he logrado cancelar mi manejo de eventos de clic cuando se selecciona un texto, pero me gustaría cancelar mi manejo de eventos en todas las situaciones siguientes donde el evento click desencadena una acción predeterminada:

  • seleccionando texto en la página
  • se muestra el menú contextual (es decir, haga clic con el botón derecho)
  • se sigue un enlace (haga clic en <a> )
  • se manipulan los elementos del formulario (el cuadro de texto gana el foco y el cursor comienza a parpadear, se selecciona el botón de opción, ...)
  • algún otro código JavaScript que maneja el evento (por ejemplo, se muestra el diálogo de ayuda emergente)

¿Hay un mecanismo general para esto o necesito deletrear explícitamente todas las situaciones en mi código?

El siguiente código es cómo detecto que ocurrió la selección:

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);

Notas:
- No quiero PARAR la propagación con mi script, quiero detener MY SCRIPT si el evento se propagará a otro controlador.
- No me interesan las soluciones solo de JQuery-event-handlers si no detectan controladores de eventos de navegador predeterminados.
- Si esta función no existe, cite algunos artículos o blogs, no solo su propia opinión.
- Las sugerencias particulares son bienvenidas, pero estoy interesado principalmente en la existencia de una solución general.

Actualización : las soluciones aceptables incluyen:

  • lista exhaustiva (ish) de las condiciones que necesito verificar
  • vía no javascript accesible desde un complemento de Firefox
  • explicación de cómo Firefox sabe que un clic en un elemento <a> válido debería desencadenar la recarga de una nueva URL + cómo esta lógica no es accesible desde javascript / plugins