Jquery 对话框仅读取一次文本区域值

发布于 2024-10-04 07:18:44 字数 826 浏览 6 评论 0原文

我正在使用带有文本区域的对话框。单击“确定”按钮后,文本区域的值将通过 ajax 发送到服务器。
用户第一次写入文本区域时,值会被正确读取,但在所有后续操作中,发送的值与第一次相同,就好像用户一遍又一遍地输入相同的字符串一样。

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

I am using a dialog with a textarea. Upon clicking the ok-button the textarea's value gets sent to a server via ajax.
The first time the user writes to the textarea the value gets read correctly, but upon all subsequent actions the value being sent is the same as the first time as if the user had entered the same string over and over again.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇女薄笑 2024-10-11 07:18:44

当您创建对话框时,它会附加到 的末尾,仅仅因为您销毁对话框并不意味着其中的元素会消失,它们只是返回到它们的位置,或者在本例中仍然位于 的末尾,您还需要 .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(); 
      }
    } 
  } 
} 

When you create a dialog it gets appending at the end of the <body>, just because you're destroying the dialog doesn't mean the elements in it go away, they're just returned to their location, or in this case still at the end of the <body>, you also need to .remove() those elements, like this:

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

Otherwise (currently) you're adding a new #message element each time, and what you're seeing is a classic duplicate ID issue, it's getting the value of the first one (the first you appended...that never left).


Overall there are a few more issues, for example IE<9 not having String.prototype.trim() so your value would blow up, as would having anything like & in it. Let jQuery encode your values, like this:

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(); 
      }
    } 
  } 
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文