Сбой селектора jquery на загруженном содержимом ajax - PullRequest
1 голос
/ 05 декабря 2010

У меня есть диалог, который загружается через AJAX. Paylaod этого ajax содержит как html, так и javascript.

Диалоговое окно отображается очень хорошо, и JS, включенный в эту полезную нагрузку, выполняется.

Однако я не могу выбрать какие-либо элементы (по идентификатору, классу или типу элемента) из JS в полезной нагрузке.

допустим, что полезная нагрузка имела:

<div>
   <ul id="testid">
     <li>A</li>
     <li>B</li>
   </ul>
</div>
<script type="text/javascript">
    $(document).ready(function() {
        console.info('test: ' + $("#testid").length);
    });
</script>

Это приводит к тесту: 0 появляется в консоли.

Если я переключаю селектор на «тело», то это приводит к ненулевому значению.

Очевидно, что загруженный контент отображается, и JS, который в нем содержится, выполняется, и я понимаю, что вызов .ready () должен позволить обновлять время DOM, включая полезную нагрузку html.

К сожалению, в этом случае у меня нет прямого контроля над самой загрузкой ajax, так как я использую инфраструктуру, которая выполняет функции диалога для меня (zotonic).

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

Я немного растерялся из-за того, почему только это идет не так. Я провел тщательную проверку и искал в Google и т. Д. Последние пару дней без решения, поэтому подумал, что буду звать на помощь здесь.

Jason

1 Ответ

0 голосов
/ 06 декабря 2010

Я считаю, ready работает только при первой загрузке страницы.Если вы зависите от результата вызова AJAX, вам нужно использовать обратный вызов, поскольку операция асинхронная.Zotonic предлагает вам какие-нибудь крючки, которые вы можете использовать?В противном случае это будет немного сложнее.Возможно, вы можете опрашивать DOM следующим образом при загрузке страницы:

<script type="text/javascript">
    $(document).ready(function() {
        var interval = setInterval(function() {           
            if($("#testid").length > 0) {
               clearInterval(interval);
               console.info('test: ' + $("#testid").length);
            }
        }, 750);
    });
</script>

Это будет запрашивать их страницу каждые 750 мс для #testid.Если он находит элемент, интервал отменяется, и вы должны получить консольный вывод.

...