【问题标题】:jquery's form submit not working in IEjquery的表单提交在IE中不起作用
【发布时间】:2010-09-22 14:36:03
【问题描述】:

我们在这里尝试做的是我们有一个 id 为 upgrade_form 的表单。我们还有一个名为“paypal_submit”的表格。这个表格是空白的。 'upgrade_form' 有账单明细字段(地址、姓名、到期日等)

然后我们只有一个提交按钮,逻辑是如果选中信用卡单选按钮,它将提交表单,但当您选择贝宝单选按钮时,它将显示一个 nyromodal(http://nyromodal.nyrodev.com) 灯箱和点击提交。

  • 编辑 *

好的,我们彻底改造了整个流程。我们首先添加了 2 个未包含在表单中的隐藏字段。这 2 个字段包含信用卡和贝宝的网址。当您选择信用卡单选按钮时,您将获得信用卡网址。当您选择贝宝单选按钮时,您将获得贝宝网址。

当您单击单选按钮时,我们会更改表单的操作:

$('#upgrade_form').attr('action', $('#credit-card-target-url').val())

(credit-card-url 是隐藏字段)

所以当我们点击 nyromodal 灯箱中的链接时,我们只需调用

$('#upgrade_form').submit();

但是!它仍然无法在任何 IE 中工作。对此有什么帮助吗?我们正在安装建议的 IE 脚本调试器,但我很悲观,我们什么都看不到。

编辑

刚刚重试了这个。我们取出灯箱和其他代码。我们刚从一个带有链接的基本表单开始,按下该链接会调用:

$('#upgrade_form').submit();

仍然无法在 IE 中运行。那么是不是因为jquery的submit()?

好的,我在 IE 中搜索 jquery submit 时发现:jQuery form submit() is not working in IE6?

但是我检查了我们的代码,我们的“提交”按钮实际上是一个链接,我搜索了生成的文档,发现没有名为提交的输入。单击链接时,我添加了一个警报以检查表单是否存在(因为 nodeName null 问题)并且我确实收到了带有表单 html 的警报。它只是在提交时停止。

这里是代码:

$('#paypalbutton').click( function() {
  alert($('form#upgrade_form').html());
  $('form#upgrade_form').submit();
  return true;
}

IE 在 jquery 的这一行停止:

nodeName: function( elem, name ) {
  return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
},

【问题讨论】:

  • jQuery 的哪个版本? IE 禁止更改输入的type,所以这可能是您的问题。
  • 如果您在 $.each 语句之前插入一行 alert(parameters.length); 会怎样?它揭示了什么?
  • 最新的。我将其重构为以这种方式附加: $('#payment_form').append('');但它仍然失败
  • 你能打电话给$('#upgrade_form').submit();在 nyromodal 灯箱之外?以防万一灯箱存在范围/兼容性问题?或者是在错误发生之前碰到了哪一行代码(我想你可以在 IE 脚本调试器调用堆栈中看到错误之前代码执行的顺序)?
  • @Alex,我按照上面说的把灯箱拿出来,绑定了点击提交表单。它只是在 IE 调试器中的节点名错误处停止

标签: javascript jquery internet-explorer


【解决方案1】:

我最近遇到了一个类似的问题,我在 ASP.NET 服务器表单中创建了一个“伪表单”(所以我不能使用另一个表单标签),我想在没有的情况下将它发布到另一个域需要编写服务器端代码来进行远程发布。简单的答案 - 即时创建表单并提交。在良好的浏览器中工作...

经过一些试验和磨难,我意识到除非正在提交的表单已添加到 DOM,否则 IE 将无法按预期工作(真是令人惊讶)。所以,这是我的解决方案。我希望它对你们中的一些人有所帮助。请注意,我所有的输入和我的提交都在同一个容器中。 “.post-to”是带有 URL 的隐藏输入。

$(".post-form").click(function(ev) {

    var postto = $(this).siblings(".post-to").val();    
    var form = document.createElement("form")
    $(form).attr("id", "reg-form").attr("name", "reg-form").attr("action", postto).attr("method", "post").attr("enctype", "multipart/form-data");

    $(this).siblings("input:text").each(function() {
        $(form).append($(this).clone());
    });

    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);

    return false;
});

最终,这是一种享受。

【讨论】:

  • 是的!这正是我遇到的问题,谢谢! 向 IE 挥拳
【解决方案2】:

更改格式化.each() 方法的方式似乎可以解决问题...

$('form#paypal-form').submit( function(e) {
  e.preventDefault();
  var parameters = $('form#upgrade_form').serializeArray();
  $(parameters).each(function(i,param){
    $('<input />').attr('type', 'hidden')
    .attr('name', param.name)
    .attr('value', param.value)
    .appendTo('form#paypal-form');
  });     
});

【讨论】:

    【解决方案3】:

    each() 中的 try...catch 语句会显示错误吗?

    【讨论】:

      【解决方案4】:

      如果您还没有,您可以尝试使用内置的 IE JavaScript 调试器(自 IE8 以来内置,或可在 IE8 之前下载)来单步调试它?

      很多人使用 firebug - 因为它很棒 :) 但很多人没有意识到 IE 8 中内置调试器的隐藏天赋。

      它具有与任何其他脚本调试器相同的基本功能,但here is a guide for the specific features 如果您以前没有遇到过它:

      【讨论】:

      • 我必须检查它,它在 jquery.js 第 29 行“return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()”上出错(缩小版)
      • 嗯,我猜是 jQuery 内部的一个错误……一个棘手的错误!
      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多