【问题标题】:.serialize() returns empty dict. What do i do wrong?.serialize() 返回空字典。我做错了什么?
【发布时间】:2011-03-02 20:26:18
【问题描述】:

这有什么问题? .serialize() 什么都不返回。我已经尝试了几种方法来做到这一点,但最终都是空字典。表单,输入,#idofform,#idofinput,什么都没有发生......

 
$(document).ready(function(){
    $.post("/resultjs/", $("form").serialize(), function(data) {
            $('.content').html(data);
            });
});
...和 ​​html。只是一个普通的简单形式。完全清楚:我想从表单中收集帖子数据,将它们发布到 /resultjs/ (django),检索结果并将其写入 .content div
 

<div id="search">   

<form action="/resultjsall/" method="post"><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='somedjangocsrftoken' /></div>

<input type="text" name="what" id="what" value="" size="80" />
<input type="submit" value="Find" />
</form>
</div>

【问题讨论】:

  • 您的表单内容是什么?仅支持部分表单元素。
  • 此外,如果您有超过 1 个表单,这将序列化所有表单中的数据并将其聚合为单个字符串。通常不是您想要的,因为您只提交一个表单。
  • 如果您在文档准备好时运行它,您的表单可能是空的,所以很可能您最终会发送变量但没有值(即.serialize() 将返回类似 @ 987654324@)
  • 记住序列化是基于表单中输入元素的 name 而不是 id,就像平常一样...确保输入在表单中有name 属性
  • @Dan 我认为你应该发表你的评论作为答案

标签: jquery ajax django serialization


【解决方案1】:

仅在提交函数时发送您的$.post(因此事件处理程序&lt;form_selector&gt;.submit( ... ),请参阅.submit()

请注意,我保留了 $(document).ready 部分。这样做的目的是在执行诸如将事件绑定到 DOM 中的元素(例如该表单)之前等待所有其他脚本和 DOM 加载,因为如果您要绑定的元素没有在绑定执行时,什么都不会发生。

$(document).ready(function() {
    $("form#myForm").submit(function() {
        $.post($(this).attr("action"), $(this).serialize(), 
          function(data) {
            if (data == "") { alert("No data returned!"); return; }
            // otherwise set the content div to the data we received
            $('div.content').html(data);
          }
        );
        // disable normal submitting of the form since we use ajax now
        return false;
    });
});

【讨论】:

    【解决方案2】:

    您需要将表单提交绑定到点击提交按钮。改为这样做:

    $(document).ready(function() {
        $("form input[type='submit']").click(function() {
            $.post($("form").attr("action"), $("form").serialize(), function(data) {
                $('.content').html(data);
            });
            return false;
        });
    });
    

    【讨论】:

    • 它是form:input,选择器.input 查找input 类的元素:) 一个好主意是也用id/name/anything 限定表单(如@987654325 @ 和"form#formId:input[type='submit']",以防你在某个时候添加另一个表单,因为它会中断。
    • 你是对的,选择器错了。实际上我宁愿看到“表单输入”,因为我选择的是输入,而不是表单本身。是的,我意识到没有指定 ID,但是给出的代码没有包含它,而不是专注于其他事情,我想专注于表单未提交的主要问题。感谢您的评论。
    • 是的。我现在明白了。非常感谢大家。
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2019-06-10
    • 2011-08-17
    相关资源
    最近更新 更多