JQuery Mobile складной виджет свернуть и развернуть события не работает

У меня есть страница динамически создаваемых складных элементов JQuery 1.3.1 (не в гармошке), и я пытаюсь сохранить развернутое или свернутое состояние каждого элемента. Складные элементы работают нормально, без каких-либо обработчиков. Мой код для прикрепления обработчиков находится здесь, который я вызываю pagebeforeshow (Я пробовал в pageshow также):

function bindCollapsibleHistoryHandlers(){
    function getHandler(field, value){
        var handler = function(event, ui){
            var element = event.target.id;
            var id = (element.split('-'))[1];
            var status = window.mam_history.status('meetings', id);
            if (null == status){
                status = { "open": false, "note_open": false, "dist_open": false };
            }
            status[field] = value;
            var new_status = null;
            window.mam_history.status('meetings', id, status);
                        return true;
        }
        return handler;
    }

    $('.mtg_item').off('collapsiblecollapse');
    $('.mtg_item').on('collapsible', getHandler('open', false));
    $('.mtg_item').off('collapsibleexpand');
    $('.mtg_item').on('collapsibleexpand', getHandler('open', true));

    $('.dist_info').off('collapsiblecollapse');
    $('.dist_info').on('collapsiblecollapse', getHandler('dist_open', false));
    $('.dist_info').off('collapsibleexpand');
    $('.dist_info').on('collapsibleexpand', getHandler('dist_open', true));
}

Один из элементов HTML выглядит следующим образом в инспекторе Chrome:

Согласно документации JQuery Mobile 1.3.1, события, которые нужно перехватить, collapsiblecollapse а также collapsibleexpand, Когда я пытаюсь использовать их, обработчики событий никогда не вызывают. Глядя в Интернете, я заменил эти события на collapse а также expand, С их помощью обработчик события будет вызываться при щелчке на свертываемом объекте, но свернутый виджет не будет разворачиваться или разворачиваться ни до, ни после запуска обработчика. Это не просто визуальная проблема, потому что состояние складного, как прочитано с .collapsible('option', 'collapsed') тоже не изменилось.

Внутри обработчика я пробовал различные комбинации добавления или удаления ui-collapsible-collapsed класс или настройка collapsible вариант перед .trigger('create')и даже вызывая collapsiblecollapse а также collapsibleexpand внутри обработчика (когда он был связан с collapse а также expand, конечно). Удаление .off() линии не имели значения (я не могу себе представить, почему это будет). Ничто из того, что я пробовал до сих пор, не приведет к свертыванию или расширению складного объекта при нажатии на него, когда обработчик фактически выполняется, будучи привязанным collapse или же expand, Неважно, какой код на самом деле находится в обработчике, или у меня есть data-collapsed атрибут в <div> тег для начала или нет.

Так что, кажется, что-то мне не хватает, и я был бы признателен за любую помощь, чтобы увидеть ошибку в моем пути.

1 ответ

Решение

Решение

Рабочий пример: http://jsfiddle.net/Gajotres/3pCQh/

Поскольку у вас есть уведомления, правильным способом определения состояния сворачивания является использование события разворачивания и развертывания (информация, представленная в официальной документации, неверна). Также при связывании событий в jQuery Mobile особенно для динамически создаваемых объектов важно использовать делегированное связывание, например:

$(document).on( "collapse", "#test-collapsible", function( event, ui ){
    alert('Close');
});

$(document).on( "expand", "#test-collapsible", function( event, ui ){
    alert('Open');
});  

В этом примере неважно, существует объект или нет. Событие будет привязано к объекту документа и будет распространяться по правильному назначению, только если / когда объект станет доступным внутри DOM,

Несколько заметок

Если вы используете правильное событие страницы (например, pageinit) вам не нужно использовать off отменить привязку к событию. Pageinit сработает только один раз, точно так же, как документ готов при использовании с классическим jQuery.

Есть еще одна вещь. Если вы используете несколько HTML страниц вы должны быть осторожны с вашим JavaScript. Когда jQuery Mobile загружает дополнительные HTML страницы загружаются только BODY содержание, так что все внутри HEAD будут отброшены Это также может быть причиной того, что ваш пример кода не выполняется. Решения этой проблемы можно найти ЗДЕСЬ.

Другие вопросы по тегам