问题描述
||
非常感谢您的帮助,因为我一遍又一遍地寻找并完全迷失了可能出问题的地方。
我有一个对Web服务的Ajax调用,并且通过此调用,我正在构建一些HTML结构。到目前为止,一切都很好,数据被提取,我可以从视觉上看到结构。
但是,随着代码的继续,我稍后尝试读取这些元素以进行更多操作,JavaScript根本看不到它们,并且在元素计数上,我的计数为零。
项目中的一些相关代码。
该函数首先运行,并基本构建所需的HTML片段
$.ajax({
type: \"POST\",url: \"HistoryEventsWebService.asmx/getEventsData\",data: event_types,contentType: \"application/json; charset=utf-8\",dataType: \"json\",success: function (result) { //on success
var results = result.d;
$(\'#insidediv_container\').empty();
for (var i = 0; i < results.length; i++) {
var insidediv = \'\';
insidediv += \'<div class=\"insidediv\">\';
insidediv += \'<span class=\"month\">\' + results[i].month + \'</span><span class=\"day\">\' + results[i].day + \'</span><span class=\"year\">\' + results[i].year + \'</span>\';
insidediv += \'<div class=\"header\"><span>Jan 08,2010 - event one</span> </div>\';
insidediv += \'<div class=\"contentdiv\">\' + results[i].event_desc + \'</div>\';
insidediv += \'</div>\';
$(\'#insidediv_container\').append(insidediv);
}
}
});
return false;
在完成上一个功能之后,我的代码将继续执行下一个功能,这就是我遇到的问题!
var currentBox = 0;
var current_Box_old = 0;
var Box_size = ($(\'.insidediv\').width() + 1).toString();
var Box_count = $(\'.container2 > div > div\').length - 1;
//console.log(Box_count);
var min_range = 0;
setScale(); //making slider visual elements
//slider code
$(\"#slider\").slider({
min: min_range,max: Box_count,value: 0,animate: true,//step: 1,slide: function (event,ui) {
current_Box_old = currentBox;
currentBox = ui.value;
if (currentBox > current_Box_old)
$(\'#insidediv_container\').animate({ \"margin-left\": \"-=\" + Box_size + \"px\" },\"normal\");
else
$(\'#insidediv_container\').animate({ \"margin-left\": \"+=\" + Box_size + \"px\" },\"normal\");
}
});
先感谢您。
解决方法
这不起作用的原因是,您要执行的所有代码都必须在ajax成功方法内。因为ajax发布是异步的,所以ajax方法几乎立即“返回”,并且流程立即流到第二个代码块。但是,由于它到达的速度如此之快,因此ajax帖子尚未收到它的结果,因此尚未调用成功方法,这反过来意味着您要查找的元素具有尚未插入DOM。
如果这些是您的代码正在执行的粗略模块化步骤:
$ .ajax(A)-> http post(B)->成功(C)->向DOM添加元素(D)
|
v
更新新的DOM元素(E)
那么实际的代码流是A,B,E,C,D,而不是A,B,C,D,E。
希望这可以帮助!
,显然,JQuery Ajax具有完成的功能。最后,我将第二段代码包装到函数中,并从完整的位置进行了调用。
谢谢大家的帮助。