2010-10-15 3 views
27

Je déteste ce désordre avec les boutons de la souris créés par W3C et MS! Je veux savoir si le bouton gauche de la souris est pressé quand je reçois un événement mousedown.Détection bouton gauche de la souris presse

J'utilise ce code

// Return true if evt carries left mouse button press 
function detectLeftButton(evt) { 
    // W3C 
    if (window.event == null) { 
    return (evt.button == 0) 
    } 
    // IE 
    else { 
    return (evt.button == 1); 
    } 
} 

Cependant, il ne fonctionne pas dans Opera et Chrome, car il se trouve que window.event existe là aussi.

Alors qu'est-ce que je fais? J'ai une certaine détection de navigateur, mais nous savons tous qu'il ne peut pas être invoqué avec tout le masquage que certains navigateurs font ces derniers temps. Comment puis-je détecter le bouton gauche de la souris de manière FIABLE?

+0

Je pense que les deux premiers résultats de la recherche pour 'site: quirksmode.org bouton gauche de la souris press' vous aidera. –

+0

Je l'ai lu, il n'y a rien là, seul script pour le bouton droit de la souris –

+0

Vous pouvez regarder comment [jQuery] (http://stackoverflow.com/questions/1206203/how-to-distinguish-left-mouse- click-and-right-with-jquery) résout le problème, ou utilise juste le [mouse_own de jQuery] (http://api.jquery.com/mousedown/) et regarde la valeur de 'event.which'. – jball

Répondre

35

Réponse mise à jour. Ce qui suit détectera si la gauche et seul le bouton gauche de la souris est pressé:

function detectLeftButton(evt) { 
    evt = evt || window.event; 
    if ("buttons" in evt) { 
     return evt.buttons == 1; 
    } 
    var button = evt.which || evt.button; 
    return button == 1; 
} 

Pour plus d'informations sur la gestion des événements de souris en JavaScript, essayez http://unixpapa.com/js/mouse.html

+1

Cela ne fonctionne pas. Le bouton gauche est 0 dans tous les navigateurs sauf IE –

+5

Cela ne fonctionne pas. 'which' renvoie 1 pour le bouton gauche dans tous les navigateurs sauf IE, où il sera indéfini. Dans IE seulement, ma variable 'button' utilisera donc la valeur de la propriété' button' de l'événement au lieu de 'which', qui est 1 pour le bouton gauche. –

+0

@ avok00, l'avez-vous essayé? – jball

10

Il y a maintenant un W3C standardevent.buttons propriété prise en charge par IE9 in standards mode et Gecko 15+.

La W3C completely stuffed la propriété event.button, donc pour un niveau event.button de navigateur compatible est 0, mais pour les navigateurs créés avant la norme, event.button est 1.

donc le code doit éviter d'utiliserevent.button sauf pour les navigateurs plus anciens. Le code suivant devrait fonctionner:

function detectLeftButton(event) { 
    if ('buttons' in event) { 
     return event.buttons === 1; 
    } else if ('which' in event) { 
     return event.which === 1; 
    } else { 
     return event.button === 1; 
    } 
} 
+0

+1. Cela ressemble à une amélioration de ma réponse, bien que selon les besoins, vous pouvez faire une comaprison bit à bit avec 'buttons' (par exemple, une valeur de 3 signifie que les boutons gauche et droit de la souris sont enfoncés). Cette question particulière semble impliquer que l'OP voudrait savoir si le bouton de gauche est pressé, quel que soit l'état de tout autre bouton, de sorte que la comparaison de bits serait appropriée. Exemple: 'return (event.buttons & 1) === 1;' –

+2

@TimDown - Je ne pense pas qu'une vérification au niveau du bit est souhaitée car le code est plus simple sans cela. De la convivialité, si l'utilisateur a deux boutons vers le bas, alors probablement qu'ils signifient quelque chose d'autre que ce que le clic gauche signifie normalement. Pour la même raison dans mon propre code, je vérifie aussi '! Event.metaKey &&! Event.ctrlKey &&! Event.altKey &&! Event.shiftKey' pour éviter de capturer d'autres clics (shift-click n'est pas identique au clic). – robocat

0

Vous pouvez utiliser le code- suivant

onmouseup="if(window.event.which==1){//code for left click} 
      else if(window.event.which==3){//code for right click}" 
0

Même si event.buttons travaille maintenant dans Chrome, Safari ne supporte toujours pas. Une solution consiste à utiliser onmousedown et onmouseup au document ou niveau parent comme: onmousedown = "bMouseDown = true" onmouseup = "bMouseDown = false"

0
// 0 left, 2 right, 1 middle, other.. extra buttons, gaming mouses 

var buttonsArray = [false, false, false, false, false, false, false, false, false]; 
var mousePressed = false; 

document.onmousedown = function(e) { 
    buttonsArray[e.button] = true; 
    mousePressed = true; 
}; 

document.onmouseup = function(e) { 
    buttonsArray[e.button] = false; 
    mousePressed = false; 
}; 

document.oncontextmenu = function() { 
    return false; 
} 

Explication: Lorsque la souris est en baisse, nous changeons à true bouton appuyé dans notre tableau de boutons. Lorsque la souris est en haut, nous changeons à false le bouton appuyé à false.

Maintenant nous pouvons établir quel bouton est pressé avec plus de précision, mais nous avons un problème de clic droit .. parce qu'avec ce bouton nous ouvrons un menu contextuel au navigateur, et cela échappe à notre contrôle ... donc, nous désactivons le contexte menu afin de détecter correctement le clic droit. Si nous ne faisons pas cela, nous devons aussi résoudre le clic gauche ... et c'est une complication qui échappe à cette réponse. Pour simplifier les choses, nous pouvons ajouter une autre variable mousePressed et marquer si la souris est en bas ou en haut.

Fonctionne parfaitement sur chrome, je ne l'ai pas testé dans un autre navigateur mais je suppose que c'est ok dans firefox et l'opéra aussi ... IE ??? Je ne me soucie pas d'IE.

Profitez-en!

0

Travail hors de robocat's answer, vous pouvez facilement créer une extension jQuery comme suit

$.fn.mouseButton = function() { 
    if (!(this instanceof MouseEvent || this[0] instanceof MouseEvent)) return null; 
    var e = this[0] || window.event; 
    return e.buttons || e.which || e.button; 
} 
Questions connexes