Estoy construyendo una aplicación web que implica mucho arrastre y caída de texto desde la página web y desde otras aplicaciones, por ejemplo, documentos word y pdf. Necesito obtener el estado actual del mouse si está abajo (clic) o hacia arriba (liberación). Actualmente puedo obtener el estado actual del mouse si estoy arrastrando texto dentro de la página web pero no puedo obtener el estado del mouse si el mouse proviene de otra aplicación decir word y arrastrar texto. Cualquier puntero para obtener el estado hacia abajo o hacia arriba del mouse es muy apreciado.detectando el estado actual de un mouse en javascript o jquery, es decir, abajo o arriba
Respuesta
La cuestión tal como lo entiendo es que se necesita para determinar si se pulsa el botón izquierdo del ratón, si se pulsa fuera de la ventana (para una operación de arrastrar)
Hay una serie de cuestiones:
- no hay eventos mousemove disparadas durante una operación de arrastrar
- de datos de estados de botón actual difiere entre los navegadores
me he encontrado con esta solución:
/**
* keeps track of the current active mouse button.
* @param notifier {Function} called when the active button is updated.
* @param oneCallPerStateChange {Boolean} (defaults to false) if true the notifier will be called only when the active button changes.
*/
function initActiveButtonWatcher(notifier, oneCallPerStateChange) {
// create variable to store button states.
var _activeButton = -1, activeButton = 0
// function to set the current active button.
function updateMouseState(e) {
// update active button.
activeButton = typeof e.buttons === "number" ? e.buttons : e.which
// notify if the active button is different.
if (oneCallPerStateChange? (_activeButton !== activeButton && typeof notifier === "function") : (typeof notifier === "function")) {
notifier(activeButton)
}
// store the last state in order to be able to tell if the state has changed.
_activeButton = activeButton
}
// function to get the current active button.
function getButtonState() { return activeButton }
// update the button state when the mouse is moved
// or an item is dragged into the window.
window.addEventListener("mousemove", updateMouseState, false)
window.addEventListener("dragover", function() { updateMouseState({which: 1}) }, false)
window.addEventListener("dragleave", function() { updateMouseState({which: 0}) }, false)
// expose the getter on the global object.
window.getButtonState = getButtonState
}
La solución anterior se une al mousemove event y el evento dragover. Chrome obtiene un objeto de evento válido con los valores de botón correctos en el evento de dragover; sin embargo, descubrí que Firefox no lo hizo. Me imagino que el estado del botón izquierdo del mouse es bastante obvio durante una operación de arrastre, va a ser presionado, ¿verdad? No puedes arrastrar sin hacer clic y mover. Así que simplemente establecí el estado en 1 (abajo) en dragover.Del mismo modo, en dragleave, el valor se establece en cero.
Haría todo el manejo normal de dragover, dragstart, end, drop, etc. para evitar las acciones predeterminadas del navegador y el valor devuelto por window.getButtonState() debería ser siempre el valor del botón del mouse actualmente activo.
He aquí algunos ejemplo de uso que establece el valor de la primera etiqueta h1 en la página al botón actualmente presionado:
;(function() {
var active = document.getElementsByTagName("h1")[0]
function translate(n) {
switch (n) {
case 0:
return "none"
break;
case 1:
return "left"
break;
case 2: case 4: // Firefox calls it 4, the values differ between browsers I find.
return "middle"
break;
case 3:
return "right"
}
}
initActiveButtonWatcher(
function(currentActive) {
active.innerHTML = "Active button: " + translate(currentActive)
}
)
})()
Vas a tener que hacer algunos navegadores cruzados ajustes para el manejo de los diferentes valores (FF reportó 4 para el botón del medio, etc.) pero usted debería poder obtener el botón actual razonablemente bien con este método.
Pruébelo: http://jsfiddle.net/6BUA4/
tener una variable con el estado: Demo - Code
var _isMouseDown = false;
$(document).on("mousedown", function(event) {
_isMouseDown = true;
});
$(document).on("mouseup", function(event) {
_isMouseDown = false;
});
entonces usted puede comprobar para ver si _isMouseDown
ratón está presionado.
$(document).on("mousedown mouseup", function(event) {
_isMouseDown = event.type == "mousedown";
});
Si no desea que las variables globales que se pueden guardar _isMouseDown
tiro data
método de jQuery: Demo - Code
$(document).on("mousedown mouseup", function(event) {
$(this).data("_isMouseDown", (event.type == "mousedown"));
});
y comprobar tiro: $(document).data("_isMouseDown")
Gracias por la respuesta, pero esto no funciona si el mouse si proviene de una aplicación diferente dice pdf y está arrastrando texto. Eso es lo que estoy buscando, lo siento si no estaba claro en la pregunta –
Ahh está bien. Esta es realmente una buena pregunta :) – andlrc
Usted está buscando un nuevo robusta de arrastrar y soltar de HTML5 http://www.w3schools.com/html/html5_draganddrop.asp
El evento que está buscando es "soltar"
<div id="droppable"
ondragover="event.preventDefault()"
ondrop="event.preventDefault();
console.log(event);
console.log(event.dataTransfer.getData('text/plain'))">
Por supuesto debe mover este código en el archivo js, pero esto te da un ejemplo de lo que se ha hecho. Es posible que desee leer lo que hay dentro de esa caída externa, incluso usarlo para cargas.
Aquí es información detallada sobre event.dataTransfer http://www.tutorialspoint.com/html5/html5_drag_drop.htm
Al seleccionar texto en un programa externo (como Word) y se arrastra en una página web, elementos de la página generará dragenter
Los eventos de ratón. Probé esto en Chrome y funcionó para mí. Por ejemplo, yo puedo enlazar un oyente dragenter
a document.body y recibir los eventos a pesar de que no hay eventos de ratón normal se disparan:
function logEvent(e) {
console.log(e);
}
document.body.addEventListener('dragenter', logEvent);
// MouseEvent {dataTransfer: Clipboard, toElement: body, ..., button: 0, ...}
tal vez usted puede usar esto para su ventaja, ya que el evento dragenter
significa que el ratón está arrastrando y que el botón debe ser presionado. Además, se puede obtener el texto que está siendo arrastrado por conseguir los datos del suceso:
e.dataTransfer.getData('text/plain');
Es necesario utilizar el tipo de datos correcto en la llamada getData
. Escribí texto en Word y pude obtener ese texto arrastrado con text/plain
.
- 1. detectando dedo arriba/abajo UITapGestureRecognizer
- 2. ¿Diseño de arriba hacia abajo o de abajo hacia arriba?
- 3. usuario desplazarse hacia abajo o hacia arriba en jQuery
- 4. Mover un elemento hacia arriba o hacia abajo a seleccionar
- 5. ¿Es posible SIMULAR un clic del mouse con un mouse hacia abajo y hacia arriba?
- 6. Diseño y codificación: de arriba a abajo o de abajo hacia arriba?
- 7. Detectando el estado de ánimo de un tweet o mensaje
- 8. Redondeo de valores hacia arriba o hacia abajo en C#
- 9. ¿Diferenciar entre desplazamiento arriba/abajo en jquery?
- 10. Mover nodo en árbol hacia arriba o hacia abajo
- 11. Deshabilitar el doble clic del mouse con javascript o jquery
- 12. jQuery - alternar verticalmente (es decir, no hacia abajo)
- 13. Redondeo hacia arriba o hacia abajo en la velocidad
- 14. jQuery Masonry de abajo hacia arriba
- 15. ¿La pila crece hacia arriba o hacia abajo?
- 16. El elemento ordenable Jquery debe moverse solo arriba-abajo no izquierda o derecha
- 17. Usando TDD: "arriba hacia abajo" vs. "abajo hacia arriba"
- 18. HTML Table cellspacing o relleno solo arriba/abajo
- 19. ¿Cómo obtener la fila de la tabla de arriba (o antes) mi fila actual en jQuery?
- 20. jQuery Sortable Move Botón ARRIBA/ABAJO
- 21. ¿Puedo usar jQuery para desplazar fácilmente los elementos li hacia arriba o hacia abajo?
- 22. jquery mouse mouse out
- 23. ¿Cuál es el estado actual de GWT?
- 24. texto de ajuste de jquery/css de abajo a arriba
- 25. cómo mover un elemento de vista de lista hacia arriba o hacia abajo con un clic
- 26. Javascript - cabeza, cuerpo o jQuery?
- 27. Cómo muevo los elementos hacia arriba o hacia abajo en el archivo de texto
- 28. Detectando mouse clic en div con Javascript sin efectos secundarios
- 29. ¿Debe un icono mostrar el estado actual o el siguiente estado?
- 30. selección jQuery: atravesar hacia arriba, luego hacia abajo
Cuando se arrastra y suelta contenido externo, parece que la página se activa solo después de DROP. –