Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery append在下一条语句之前是否未完成?_Javascript_Jquery - Fatal编程技术网

Javascript jQuery append在下一条语句之前是否未完成?

Javascript jQuery append在下一条语句之前是否未完成?,javascript,jquery,Javascript,Jquery,我有一个调查类型的表单,它是从客户端的web数据库填充的。我可以很好地填充问题,但是我尝试在存在现有答案编辑场景的情况下遍历并触发单击事件,我发现DOM中还没有新元素,所以这不起作用。代码如下: $(function() { var db = openDatabase(...); db.transaction(function(tx) { tx.executeSql("select ....", [surveyId], function(tx, results)

我有一个调查类型的表单,它是从客户端的web数据库填充的。我可以很好地填充问题,但是我尝试在存在现有答案编辑场景的情况下遍历并触发单击事件,我发现DOM中还没有新元素,所以这不起作用。代码如下:

$(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;