2

我正在使用带有文本区域的对话框。单击确定按钮后,textarea 的值将通过 ajax 发送到服务器。
用户第一次写入 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(''); 
      }
    } 
  } 
} 
4

1 回答 1

5

当您创建一个对话框时,它会附加到<body>.的<body>,你还需要.remove()那些元素,像这样:

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

否则(当前)您每次都添加一个 #message元素,而您看到的是一个经典的重复 ID 问题,它正在获取第一个元素的值(您添加的第一个元素......从未离开过)。


总的来说,还有一些问题,例如 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(); 
      }
    } 
  } 
} 
于 2010-11-23T10:36:54.120 回答