JQuery $('form').serialize() 在 $('div.container').load() 之后不起作用

Posted

技术标签:

【中文标题】JQuery $(\'form\').serialize() 在 $(\'div.container\').load() 之后不起作用【英文标题】:JQuery $('form').serialize() not working after $('div.container').load()JQuery $('form').serialize() 在 $('div.container').load() 之后不起作用 【发布时间】:2019-02-24 10:49:07 【问题描述】:

我有一个带有通过 AJAX 调用更新的 div 的页面,如下所示:

<body>
    <div id="container">
        <div id="newinfo">
            <form id="selectform">
                Your name:<br>
                <input type="text" name="firstname"><br>
            </form> 
        </div>
    </div>
    <script>
        function reload_container() 
            $('#container').load('url/to/ajax/update');
            console.log($('#selectform').serialize());
        
    </script>
</body>

加载响应相同(包括表单 ID),但内容不同。

如果我从 Firefox 的调试控制台运行 reload_container();,但 serialize() 函数为空,但 $('#selectform') 确实已定义。

不过,我需要表单的内容。我不知道为什么 $('#selectform') 选择器在重新加载后会起作用,而 serialize() 却不会。非常感谢任何帮助。

请注意,表单的输入确实包含名称标签。 jQuery serialize not working 不相关。

更新:绑定到容器中元素的事件在 load() 之后也不起作用。例如。 $('#newinfo').click(function()alert('hi!'); 在正文加载脚本中。不过jQuery .live() vs .on() method for adding a click event after loading dynamic html

解决了这个问题

【问题讨论】:

你想序列化ajax请求的结果吗?你怎么称呼reload_container() 您可以使用on( events, selector, handler )定义委托事件 是的,我需要序列化,并且 reload_container 由 setInterval 触发 【参考方案1】:

这似乎工作正常。您的 ajax 处理程序可能有问题。希望这个例子对你有所帮助。 还做了一个在输入元素上使用委托input 事件的示例。

如果您需要帮助,请提供您的 ajax 处理程序。

//define delegate event so it triggers after inserting new elements (with ajax) too.
$('#newinfo').on('input', 'input[name=firstname]', function()
  console.log($(this).val());
);

//attach the reload_container function to the button for testing purpose
$('#reload').on('click', reload_container);

//This function mimics the result of your ajax request assuming you do something like this. It updates the form with a new form and run the serialize function on it.
function reload_container() 
  var ajaxResultMimic = '<form id="selectform">Your name:<br><input type="text" name="firstname" value="updated"><br></form>';
  $('#newinfo').html(ajaxResultMimic);
  console.log($('#selectform').serialize());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
    <button id="reload">reload</button>
    <div id="container">
        <div id="newinfo">
            <form id="selectform">
                Your name:<br>
                <input type="text" name="firstname"><br>
            </form> 
        </div>
    </div>
</body>

【讨论】:

你是对的,这确实工作正常。我的问题一定与此无关。谢谢。 @L.A.Rabida 是的,我认为您在 ajax 处理程序中做了一些删除 #selectform 元素或删除元素 id 的操作。或者不添加任何输入。【参考方案2】:

您应该在加载完成处理程序中执行您的代码。

$('#container').load('url/to/ajax/update', function() 
  console.log($('#selectform').serialize());
);

在此处查看示例http://api.jquery.com/load/

【讨论】:

谢谢,我试过了,但是 load 中的 serialize() 给了我相同的结果,serialize() 在成功 load() 后仍然给出一个空结果。此外,我稍后在 get 请求中提交表单时确实需要 serialize()。 在 ajax 处理程序之外使用 serialize() 非常好。

以上是关于JQuery $('form').serialize() 在 $('div.container').load() 之后不起作用的主要内容,如果未能解决你的问题,请参考以下文章

jquery如何获取form表单(id='form1')下的所有lable控件?

jquery自动将form表单封装成json的具体实现

jquery如何实现form提交无刷新返回一个页面

jQuery表单插件

jQuery插件 -- Form表单插件jquery.form.js

jquery----form插件