2016-10-06 4 views
1

Мне нужно уметь обнаруживать любой щелчок, который происходит в определенном контейнере, на который ссылается класс, если пользователь нажимает на любой из вложенных элементов, я должен быть в состоянии обнаружить нажмите и обновите флагОбнаружение события щелчка в любом вложенном элементе определенного div

<div class="container" > 
    <div class="x1"> 
    <div class="x2"> 
     <div class=""> 
     <span class=""> 
     <ul class=""> 
    </div> 
</div> 

Я пробовал использовать jquery, но я предпочитаю делать это с использованием позвоночника.

//$(document).on('click','.container', function(e){ 
//$('.container').delegate("div", "click", function(e) { 

Не уверен, что события мне нужно использовать, когда пользователи нажимают на некоторые из вложенных элементов внутри DIV, которые имеют класс контейнера. В принципе, мне нужно обновить флаг, если пользователь щелкнет за пределами этого div, но я не хочу иметь большую область действия обработчика событий, который прослушивает весь объект.

+0

Возможный дубликат [Что такое делегирование событий DOM?] (Http://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) – Makyen

+0

Связано: [Jquery live() vs delegate()] (HTTP: // StackOverflow.com/q/4579117/3773011) – Makyen

+1

'' Мне нужно обновить флаг, если пользователь щелкает за пределами этого div '' - Как это будет достигнуто путем обнаружения кликов * внутри * 'div'? Можете ли вы рассказать о том, как ваша первая попытка «не сработала»? Это действительно обнаружит клики внутри 'div'. – David

ответ

2

Поскольку вы попросили пример с базой, вот как прослушивать клики на div и его дочерних элементах.

var View = Backbone.View.extend({ 
    className: "my-test-view", 
    template: '<div class="container"><div class="x1"><div class="x2">test</div></div></div>', 
    events: { 
     'click .container': 'onClick', 
    }, 

    render: function() { 
     this.$el.empty().append(this.template); 
     return this; 
    }, 

    onClick: function(e) { 
     console.log("clicked on", e.target, " triggered from ", e.currentTarget); 
    }, 
}); 

var view = new View(); 

$("body").append(view.render().el); 

Нажатие test текст должен вывести:

clicked on <div class=​"x2">​test​</div>​ triggered from <div class=​"container">​…​</div>​ 

С JQuery, выше (примерно) эквивалентно:

$('.my-test-view').on('click', '.container', function(e) { 
    console.log("clicked on", e.target, " triggered from ", e.currentTarget); 
}); 

Но для большинства случае, это должно быть достаточно :

$('.container').on('click', function(e) { 
    console.log("clicked on", e.target, " triggered from ", e.currentTarget); 
}); 

Не используйте .children().on(...), так как это создаст новый слушатель для каждого ребенка, и он неэффективен.

Обнаружение щелчка вне div очень отличается, и есть много способов его достижения, но ни один из них не идеален.

См:

Лично я использовал focus и blur события (не забудьте tabindex="-1" на элемент).

0

Может быть, это ?:

$(document).on('click','.container *', function(e){ 
console.log(e.target); 
}); 

Самым замечательным JQuery является то, что вы можете использовать те же селекторы, как вы будете использовать с CSS, следовательно, я использовал .container * охватить все элементы внутри контейнера.

-2

Я использовал метод jquery .children(). Отъезд this code pen.

var flag = 'whatever'; 

$(.container).children().on('click', function() { 
    flag = 'updated'; 
}); 

По существу, говоря, что для всех детей любого элемента является контейнером класса (в этом случае div (div)) добавляет обработчик событий.

+0

Использование '.children(). On (...)' как это неэффективно , Кроме того, '.container' должен быть строкой. –

Смежные вопросы