Javascript jQuery append在下一条语句之前是否未完成?
我有一个调查类型的表单,它是从客户端的web数据库填充的。我可以很好地填充问题,但是我尝试在存在现有答案编辑场景的情况下遍历并触发单击事件,我发现DOM中还没有新元素,所以这不起作用。代码如下:Javascript jQuery append在下一条语句之前是否未完成?,javascript,jquery,Javascript,Jquery,我有一个调查类型的表单,它是从客户端的web数据库填充的。我可以很好地填充问题,但是我尝试在存在现有答案编辑场景的情况下遍历并触发单击事件,我发现DOM中还没有新元素,所以这不起作用。代码如下: $(function() { var db = openDatabase(...); db.transaction(function(tx) { tx.executeSql("select ....", [surveyId], function(tx, results)
$(function() {
var db = openDatabase(...);
db.transaction(function(tx) {
tx.executeSql("select ....", [surveyId], function(tx, results) {
var items = "", answers = [];
for (var i = 0; i < results.rows.length; i++) {
var id = results.rows.item(i).id;
items += "<div><input type='radio' name='q-" + id + "' id='q-" + id + "-1' /><label for='q-"+id+"-1'>Yes</label><input type='radio' name='q-" + id + "' id='q-" + id + "-2' /><label for='q-"+id+"-2'>No</label></div>";
if (result.rows.item(i).answer) {
answers.push('#q-'+id+'-'+results.rows.item(i).answer);
}
}
$('#questions-div').append(items);
$.each(answers, function(i, e) { $(e).click(); });
});
});
});
有什么建议可以让这项工作更有效,或者更有效吗?我想:
answers.push('#q-'+id+'-'+result);
你想推动这个:
answers.push('#q-'+id+'-'+result.rows.item[i].answer);
否则,您将使用“q-XX-[object object]”作为选择器,我认为您在使用1或2版本的“q-XX-1”。我怀疑这实际上是一种竞争条件。我敢打赌,如果你在一个小小的延迟后执行你的每一条语句,事情就会如预期的那样进行。是这样的,原因是当您以编程方式插入新元素时,您无法100%确定浏览器何时会真正开始更新DOM。我不确定最好的解决方案是什么:如果你在附加事件,我会说你应该在构建元素的同时进行;但是如果你触发点击,我倾向于持续测试元素的存在性,然后在你知道它们存在时触发点击 所以我想出了一个解决方案: 我替换了行项目+=。。。。与 。。。这意味着我不再需要答案数组或触发单选按钮上的点击事件
我希望能有点整洁,但这似乎行得通。感谢@Nick Craver和@Andrew帮助我实现了这一目标 @Nick抱歉,打字错误,正在整理代码以使其成为网络-friendly@Jon-什么是项目I?这不是一个合适的数组访问器,应该是。项[i]…如果您不发布实际代码,我们无法帮助您,发布时不要更改所有代码…您只会引入新的无关问题。@Nick我不是100%确定-web SQL数据库查询中的result.rows对象似乎不是数组。我一直在工作-它使用它,这一部分在我的代码中运行良好。我刚从代码中删除了一些机密的东西,我把它弄糟了…@Nick-这看起来像是用于Safari或Mobile Safari的。这就是您迭代本地记录集的方式……并从该链接引用回调函数再次接收事务对象和结果对象。results对象包含一个rows对象,它类似于数组,但不是数组。它有一个长度,但要访问单独的行,您需要使用results.rows.itemi,其中i是行的索引。@mikerobi,我也是,如果我之前遇到了一点问题,我也很抱歉,我试图这么做,但正如Nick回答的评论流中所述,如果我提醒选择器的长度为1,这将是我检测到它们在那里…如果用以下内容替换最后一行会发生什么:setTimeoutfunction{$.eachanswers,functioni,e{$e.click;};},1000;这似乎有时起作用,这无疑表明了一种种族状况。我想出了一个解决办法——看看我的答案。。。
var item = "<div><input type='radio' name='q-" + id + "' id='q-" + id + "-1' ";
if (results.rows.item(i).answer == 1) item += "checked ";
item += "/><label for='q-"+id+"-1'>Yes</label><input type='radio' name='q-" + id + "' id='q-" + id + "-2' ";
if (results.rows.item(i).answer == 2) item += "checked ";
item += "/><label for='q-"+id+"-2'>No</label></div>";
items += item;