не может создать событие для загруженных элементов с помощью функции .load () в jquery - PullRequest
0 голосов
/ 19 декабря 2011

Для проекта мне нужно воссоздать механизм старых фреймов HTML, со статической панелью навигации в div и асинхронным изменением содержимого в другом div.

Я использовал jQuery «load» для загрузки htmlкод с внешних страниц в div контента;но когда я пытаюсь выполнить событие на них, я не могу.Почему так это?Что я могу сделать?

Любая помощь будет высоко оценена.

Заранее большое спасибо за помощь.

Мой HTML:

<body>

    <nav>
        <a href="#"><span>FIRST</span></a>
        <a href="#"><span>SECOND</span></a>
        <a href="#"><span>THIRD</span></a>
    </nav>

    <article></article>

</div>

Мой jQuery:

$('nav a').click(function() {
        var link = 'includes/'+clearLink($(this).children().html())+'.html';
        $('<div id="mainframe"></div>').appendTo('article').load(link);
});

Теперь в первомНа странице, которую я загружаю, есть какой-то элемент html, и я не могу с ними взаимодействовать, например

$('#switch').live('click', function() {

    $('#other-element-loaded-async').hide();
});

1 Ответ

0 голосов
/ 19 декабря 2011

Я подозреваю, что центральная проблема заключается в том, что вы получили недопустимый документ с несколькими элементами с одинаковым значением id. На самом деле, за исключением кода, который вы не обнаружили, у вас будет недействительный документ во второй раз, когда кто-то нажимает навигационную ссылку, потому что этот код:

$('<div id="mainframe"></div>').appendTo('article').load(link);

... добавляет a div с "mainframe" id к элементу article, не удаляя предыдущий. Таким образом, у вас будет два элемента с одинаковым идентификатором. Если загружаемый контент также использует значения идентификаторов (например, «switch» и «other-element -loaded-async»), вы также в конечном итоге продублируете их.

Вы должны убедиться, что у вас всегда есть не более один элемент с заданным идентификатором. Вы можете сделать это, заменив строку выше:

$('article').empty().append($('<div id="mainframe"></div>').load(link));

Рабочий пример здесь (я также исправил то, что, как я подозреваю, было ошибкой копирования и вставки в цитируемом HTML)

Если вы можете избавиться от окружающего «мэйнфрейма» div (поместив его в загруженный контент вместо кода), вы можете получить лучший пользовательский опыт, потому что нам не пришлось бы очищать article до на новый контент, поступающий с сервера. Код также становится проще:

$('article').load(link);

Оригинальный ответ :

Вы не предоставили достаточно информации, чтобы действительно ответить на ваш вопрос, но я думаю, ваш код выглядит следующим образом:

$("#target").load(url);
$("#target selector_for_loaded_content").bind("someevent", ...);

где это должно выглядеть так:

$("#target").load(url, function() {
    $("#target selector_for_loaded_content").bind("someevent", ...);
});

load происходит асинхронно , поэтому в первом блоке кода выше элементы еще не существуют, и поэтому они не подключаются. Во втором блоке кода мы используем обратный вызов функции load, поэтому мы ждем, чтобы подключить их, пока они не загрузятся.

Другой подход, в зависимости от того, какие события вы используете и что еще делаете с элементами после их загрузки, заключается в использовании delegate:

$("#target").load(url);
$("#target").delegate("selector_for_loaded_content", "someevent", ...);

delegate перехватывает событие на цели, но затем проверяет, достигло ли оно этой цели через что-то, совпадающее с селектором, и если это так, запускает функцию события (в основном), как если бы событие было перехвачено на элемент. Это очень удобно для динамических страниц, где вы создаете / удаляете много элементов.

Если вы используете jQuery 1.7 или более позднюю версию, в то время как delegate все еще там, вы также можете использовать новый on, который, по словам команды jQuery, является способом продвижения для всех перехватов событий:

$("#target").on("someevent", "selector_for_loaded_content", ...);

Обратите внимание, что порядок аргументов отличается от delegate и on.

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