Как предотвратить распространение события клика по заголовку аккордеона? - PullRequest
3 голосов
/ 10 июня 2011

У меня проблема с плагином jquery sortable. Действительно, у меня есть предметы (вопросы), которые используют и аккордеон, и сортируемые.

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

Но моя проблема в том, что после сортировки вопросов аккордеон того, который я переместил, автоматически открывается.

Вот простой пример, который воспроизводит проблему: http://jsfiddle.net/JwzH2/1/

Попробуйте отсортировать вопросы, и вы увидите, как открывается сам аккордеон (иногда он может работать правильно, поэтому попробуйте еще раз).

У кого-нибудь есть идеи, как это исправить?

РЕДАКТИРОВАТЬ: Fosco дала мне частично работающее решение, но все еще есть проблема => оно не работает с динамически добавленными элементами (см. Мои комментарии к его ответу).

Более того, я все еще удивляюсь, когда код работает без этой строки: $('.hidden-content', question).show();. Действительно, распространение события должно быть одинаковым с этой строкой и без нее

http://jsfiddle.net/JwzH2/38/

1 Ответ

7 голосов
/ 10 июня 2011

Я полагаю, что ваш ответ лежит здесь в примере кода из jQuery UI: http://jqueryui.com/demos/accordion/sortable.html

$(function() {
    var stop = false;
    $( "#accordion h3" ).click(function( event ) {
        if ( stop ) {
            event.stopImmediatePropagation();
            event.preventDefault();
            stop = false;
        }
    });
    $( "#accordion" )
        .accordion({
            header: "> div > h3"
        })
        .sortable({
            axis: "y",
            handle: "h3",
            stop: function() {
                stop = true;
            }
        });
});
</script> 

Обратите внимание на использование переменной stop, а также на то, как она перехватывается и обрабатывается при сортировкемеханизм и обработчик щелчков.

Редактировать: Сегодня утром я потратил немного времени, играя с проблемой динамического контента, и вот что я придумал.Когда добавляется новый предмет, я уничтожаю и перезагружаю аккордеон и соответствующие обработчики кликов.Я переместил настройку обработчика щелчка и настройки аккордеона в функции и вызывал их изначально и при добавлении нового элемента.Это происходит так быстро, что я не вижу никаких мерцаний или визуальных проблем, но ваш пробег может отличаться.Дайте ему шанс здесь: http://jsfiddle.net/JwzH2/41/

...