2010-11-23 47 views
2

我正在使用帶有textarea的對話框。點擊確定按鈕後,textarea的值會通過ajax發送到服務器。
用戶第一次寫入textarea時,值會被正確讀取,但在所有後續操作中,發送的值與第一次相同,就好像用戶反覆輸入了相同的字符串一樣。jquery對話框只讀取一次textarea值

function message(url) { 
    var mydiv; 
    mydiv = $(document.createElement('div')); 
    mydiv.html("enter message: <textarea name='message' id='message'/>"); 
    mydiv.dialog(setProps(url)); 
    mydiv.dialog('open'); 
} 

function setProps(url) { 
    return { 
    buttons: { 
     "ok": function() { 
     $.get('/act?url=' + url + '&message=' + $("#message").val().trim(), 
      function(data) { 
      $("#content").load('/react?url=' + url); 
      } 
     ); 
     $(this).dialog("close"); 
     $(this).dialog("destroy"); 
     // If I use the following all subseq. actions are empty: 
     // $("#message").val(''); 
     } 
    } 
    } 
} 
+0

我懷疑,問題是多次嘗試添加id ='message'的元素(因爲id需要是唯一的)。用class ='message'替換它可能會解決你的問題。 – 2010-11-23 10:38:19

+0

@conqenator - `.val()`仍然會得到* first *元素的值。 – 2010-11-23 10:41:07

回答

5

當你創建一個對話框,它被附加在<body>結束,只是因爲你破壞了對話並不意味着它的元素消失,他們只是回到了自己的位置,或者在這種情況下,仍然在<body>結束,還需要.remove()這些元素,像這樣:

$(this).dialog("destroy").remove(); 

否則(目前)你每次加一個#message元素,和你'看到是一個經典的重複ID問題,它是ge設定第一個值(您從未離開過的第一個值)。


總有一些更多的問題,例如IE < 9不必String.prototype.trim()所以你的價值將炸燬,具有像它&什麼會。讓jQuery對您的值進行編碼,如下所示:

function message(url) { 
$("<div>enter message: <textarea name='message' id='message'></textarea></div>") 
    .dialog(setProps(url)); 
} 

function setProps(url) { 
    return { 
    buttons: { 
     "ok": function() { 
     $.get('/act', { url: url, message: $.trim($("#message").val()) }, 
      function(data) { 
      $("#content").load('/react?url=' + url); 
      } 
     ); 
     $(this).dialog("destroy").remove(); 
     } 
    } 
    } 
}