JQuery вопрос о событии mouseup - PullRequest
1 голос
/ 15 июля 2011

У меня есть список, и элементы списка могут быть выбраны (по одному или более с помощью клавиши Ctrl ) по событию mousedown.Я хотел бы отменить выделение выбранных элементов мышью в любом месте документа, кроме этих элементов списка.Я пробовал это, но не работает:

$("body").delegate("body:not(.selected_li)", "mouseup", function(event) { .......

Когда я щелкаю в любом месте документа (кроме выбранного li), событие mouseup не происходит.

Пожалуйста,помоги мне.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 15 июля 2011

Вы захотите привязать слушателя событий к телу и проверить элемент, на который нажали, чтобы увидеть, является ли он .selected_li, или одним из его потомков :

$('body').mouseup(function(e) {
    if ($(e.target).closest('.selected_li').length == 0) {
        // de-select
    }
});

Настоящий трюк здесь использует .closest(".selected_li"), потому что он обязательно включает случаи, когда вы находитесь над потомком ".selected_li".

Использование .is(".selected_li") не будет работать, если ваш список выглядит такчто-нибудь вроде этого:

<ul>
    <li>Item 1</li>
    <li class="selected_li"><i>Item 2</i></li>
    <li>Item 3</li>
</ul>

Если вы отпустите кнопку мыши, когда над Item 2 , event.target будет элементом <i>, а не <li>, поэтому .is(".selected_li") вернет false.Таким образом, мы должны увидеть, является ли цель события или любой из его предков ".selected_li", выполнив поиск с помощью .closest() и проверив, получили ли мы совпадение.

Редактировать: Используя .delegate() здесь не очень хорошая идея.Это свяжет обработчик события с каждым элементом-потомком <body>, что очень избыточно, так как событие всегда будет пузыриться до <body> в любом случае, и вам нужно будет сделать это только один раз.Тем не менее, возможно , но вы должны убедиться, что исключили достаточно - вам нужно исключить ".selected_li" и всех его потомков и всех его предков:

$("body").delegate(":not(.selected_li, .selected_li *, :has(.selected_li))", "mouseup", function(e) {
    // de-select
});

Но это приведет к тому, что обработчик событий будет вызываться несколько раз за клик.Если вы отпустите кнопку мыши над следующим абзацем, вы запустите обработчик событий 5 раз.Один раз для каждого из <em>, <p>, <div class="section">, <div id="content">, <div id="wrapper">.

<body>
    <div id="wrapper">
        <div id="content">
            <div class="section">
                <p><em>Here is a paragraph</em></p>
            </div>
        </div>
    </div>
</body>

Итак, просто привязайте один раз к телу, чтобы обработчик событий вызывался только один раз длянажмите.

0 голосов
/ 15 июля 2011

Нельзя делегировать на body от body.body - это ваш корневой элемент, поэтому я думаю, что вы хотите что-то вроде:

$("body").delegate("li:not(.selected_li)", "mouseup", function(event) {
  /* */
});

См. http://api.jquery.com/delegate

0 голосов
/ 15 июля 2011

Попробуйте это

http://jsfiddle.net/kw7v5/

Просто замените свои классы на ul и li.

0 голосов
/ 15 июля 2011

Это должно делать то, что вам нужно ..

$('body').mouseup(function(e){
   if ( !$(e.target).is('.selected_li') ) {
     // do the de-selection here..
   }
});

Демо на http://jsfiddle.net/gaby/kw7v5/4/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...