2010-11-01 65 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

相關問題