2014-12-29 4 views
1

Мой HTML-код, как это:как stopPropagation в Backbone.js

<li data-id="<%=p.id %>" data-len="<%=products.length %>" data-count="<%=count %>"> 
    <div class="pro_list_imgbox"> 
     <img src="" /> 
    </div> 
</li> 

и мой JS код выглядит так:

events: { 
      'click .pro_list_imgbox': 'loadPic', 
      'click li[data-id]': 'detailHandler' 
     }, 

loadPic: function (e) { 
      var target = $(e.target), 
       pic = target[0].nodeName === 'IMG' ? target : target.find('img'); 

      if (!pic.data('loadState')) { 
       e.stopPropagation(); 
       if (e.isPropagationStopped()) { 
        alert('stoped'); 
       } 
       pic.attr('src', pic[0].src += '?t' + new Date().getTime()); 
      } 

     }, 

detailHandler: function (e) { 
      alert('haha'); 
     }, 

Я вызывается e.stopPropagation() в функции loadPic, когда я нажимаю элемент img, и он называется успешно. Но почему detailHandler все еще извинялся и предупреждал «ха-ха». Как я могу исправить эту проблему?

+0

Вы пробовали 'stopImmediatePropagation' (не уверены, помогут)? Хотя я считаю, что «stopPropagation» должен работать. В любом случае вы могли бы сделать pj http://jsfiddle.net/, демонстрируя проблему? –

+1

Кажется, будет работать как ожидалось http://jsfiddle.net/h6cLcs7h/ – nikoshr

+0

@Yury Tarabanko stopImmediatePropagation отлично работает, thx –

ответ

0

Похоже, вы находитесь почти в правильном направлении. Пожалуйста, проверьте, не решены ли следующие проблемы:

events: { 
      'click .pro_list_imgbox': 'loadPic', 
      'click li[data-id]': 'detailHandler' 
     }, 

loadPic: function (e) { 
      var target = $(e.target), 
       pic = target[0].nodeName === 'IMG' ? target : target.find('img'); 

      if (!pic.data('loadState')) { 
       pic.attr('src', pic[0].src += '?t' + new Date().getTime()); 
      } 
      //this return statement will not allow the event to propagate to the parent element. 
      return false; 

     }, 

detailHandler: function (e) { 
      alert('haha'); 
     }, 
+0

не работает для меня. Почему бы оператор 'return' предотвратить распространение на родительский элемент? –

+0

Распространение событий - это последовательный процесс. Когда предыдущий обратный вызов для дочернего объекта возвращает false, распространение прекратилось. Проверьте этот пример jsFiddle http://jsfiddle.net/1pssc6Lb/ –

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