Как мне выполнить функцию для события на любом элементе, кроме одного с jQuery? - PullRequest
1 голос
/ 05 марта 2010

Я хочу выполнить функцию для события любого элемента, кроме одного:

$(":not('#myelement')").bind('mousedown', function() {
    console.log('mousedown event');
});

но когда я нажимаю #myelement, функция все равно выполняется, потому что селектор выбирает всех родителей. Более того, функция выполняется для каждого родителя. Как я могу: -исполнение функции только один раз? -не выполнить функцию на моем элементе?

Вот полный выпуск:

$("#current_page a").toggle(
    function(){
        $("#current_menu").hide();                    
        return false;
    },
    function(){
        $("#current_menu").show();
        return false;
    }
);

$(":not(#current_page a)").bind('mousedown',function() {               
    $("#current_menu").hide();
});

При нажатии на "#current_page a" запускается событие mousedown, а я не хочу.

спасибо июлю

Ответы [ 3 ]

1 голос
/ 05 марта 2010

Удалить ваши цитаты в '#myelement' ... Просто :not(#myelement). Вы должны быть хорошими.

Редактировать: добавить проверку в событие, проверив event.target, чтобы исправить потенциальную проблему пузырей:

function eventFunc(event) { 
    if ($(event.target).attr("id") !== 'myelement') {
        // do work
    }
}
0 голосов
/ 05 марта 2010

Вот полный пример, который должен делать то, что вам нужно ...

$(":not(#myelement)").bind('mousedown', function(event) {
    console.log('mousedown event');
    event.stopPropagation()
});

Важное замечание (по комментариям Юля)

Событие будет добавлено в КАЖДЫЙ элемент на странице, за исключением одного элемента с идентификатором «myelement». Я собрал это быстрое демо, чтобы продемонстрировать ...

Вы заметите, что предупреждение onclick («привет») никогда не вызывается, независимо от того, где вы нажимаете - это демонстрирует предотвращение распространения события. Вы также заметите, что когда вы нажимаете «myelement», вызывается событие для родителя, потому что вы не добавили обработчик событий в этот элемент. Ниже я объясню, как вы можете это исправить. Вот пример.

<div oclick="alert('hi');" id="a">
    <div id="b">One</div>
    <div id="c">One</div>
    <div id="d">One</div>
    <div id="e">One</div>
    <div id="f">One</div>
    <div id="myelement">Not One</div>
    <div id="h">One</div>
    <div id="i">One</div>

</div>

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
    $(":not(#myelement)").bind('mousedown', function(event) {
        alert($(this).attr("id"));
        event.stopPropagation()
    });
</script>

И вам нужно будет сделать следующее, чтобы щелчки на «myelement» не вызывали срабатывание родительского элемента:

$(":not(#myelement)").bind('mousedown', function(event) {
    console.log('mousedown event');
    // event.stopPropagation() - you might not want this anymore - up to you...
    // I think you wanted clicks on "myelement" to be ignored, rather than 
    // event propagation to be prevented
});
$("#myelement").bind('mousedown', function(event) {
    event.stopPropagation()
});
0 голосов
/ 05 марта 2010

Два варианта:

  1. Вы можете заставить обработчик проверить цель события и выйти, если она плохая:

     $(':not(#foo)').mousedown(function(ev) {
       if ($(ev.target).is('#foo')) return false;
       // other stuff
     });
    
  2. Вы можете добавить обработчик специально для плохого элемента и заставить его убить событие:

    $(':not(#foo)').mousedown(...);
    $('#foo').mousedown(function() { return false; });
    
...