Вопрос

У меня есть Div, который в документе jQuery готов, я добавил - используя $("#div id").append('html text') Синтаксис - с 10 или столь более детьми детьми элементами.

Как только это будет сделано, я пытаюсь проверить содержание детей Divs через alert($(".classname")); И это возвращается с:

function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)}

Я бы ожидал, что он предупреждает с HTML содержимым ребенка Divs и не JavaScript?

Полный скрипт:

<script type="text/javascript">
    $(document).ready(function(){

        // twitter api's base url
        var url="http://search.twitter.com/search.json?callback=?&result_type=recent&q=";
        // we'll store the search term here
        var query = "blah";
        // get the json file
        $.getJSON(url+query,function(json){
            // this is where we can loop through the results in the json object
            $.each(json.results,function(i,tweet){
                // this is where we do what we want with each tweet
                $("#results").append('<div class="tweetBox"><span class="unseen">'+tweet.created_at+'</span><div class="tweetImg"><img src="'+tweet.profile_image_url+'" width="48" height="48" /><a class="overbox" href="http://twitter.com/'+tweet.from_user+'/status/'+tweet.id+'"></a></div>'+tweet.text+' ...said '+((new Date().getTime()/1000/60)-(new Date(tweet.created_at))/1000/60).toFixed(0)+' minutes ago</div>');

            });
        });

        $("#results").height(function(){return $(window).height()-204;});
        alert($(".unseen").html());     
    });
</script>

<div id="results"></div>

Обновление: определенно какой-то состояние гонки jQuery / JavaScript здесь, если я заменил предупреждение с setTimeout(function(){alert($(".unseen").html());},1000); Это возвращает ожидаемый текст. Если я изменим паузу тайм-аута до 1 миллисекунды, она возвращается null снова.

Не уверен в «реальном» обходном пути для этого, кроме прилипания в задержке?

Это было полезно?

Решение

Ajax звонки (как $.getJSON) делаются асинхронно.

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

Вы должны переместить весь код, который зависит от элементов, созданных из ответа в функции обратного вызова (справа после $.each(...);)

Бывший:

$.getJSON(url+query,function(json){
    // this is where we can loop through the results in the json object
    $.each(json.results,function(i,tweet){
        // this is where we do what we want with each tweet
        $("#results").append('<p>this element is created only when the callback is triggered</p>');
    });
    // do stuff here with all your created elements
    alert('found '+$(".unseen").length+' objects');
});

Также обратите внимание, что HTML () Функция Возвращает HTML содержимое только первого элемента в наборе.

Редактировать: Ваш Timeout Trick работает, потому что он дает Ajax Call The Time, необходимое для завершения и запуска функции обратного вызова, которая рекламирует объекты до DOM.

См. Рабочий пример здесь.

Другие советы

Пытаться

alert($('.classname').html());

Я не понимаю, почему он вернул текст функции; Вы уверены, что вы только что имели $('.classname') в твоем alert() вызов? Может быть, вы имели $('.classname').html без окончания ()?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top