2009-05-21 10 views
16

C'est un peu une question spécifique, donc je vais aller droit au but. Je travaille sur une routine de glisser-déposer simple et courte pour une partie d'une application web, et bien que le bit de glisser-déposer fonctionne bien, le site devient tout moche au cours de l'opération parce que le navigateur fait toujours le opération par défaut et fonctionne sur la sélection de texte. J'ai essayé quelques solutions impliquant principalement le renvoi de faux des événements mousedown ou click, et bien qu'ils désactivent la sélection de texte dans certains navigateurs, ils semblent également désactiver complètement l'événement mouseup, ruinant le bit "drop" du script et laissant cette icône perma flottant autour de la souris - pas amusant.Comment désactiver temporairement la sélection de texte en utilisant JavaScript?

Je ne veux pas vraiment que la sélection de texte soit complètement terminée, je veux juste suggérer que le navigateur ... ne le fasse pas en faisant glisser, si cela a du sens. Comme je connais la zone affectée (il y a des iframes impliqués), je peux facilement appliquer une propriété aux éléments affectés, etc. Je peux afficher du code si nécessaire, mais je cherche une solution plus générale. Puisqu'il s'agit uniquement d'une chose esthétique, je suis à la recherche d'une solution qui fonctionne dans la plupart des navigateurs, ce n'est pas vraiment crucial.

Merci!

+0

... et l'attaque des titres redondants commence, je devrais me donner un coup de pied.^_^Je devrais vraiment apprendre que "par programmation" est impliqué ici. –

Répondre

18

Dans les navigateurs W3C, vous pouvez appeler la méthode preventDefault sur l'objet event. L'équivalent IE consiste à définir returnValue sur false.

function stopDefault(e) { 
    if (e && e.preventDefault) { 
     e.preventDefault(); 
    } 
    else { 
     window.event.returnValue = false; 
    } 
    return false; 
} 

EDIT: Il suffit de relire la question et vous pourriez aussi vouloir empêcher l'action par défaut dans la partie de votre code qui gère le traînement réelle, et non seulement au mousedown initial ou cliquez sur.

+0

Cela fonctionne, mais il semble tuer l'événement mouseup. Y at-il un moyen de détecter quand le bouton a été relâché après avoir fait cela? –

+0

L'événement mouseup est-il attaché à l'objet en train d'être déplacé? Si c'est le cas, essayez de l'attacher au document ou à la fenêtre à la place. Attachez-le au cours de l'événement mousedown sur l'objet de déplacement, puis dans le gestionnaire de mouseup, détachez-le à nouveau. De plus, b/c le gestionnaire s'exécutera dans le contexte de l'objet document, vous devrez faire preuve de créativité en gardant une référence à l'objet glisser. – Bryan

+0

Je l'ai eu à travailler par la suite. Je commençais le drag dans un iFrame, puis dessinais l'objet sous la souris dans le cadre du conteneur. (Le but de ceci est de "déposer" l'objet sur un autre cadre, amusant amusant.) Donc, au lieu d'écouter le mouseup dans le iFrame de départ, j'ai dû écouter une mouseup dans toutes les images, y compris le parent. (Les iFrames écoutent répondre en appelant la fonction de gestion de la goutte du parent avec leur position, etc.) Cela fonctionne, et semble aller bien et dandy avec tous les navigateurs. Merci beaucoup! –

0

autant que je sache, l'élément traîné doit être positionné sur d'autres éléments sous le pointeur de la souris. S'il se déplace avec le pointeur de la souris, il empêche toute sélection sur la page.

+1

Cela ne semble pas être vrai. La méthode que j'utilise est une méthode fantôme, je crée une copie fictive de l'objet à faire glisser, et elle n'est pas réellement retirée de l'ancienne page tant qu'une chute n'est pas réussie. –