2010-11-01 70 views
1

我有一个调查类型的表单,正在从客户端上的Web数据库填充。我可以填充问题的罚款,但然后我尝试通过并触发点击事件现有的答案(编辑方案),我发现新的元素还没有在DOM中,所以这是行不通的。下面的代码:在下一个语句之前jQuery追加没有完成?

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

任何提示,我怎样才能使这项工作,或更好的一般?

+0

撤回了我的评论。 – mikerobi 2010-11-01 23:31:48

+0

@mikerobi,我也是,对不起,如果我过来有点强大 – Jon 2010-11-01 23:33:16

回答

0

于是我想出了一个解决方案:

我取代了线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帮助我抵达它!

1

我觉得这里:

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

你的意思是推这样的:1或之后

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

否则你得到'#q-XX-[object Object]'作为选择,在这里我想2版本的'#q-XX-1'

+0

@尼克抱歉,错字,正在整理代码,使其“网络友好” – Jon 2010-11-01 23:31:09

+0

@Jon - 什么是'.item(i)'?这不是一个合适的数组访问器,它应该是'.item [i]'...如果你没有发布你的实际代码,我们不能帮你,不要在发布时更改所有的代码。你只是介绍新的无关紧要的问题。 – 2010-11-01 23:33:22

+0

@Nick我不是100%确定 - 它看起来从web SQL数据库查询result.rows'对象不是一个数组。我一直在从http://html5doctor.com/introducing-web-sql-databases/工作 - 它使用它,并且该部分在我的代码中正常工作。我只是删除了代码中保密的东西,然后我搞砸了一点点...... – Jon 2010-11-01 23:38:12

1

我怀疑这实际上是一种竞争条件。我敢打赌,如果你在很短的延迟后执行你的each声明,事情将按预期工作。是这样的,其原因在于,当你编程插入新元素时,浏览器实际上会更新DOM来确保浏览器无法完全确定。我不确定最好的解决方案是什么:如果你附加事件,我会说你应该在你构建元素的同时去做;但如果你是触发的点击,我倾向于不断测试元素的存在,然后在知道它们在那里时触发点击。

+0

我之前想这么做,但是在尼克回答的评论流中,如果我提醒选择器的长度为1 ,这将是我的检测,他们在那里... – Jon 2010-11-02 00:06:24

+0

如果你用这个替换最后一行会发生什么:'setTimeout(function(){$ .each(answers,function(i,e){$(e) .click();}); },1000);' – Andrew 2010-11-02 00:14:28

+0

它有时似乎有效,这肯定表明竞争条件。我想出了一个解决方法 - 查看我的答案... – Jon 2010-11-02 00:33:16

相关问题