jquery после повторной загрузки щелчок не работает

#jquery #load #bind

#jquery #загрузить #привязать

Вопрос:

Ссылка открывает выпадающий список, чтобы выбрать действие сортировки. После сортировки страница загружается сама в себя с загрузкой jquery, и выпадающий список закрывается. Мы можем сделать это еще раз. После этого ссылка, которая открывает выпадающий список, больше не работает, и выпадающий список остается закрытым.

Как это исправить? Основная цель — иметь рабочее (открывающее и закрывающее) выпадающее меню для сортировки динамической таблицы. (выпадающий список также динамический, поэтому его необходимо загружать с помощью ajax-запроса)

 <div id="wrapper">

    <!-- THIS IS DROPDOWN -->
    <div id="sortdropdown">
    <p><a href="" id="sortn">Name</a><br /><a href="" id="sortd">Date</a></p>
    </div>
    <!-- THIS IS LINK TO OPEN DROPDOWN -->
    <p><a href="" id="sortbutton">Sort by</a></p>            

</div>

<script type="text/javascript">
function doLoad(sort){
    var selector = "div#wrapper";
    $(selector).load('indexsort.php?act=' sort ' ' selector, function(){
        $('div#sortdropdown').hide();
        doBindings();
    });
}
function doBindings(){
    //sorts table on click - sorts by name
    $('a#sortn').click(function(event) {
        event.preventDefault();
        doLoad('sn');
    });
    //sorts table on click - sorts by date
    $('a#sortd').click(function(event) {
        event.preventDefault();
        doLoad('sd');
    });
    //opens/closes sort by dropdown menu
    $('a#sortbutton').click(function(event) {
        event.preventDefault();
        $('div#sortdropdown').toggle();
    });
}
$(document).ready(function(){
    //binds clicks so they are active after load method
    doBindings();
    //hides dropdown after landing
    $('div#sortdropdown').hide();
});
</script>
  

Ответ №1:

Переместите привязки из функции doBindings() и используйте функцию live() от jQuery:

 $('a#sortbutton').live("click",function(event) {
    event.preventDefault();
    $('div#sortdropdown').toggle();
});
  

Кроме того, измените свои селекторы.

a#sortbutton менее эффективен, чем просто #sortbutton , как описано в jQuery API:

Для селекторов идентификаторов jQuery использует функцию JavaScript document.getElementById(), которая чрезвычайно эффективна. Когда к селектору идентификатора присоединяется другой селектор, такой как h2#pageTitle, jQuery выполняет дополнительную проверку, прежде чем идентифицировать элемент как совпадающий.

Комментарии:

1. более того, если я сделаю $ (‘a#sortbutton’). live (‘щелчок’, функция (событие)… тогда ссылка даже не работает после первой загрузки

2. Если вы используете live() , вам не нужно будет повторно запускать doBindings() каждый раз. live() ‘Прикрепите обработчик к событию для всех элементов, которые соответствуют текущему селектору, сейчас и в будущем.’ таким образом, вы должны просто иметь возможность поместить этот код на глобальный уровень.

3. Да! Это работает! Я поместил все в live () и из функции doBindings (). Спасибо!

4. @Marko: Круто 🙂 Я обновил свой ответ дополнительным описанием для следующего пользователя, который придет, и я также добавил улучшение производительности, которое вы должны реализовать.

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

Ответ №2:

Я думаю, вам нужно отвязать события click в функции doLoad перед вызовом indexsort.php файл.

Я не буду рекомендовать live, потому что это очень дорогой метод.

Комментарии:

1. У вас есть доказательства, подтверждающие, что это очень дорого? Мы говорим о дороговизне в пересчете на микросекунды?

2. Это тоже работает! Я добавил unbind для #sortbutton в функцию doLoad: $(‘a#sortbutton’).unbind(); Если это лучше, чем жить, тогда это решение

3. @Marko и @Town: Проверьте это . Перейдите к заголовку Предостережения.

4. Я действительно не вижу там ничего, что указывало бы на то, что производительность была бы заметно снижена при использовании live() в этом контексте. @Marko: Я думаю, что безопасно использовать то, что вы предпочитаете. Хотя определенно измените свои селекторы — a#sortbutton это излишне тяжело.