【问题标题】:Accessing form elements using jquery and DOM使用 jquery 和 DOM 访问表单元素
【发布时间】:2011-05-05 09:22:08
【问题描述】:

这是表格

<form method="post">

    <input type="hidden" name="resulttype" value="Create">              
    <table>
        <tr>
            <td>Name</td>           
            <td><input type="text" id="name" value="Abhishek"/></td>
        </tr>
        <tr>
            <td>User Name</td>
            <td><input type="text" id="username" name="username" value="AbhishekSimion"></td>
        </tr>
        <tr>
            <td>Email</td>
            <td><input type="text" id="email" name="email" value="a@a.com"></td>
        </tr>
        <tr>
            <td>Department</td>
            <td><input type="text" id="department" name="department"></td>
        </tr>
        <tr><td colspan="2"><input type="button" id="button" value="Done!"></td></tr>
    </table>
</form>

这里是 Javascript 部分

var x = document.getElementById("name");
var email = $("input#email").val();  

var dataString = 'name='+ x + '&email=' + email;
$(function() {
$("#button").click(function() {
    callme();
    });
  });
function callme()
{
    alert(dataString);
    var msg = $.ajax({
        type: "POST",
        url: "/temp/AjaxPostSend",
        data: dataString,
        async: false,
        success: function(html){
          alert( "Data Saved: " + msg );
        }
     }).responseText;

}

为什么我的提醒框中会显示“name=null&email=undefined”消息?这里有什么问题?

注意:我使用的是 JQuery v1.5.2

【问题讨论】:

  • 可以序列化表单并使用ajax发送,而不是手动连接所有值。

标签: javascript jquery html dom


【解决方案1】:

至少 email 值应该可以工作...

无论如何,不​​要手动创建字符串。将data 设置为包含值的对象:

data: {name: $('#name').val(), email: $('#email').val()},
// or
data: $('#yourformID').serialize(),

这样,jQuery 将负责正确的转义。

还要注意,ID 必须是唯一的。如果您在页面更远的位置有其他具有相同 ID 的元素,它将不起作用。然后更改 ID。

更新:

您的代码流程不正确。这部分:

var x = document.getElementById("name");
var email = $("input#email").val();  

var dataString = 'name='+ x + '&email=' + email;

将在页面完成加载之前执行。这意味着 (a) 元素尚不可用,并且 (b) 即使它们可用,用户也无法输入任何信息。

您必须在要发送表单时读取值

$(function() {
    $("#button").click(callme);

    function callme() {      
        $.ajax({
            type: "POST",
            url: "/temp/AjaxPostSend",
            data: {name: $('#name').val(), email: $('#email').val()},
            success: function(msg){
                alert( "Data Saved: " + msg );
            }
         });
    }

});

还要注意

var msg = $.ajax({...}).responseText;

将无法工作,因为 Ajax 请求是异步。这意味着callme() 将在 Ajax 响应可用之前返回。响应文本可用作 success 回调的参数。

更正: 我看到了async: false,但我的大脑似乎有点错误;)在这种情况下,上述语句确实有效。但是你应该避免同步 Ajax(应该称为 Sjax)调用它阻塞客户端。

【讨论】:

    【解决方案2】:

    要使用纯 JavaScript 获取输入的值,您必须访问名为 value 的变量。

    var x = document.getElementById("name").value;
    

    您的第二个变量应该可以按预期工作,但是可以省略选择器的输入,因为 ID 始终是唯一的,并且可以为您节省几个字节。

    var email = $("#email").val();
    

    此外,还有一种使用 ajax 发送表单的更简单方法。序列化表格。通知data: ...

    var msg = $.ajax({
            type: "POST",
            url: "/temp/AjaxPostSend",
            data: $("form").serialize(),
            async: false,
            success: function(html){
              alert( "Data Saved: " + msg );
            }
         }).responseText;
    

    【讨论】:

      【解决方案3】:

      试试这个

      var myname = $('#name').val()
      var mymail = $('#email').val();
      

      DEMO

      你也可以像下面这样使用

      数据:{姓名:我的姓名,电子邮件:我的邮件}

      var msg = $.ajax({
              type: "POST",      
              url: "/temp/AjaxPostSend",
              data: { name: myname, email: mymail }
              async: false,
              success: function(html){
                alert( "Data Saved: " + msg );
              }
           }).responseText;
      

      更新

      试试

      &lt;input type="text" id="myname" name="myname" value="Abhishek"/&gt; 然后
      var myname = $('#myname').val()

      用于通过 POST 发送日期

       data: $('#yourformID').serialize(),
      

      【讨论】:

      • @diEcho:我得到这个“name=undefined&email=undefined”
      • 怎么可能??看演示......还有一件事是好的做法永远不会设置id=name..它会导致混乱..设置别的东西
      • @diEcho:即使我在 JSFiddle.net 上尝试过,这里 jsfiddle.net/abhisheksimion/AE9eB/2 电子邮件正在工作
      • @diEcho:它可以在 jsFiddle 中运行,但不知道我的机器出了什么问题?这就是为什么我把这个问题放在这里
      • @AbhishekSimon:请参阅文档:api.jquery.com/serializeapi.jquery.com/ajax success 在请求成功时被调用(即响应不是 404 或 500 或相似的东西)。请求完成时调用complete
      【解决方案4】:

      改变

      var x = document.getElementById("name");
      var email = $("input#email").val();  
      

      var x = $("#name");
      var email = $("#email").val();  
      

      还有,这部分:

      var x = $("#name");
      var email = $("#email").val();  
      var dataString = 'name='+ x + '&email=' + email;
      

      需要在 callme() 函数调用之前像这样:

      var dataString;
      $(function() {
      $("#button").click(function() {
          var x = $("#name");
          var email = $("#email").val();  
          dataString = 'name='+ x + '&email=' + email;
          callme();
          });
        });
      

      【讨论】:

      • 我得到“name=[object Object]&email=undefined”
      【解决方案5】:

      因为,

      'x' 中的值是一个对象而不是字符串,我认为 '$("input#email")' 的语法是错误的。试试$(":input[id='email']").val()

      【讨论】:

      • 我得到这个“name=undefined&email=undefined”
      • 在这里试试 jsfiddle.net/abhisheksimion/AE9eB/2 只有电子邮件在工作,它在我的项目中也不起作用,即在我的机器上
      • 如果您第一次看到该消息当然是空的。问题是这个事件的绑定将在 Bowser 调用整个页面之前执行。制作一个更简单的方法,只显示在事件 document.ready 处执行的警报。
      • 我还收到了消息'name=[object Object]&email=undefined'。我要说的是,方法“getElemntsById()”返回一个对象而不是字符串。你想要的是'x.value'。
      • 见@Felix Kling 的回复,这个问题有一个很好的答案
      【解决方案6】:

      不知道为什么电子邮件会给你未定义的值,但对于名称,它应该如下所示:

      var x = document.getElementById("name").value;
      

      var x = $('#name').val();
      

      【讨论】:

        猜你喜欢
        • 2014-03-18
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        相关资源
        最近更新 更多