Выпуск селектора jQuery
-
30-09-2019 - |
Вопрос
У меня есть 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
без окончания ()
?