【问题标题】:Form submit in DIV using jQuery使用 jQuery 在 DIV 中提交表单
【发布时间】:2009-08-12 14:52:46
【问题描述】:

我指的是类似于the one in this post 的问题,因为那里描述的解决方案对我不起作用。

起点是一个带有 jQ​​uery UI 选项卡的 HTML 页面(称为配置文件):

<div id="tabs"> 
    <ul> 
        <li><a href="#realtab">Foo Bar</a></li> 
        <li><a href="?cmd=changePassword" title="pwd-settings">
                        <span> Dynamic tab </span>
            </a></li>
    </ul>
</div>

在 DIV 中呈现的 HTML 是:

<form method="post" id="subform" action="http://myhost.com/example.php">
    <input type="hidden" name="cmd" value="submitChangedPassword">

    <dl>
        <dt>PWD1</dt>
        <dd><input type="password" name="password" /></dd>

        <dt>PWD CHK</dt>
        <dd><input type="password" name="passwordChk" /></dd>

        <dt>&nbsp;</dt>
        <dd><input type="submit" value=" Apply " /></dd>
    </dl>
</form>

另外,我使用下面的JS脚本(基于引言中链接的帖子):

$('#subform').submit(function() { // catch the form's submit event - should I use the form id?
    $.ajax({ // create an AJAX call...
        data: $(this).serialize(), // get the form data
        type: $(this).attr('method'), // GET or POST
        url: $(this).attr('action'), // the file to call
        success: function(response) { // on success..
            $('#pwd-settings').html(response); // update the DIV - should I use the DIV id?
        }
});
return false; // cancel original event to prevent form submitting
});

记录已提交,但行为因浏览器而异:

  • IE、Firefox、Opera:将内容正确放入 DIV,非常棒!

  • Safari、Chrome:内容正确,但整个页面都会刷新结果

请让我知道我做错了什么。非常感谢!

更新 1: 名为 pwd-settings 的 DIV 仅由选项卡界面创建。请注意,行为是相同的,即使我将其添加到 HTML(使用&lt;div id ="pwd-settings"&gt;&lt;/div&gt;)。

更新 2: 我还删除了上面的 JavaScript,所有浏览器都变成了“正确的内容,但刷新了整个页面”=“旧 URL,新内容”。一旦我将 JavaScript 添加到在 DIV 中呈现的 HTML 页面,它就开始在上述浏览器中工作。因此,我看到两个可能的错误原因:

1) JS 根本没有在浏览器出现错误或执行

2) DIV 内的 JS 不起作用,因为它寻址的 DIV 只存在于外部

【问题讨论】:

  • 我不确定您在问什么——基本上,您使用 Ajax 提交表单并将响应加载到 div 中。 div在哪里?我在您发布的代码中没有看到它。 div是否在tabs界面内?
  • 还有两个问题:你试过不带tab UI的吗?只需制作一个模拟页面来测试表单/jQuery?另外,当你说整个页面被刷新时——就像它没有使用 Ajax,或者整个页面被替换为响应文本?
  • 我觉得你缺少一些东西,因为你的一些描述似乎缺乏。你能把你的代码贴在某个地方,这样我们就可以看到完整的东西并自己尝试一下吗?在 Firefox 中,您是否使用 FireBug 调试程序?
  • 您好,Nathan,您可以在gbits.org/div 找到一个快速而肮脏的实现,展示我之前尝试描述的行为(包括包含所有文件的 ZIP)。是的,我正在使用 FireBug,但它没有给我任何提示;(非常非常感谢!!

标签: php jquery ajax html webforms


【解决方案1】:

jQuery 的serialize() 函数只获取&lt;input&gt; 元素。链接元素不是输入。调用$(this).serialize() 不会将&lt;a&gt; 元素的值添加到您的数据中。

您需要添加一个&lt;input&gt; 元素来保存该数据。也许试试

<input type="hidden" value="changePassword" name="cmd" />

编辑:你能发布完整的 html 吗?从现在看来,您的选择器不会选择表单,因为它甚至没有 id 属性....

【讨论】:

  • 谢谢womp,但我确实有类似的东西。上面的代码应该以
    开头,但无论出于何种原因,StackOverflow 都会跳过它。我已经向他们发送了一封描述问题的电子邮件。
  • 我编辑了你的帖子。我认为你在那里有一个“标签”字符。如果您将文本缩进 4 个空格,编辑器就会选择它……但我认为制表符会以某种方式把它弄乱。一分钟后我再看看你的帖子。
  • 非常非常感谢 womp,我在更新后注意到它现在看起来很好;)我已经按照您的建议添加了一个表单 ID,并希望正确使用它(-> 请检查 JS 中的 cmets)并且行为得到改善(现在所有参数都正确发送)。不幸的是,目标在 IE、Safari、Chrome 中仍然是错误的。
【解决方案2】:

这是我的猜测--

首先,您的表单上没有“操作”属性。所以 $(this).attr('action') 的 JS 行不返回任何内容。我不确定 jQuery Ajax 是如何处理的。

但我认为真正的问题是 example.php 脚本以及它如何处理您的调用。我不是 Ajax 专家,但我根本不会这样做。如果你把 showFile() 的东西取出来,然后回显 $_REQUEST['cmd'],它会起作用吗?

除此之外,我没有想法。但这不是浏览器的怪癖,这是您的代码的问题,我可以说这么多。

【讨论】:

  • 谢谢 Nathan,添加 'action' 让这件事适用于 IE 和 Firefox。请注意,真正的代码没有 showFile() 的东西(我只是为了快速记录错误而实现它)。回显 $_REQUEST['cmd'] 没有任何区别,行为保持不变。
【解决方案3】:

我终于找到了原因:加载问题中描述的JS时,某些浏览器(即有问题的浏览器)的行为会有所不同,因为表单尚不存在,因为稍后会加载选项卡的内容通过 Ajax。

因此解决方法是创建一个JS函数而不是上面的代码并适配按钮(提交变成按钮,引入onClick):

<input type="button" value=" Apply " onClick="callMyFunction()" />

这也被 Safari 和 Chrome 正确处理。

非常感谢所有参与者!

【讨论】:

    【解决方案4】:

    解决此问题的最简单方法是在表单中添加隐藏输入:

    <input type="hidden" name="cmd" value="checkPassword" id="cmd-field" />
    

    如果此值需要根据显示的选项卡进行更改(尽管听起来并非如此),您可以在切换选项卡时动态更改它:

    $("#invent-an-id-for-the-link-that-switches-to-this-tab").click(function() {
        $("#cmd-field").value("checkPassword");
    });
    

    【讨论】:

      【解决方案5】:

      Safari 拥有出色的网络开发工具。如果您运行的是 Windows 版本,则必须在 Preferences -> Advanced 中启用它。打开 Web Inspector 并检查您的请求/响应标头。

      这不会直接指向解决方案,但目前没有什么可做的。获取这些标题并让我们保持更新!

      【讨论】:

      • 嘿 pubb,我启用了脚本检查器 (webkit.org/blog/41/introducing-the-web-inspector) 并查看了标题,但我没有看到任何指向解决方案的内容(我的假设是这是客户端错误)。请将您的浏览器指向gbits.org/div 亲自查看。非常非常感谢!
      • 在 Safari 中打开该页面给了我 4 个错误 - 我认为所有这些都与打开 html 标记之前的文本有关。你能清除这些错误吗?
      • 当然,它们是由 example.php 中的“廉价”回声引起的,我现在禁用了它。
      • 所以发生了很多事情。当请求是 ?cmd=overview 时,响应不是整页。如果 ?cmd=changePassword 收到 XMLHttpRequest 请求,我将只返回表单本身,而不是整个页面。最后,我只会在服务器响应 ?cmd=changePassword 请求时绑定表单(您的 generic.js)。您可以通过附加到 ajaxSuccess 事件来做到这一点。
      • 修复了整个页面,只返回表单 -> 都完成了。如果我仅在该特定请求上绑定 generic.js,您确定它有什么不同吗?它在“真实”系统中有更多的东西,我的猜测是,如果它总是加载就不起作用,如果在某些事件上加载它也不会起作用。
      【解决方案6】:

      看起来你的处理程序没有为后面的浏览器加载...由于表单的内容是动态的,你必须确保在设置表单的处理程序之前加载到 DOM 中。

      您有 2 种可能的解决方案。

      首先,加载选项卡内容后,加载您发布的脚本(查看 jquery 文档以了解选项卡事件加载:http://docs.jquery.com/UI/Tabs#event-load)。

      其次,使用jquery live event on button click(目前不支持事件提交)。签出:http://docs.jquery.com/Events/live

      第二种方案的代码:

      $('#subform input:submit').live('click', function() { // catch the form's submit event - should I use the form id?
      $.ajax({ // create an AJAX call...
          data: $(this).serialize(), // get the form data
          type: $(this).attr('method'), // GET or POST
          url: $(this).attr('action'), // the file to call
          success: function(response) { // on success..
              $('#pwd-settings').html(response); // update the DIV - should I use the DIV id?
          }
      

      }); 返回假; // 取消原始事件以防止表单提交 });

      第一个解决方案

      这些是我为使其正常工作所做的更改:

      1. 从 tpl_overview.tpl 中删除 generic.js
      2. 更改代码(@tpl_overview.tpl):

        $(function() { $('#tabs').tabs() });

      使用此代码:

       $(function() {
           $("#tabs").tabs( {
              load: function(event, ui) {
                 // load specific script to handle form submission
                 if ($(ui.tab).attr('href') == '#pwd-settings') {
                    $.getScript('generic.js');
                 }
              }
           } );
        });
      

      这将在加载选项卡的内容后加载并执行 generic.js 脚本。

      如果您发现自己这样做太多次,也许您可​​以在选项卡链接名称之后命名您的脚本...

      让我们知道它是否有效!

      【讨论】:

      • 谢谢。我已经尝试了这两个选项,但在这两种情况下,整个页面都会在所有浏览器中刷新;(请善待并描述选项 1,我可能在那里做错了。非常感谢!
      • 我在这里添加了第一个解决方案。请记住,您始终必须确保您的内容已加载,否则选择器将返回空数组...此书签可能会方便检查您是否附加了所有处理程序:sprymedia.co.uk/article/Visual+Event
      猜你喜欢
      • 2012-04-20
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多