9
votes

Jquery ui; Arrêter la propagation d'événements sélectionnables

Fondamentalement, j'utilise Sélection de la fonctionnalité sélectionnable de JQuery UI sur un ul code> , mais l'UL aura souvent souvent une barre de défilement et cette barre de défilement devient inutilisable dans les navigateurs WebKit depuis que lorsque vous essayez de cliquer dessus pour l'accrocher, le lasso pour la fonctionnalité sélectionnable est tracés à la place.

J'ai formulé une solution , qui consiste à vérifier la position du curseur par rapport à la position et à la largeur de l'UL pour voir si le curseur est sur la barre de défilement et, le cas échéant, arrêtez la propagation de l'événement «Démarrer» sélectionnable, mais malgré le respect de la conditionnelle lorsque Cela devrait être, ni de retourner fausse ni d'arrêt de la progression de l'événement semble empêcher JQuery de progresser à travers les événements sélectionnables. P>

Voici ce que j'ai pour la jQuery .Selectable code> Démarrer CODE> EVENT: P>

start: function(event, ui) {
    var t = event.target;
    var cutoff  = t.scrollWidth + t.offsetLeft
    if (event.clientX > cutoff)
    {
        console.log('NO!');
        console.log(event.type);

        //overkill
        event.stopPropagation();
        event.stopImmediatePropagation();

        if (event.stopPropagation) {
          event.stopPropagation();
        } else {
          event.cancelBubble = true;
        }

        return false;
    }
}


1 commentaires

Lorsque vous dites, "le lasso pour la fonctionnalité sélectionnable est tracés à la place", quel est ce lasso que vous parlez? Pouvez-vous prendre une capture d'écran?


3 Réponses :


15
votes

Le Démarrer L'événement est un faux tressant. Ce que vous devez faire est de joindre votre code pour annuler une éventuelle bouillonnement directement dans l'événement MouseDown du UL et assurez-vous que votre gestionnaire d'événements est exécuté en premier.

Vous verrez dans les docs JQuery pour event.stoppropagation cette petite ligne:

Notez que cela n'empêchera pas d'autres des gestionnaires sur le même élément de courir.

donc, tandis que événement.stoppropagation arrêtera l'événement bulling plus en haut de la DOM, il n'arrête pas les autres gestionnaires d'événements attacher au ul être appelé. Pour cela, vous avez besoin de event.stopimmediatepropagation pour arrêter le gestionnaire d'événements (code> sélectionnable

basé sur le page de démonstration sélectionnable , cet extrait de code annule avec succès la bulle: xxx

Notez que vous devez ajouter Votre gestionnaire d'événements sur l'objet ul avant vous exécutez la fonction .) Fonction de configuration afin de vous faufiler et de faire sauter la bulle d'événement en premier.


4 commentaires

Bonne analyse. Notez que l'instruction renvoyer false encapsulera également evt.stoppropagation () . Je ne dois pas nécessairement faire les deux.


Merci beaucoup pour votre solution, cela est parfaitement logique que vous m'avez expliqué la nature de la structure des événements .selectables et de l'utilisation correcte de stopprogation et d'arrêt de stopimédiediate et cela fonctionne un régal! Merci encore!


J'ai soumis ceci au suivi de bugs JQuery: dev.jQueryui.com/ticket/4441 J'espère qu'ils le répareront.


Cela m'a aidé à arrêter un événement de clic à partir d'ouvrir un modal lorsque j'ai cliqué sur N a glissé un élément redimensionnable JQuery-UI. THX!



1
votes

La réponse de Sam C n'a pas fonctionné pour moi, probablement à cause de la façon dont je me suis positionné #selectable. C'est ce que j'ai utilisé: xxx

où $ .getscrollbarwidth () vient de ici


0 commentaires

2
votes

Voici une légère variation de la solution Sam C STROND> qui a fonctionné mieux pour moi (en annulant uniquement l'événement MouseDown s'il est tiré sur l'élément avec la barre de défilement):

$(function() {
    $("#selectable").mousedown(function (evt) {
        if ($(evt.originalEvent.target).hasClass('ui-dialog'))  // <--- variation
        {
            evt.stopImmediatePropagation();
            return false;
        }
        return true;
    });        
    $("#selectable").selectable();
});


1 commentaires

Vous vouliez probablement dire si ($ (evt.originalevent.target) .hasclass ("ui-sélectionnable")) . C'est ce qui a fonctionné pour moi avec un Todbon comme le conteneur (TR sont les SEELECES).