unload eventos event javascript jquery javascript-events cross-browser

eventos - menú contextual de javascript haga clic en evento/detección-filtre el contenido de la pasta



listen jquery event (5)

La respuesta a la pregunta es un simple no. Los navegadores principales que no tienen eventos de paste son las versiones recientes de Opera y Firefox 2. Dado que no hay eventos de paste , debe buscar un evento alternativo o un conjunto de eventos para detectar un pegado en el menú contextual, ya que realmente sucede . Puede agregar manejadores para cada evento que haya (he hecho esto) y simplemente no obtiene nada en los navegadores relevantes cuando el usuario inicia un pegado desde el menú contextual.

Esto solo deja sondear el valor del ingreso de texto regularmente, que no es lo mismo. Puede hacer un seguimiento de las pulsaciones de teclas y observar en su código de sondeo que el valor de la entrada de texto ha cambiado por algún otro medio que no sea la entrada del teclado y hacer una diferencia, pero eso es intrépido y poco fiable.

Escenario: estoy intentando interceptar eventos de pegado dentro de un área de texto / texto de entrada y filtrar el contenido que se está pegando.

El Webkit / IE se maneja bastante bien, ya que puedo adjuntar código al evento onpaste y luego leer desde el portapapeles lo que se está pegando. Plenty de examples alrededor.

Gecko es más complicado porque, por lo que sé, no es posible leer el contenido del portapapeles en ffox (¿a menos que alguien sepa una solución para eso?)
Solo uso el truco de intercambio de entrada para eso.

La ópera está siendo molesta aunque. Puedo atrapar CTRL + V y MAYÚS + INS , pero no hay onpaste evento de onpaste .
Sin mencionar ningún tipo de interacción del portapapeles, al parecer.

Entonces, mi pregunta es:

¿Puedo detectar si el usuario hizo clic en paste en el menú contextual en Opera? ¿Hay alguna otra manera de detectar el evento?

EDITAR:

Gracias a todos por las respuestas, todos agregan una buena entrada, incluso si no hay una solución definitiva.
Teniendo que elegir, elegiré la única que trató de responder a la pregunta original, y eso probablemente funcionaría si no fuera demasiado difícil siquiera intentarlo.

Notas para aquellos que tienen mi mismo problema (filtrado de entrada):

  • es posible capturar el contenido que se arrastra: mouseup + setTimeout hace el truco en todas partes casi a la perfección.
  • Sin flash, es probable que no haya barra de solución de sondeo. Incluso con flash, tampoco es una solución completamente sólida. Demasiado esfuerzo para apoyar el 100% de los casos.

Me encontré con esto el año pasado. En resumen, no.

Terminé usando un controlador onchange y filtrando el contenido después de que ya se haya pegado en el cuadro de texto.


Me gustaría señalar el widget de menú DOJO que está creando menús contextuales perfectamente en diferentes navegadores. http://www.dojotoolkit.org/reference-guide/dijit/Menu.html#dijit-menu

Lo que puede hacer es detectar el evento de pegado en los navegadores que lo admiten y anular el menú contextual en los navegadores que no admiten este evento como Opera.

Una vez que cree su propio menú contextual, puede agregar un elemento de menú copiar o pegar o crear un menú contextual similar al predeterminado usando css.

Editado Es posible que algunos navegadores no nos permitan obtener contenido del portapapeles, en este caso, siempre podemos volver a flash para pedir prestadas algunas de sus funciones que son de navegador cruzado. Ver par de enlaces que he publicado en los comentarios.

Su implementación completa puede tener más problemas de los anticipados, pero es posible y siempre podemos intentarlo (seguro que lo haré).


Puede interceptar el pegado con jQuery usando el bind(''paste'', function() {}); , compare la cadena antes y después de pegar y aplique su formato.

Lo siguiente se probó en IE7 / FF3.6 / Chrome / Safari 5

$("#textarea").bind(''paste'', function(e){ // Do whatever you needed to do with the code here. });

Ejemplo en vivo http://jsfiddle.net/VSrTg/2/

Editar un enfoque sería algo como esto:

$("#textarea").bind(''paste'', function(e){ var oldText = this.value; setTimeout(function() { // Compare oldText to $("#textarea").val() and format accordingly. }, 1000); });

Edición 2 Dadas las revisiones de su publicación original, si le preocupa la share market giant que es Opera, tendrá que controlar el valor de su cuadro de texto con un setInterval() y compararlo con sí mismo para setInterval() cambios. .

En última instancia, siempre habrá una forma de evitar el script , incluso el ejemplo anterior es susceptible de simplemente arrastrar texto desde otro cuadro de texto (o la barra de direcciones) hacia él sin activar el evento de paste definido anteriormente.


Yo uso el setTimeout para pegar eventos. Pero para la selección del menú contextual, nada parece funcionar (como se indicó anteriormente). Enlace un mousemove a la forma de entrada que activa la función de actualización. Luego desate o ate para que no se amontonen.

Esto maneja la selección del menú contextual y arrastrando el valor al campo de entrada.

Si su formulario es pequeño, diga que con un solo campo de entrada y el mouse no aterrizará en él después de seleccionarlo en el menú contextual, vincúlelo con el padre o el documento del formulario. Claro, tiene que esperar hasta que el mouse se mueva, pero esa es la acción general del usuario después de seleccionar desde el menú contextual.

Funciona bien.