代码之家  ›  专栏  ›  技术社区  ›  Jon

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

  •  1
  • Jon  · 技术社区  · 16 年前

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Nick Craver    16 年前

    我想在这里:

    answers.push('#q-'+id+'-'+result);
    

    answers.push('#q-'+id+'-'+result.rows.item[i].answer);
    

    否则你就会 '#q-XX-[object Object]' 认为 你在追求 1 2 版本 '#q-XX-1' .

        2
  •  1
  •   Andrew    16 年前

    我怀疑这实际上是种族问题。我敢打赌如果你 each 声明稍有延迟,事情就会如期而至。因此,原因是当您以编程方式插入新元素时,您无法100%确定浏览器何时真正能够更新DOM。我不知道最好的解决方案是什么:如果你附加了事件,我会说你应该在构建元素的同时进行;但是如果你是 触发 点击后,我倾向于不断地测试元素的存在,然后一旦知道它们在那里就触发了点击。

        3
  •  0
  •   Jon    16 年前

    所以我想出了一个解决办法:

    我换了线 items += "<div> ...." 具有

    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;
    

    我本想找点更整洁的,但似乎没问题。感谢@Nick Craver&@Andrew帮我达到目的!