Остановить распространение с неработающим делегатом / живой функцией jquery - PullRequest
5 голосов
/ 18 августа 2010

Вот проблема html:

<ul id="update-list">
<li class="update" onclick="window.location('some_url')">
  <h2> some header </h2>
  <p> some paragraph </p>
  <div>
    <a class="popup-link">
      <span> Show Popup </span>
      <span> + </span>
    </a>
  </div>
</li> 
// this repeats n times
//...
</ul>

Когда я нажимаю на ссылку .popup-link, она должна открывать только всплывающее окно лайтбокса (что делает), но также включается встроенный щелчок по li.Дело в том, что теги li являются частью некоторой части, которая извлекается через ajax на разных страницах.Поэтому я использую jquery delegate, чтобы связать события следующим образом:

$('#update-list').delegate('.popup-link', 'click', function(e){
    // e.target is <span> while e.currentTarget is .popup-link 
    e.stopPropagation();
    //console.log(e.isPropagationStopped());  this shows 'true' in console
    $.popup();   // launch popup
    e.preventDefault(); // or return false
});

Это не работает, и встроенный onclick срабатывает в любом случае.Я тоже пробовал с live(), но безуспешно.Есть что-то, чего я здесь не хватает?

Ответы [ 4 ]

4 голосов
/ 18 августа 2010

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

Кроме того, используя live() или .delegate(), вы не можете использовать preventDefault() или stopPropagation(). Вам нужно вернуть false , чтобы предотвратить фазу пузыря и поведение по умолчанию.

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

Так что, либо создайте его полностью unobtrusive (что я настоятельно рекомендую), либо удалите этот встроенный обработчик кликов в коде.

* ** 1 022 тысяча двадцать-один * Пример:
$('#update-list').delegate('.popup-link', 'click', function(e){       
   $.popup();   // launch popup
   return false;
}).delegate('.update', 'click', function(){
   window.location('some_url');
})
// the rest of this is unnecessary if you can just omit the onclick attribute 
.find('.update')
  .removeAttr('onclick'); 

Ссылка: .delegate ()

0 голосов
/ 03 января 2016
 $('#update-list').delegate('.popup-link', 'click', function(e){       
  e.stopImmediatePropagation();
  e.preventDefault();
  // do something...
});
0 голосов
/ 18 октября 2012

Вы можете попробовать это, поскольку .delegate() был заменен методом .on().

Будет нормально работать

0 голосов
/ 18 августа 2010

Можете ли вы попробовать это?

$('#update-list').delegate('.popup-link', 'click', function(e){
    // e.target is <span> while e.currentTarget is .popup-link 
    e.stopPropagation();
    e.preventDefault(); // or return false

     // open popup in a timeout so that this function can return false
    window.setTimeout(function() {$.popup();}, 20);

    // for IE
    e.cancelBubble = true;
    return false;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...