【问题标题】:jQuery ajax cross domain form submission issues with IE使用 IE 的 jQuery ajax 跨域表单提交问题
【发布时间】:2012-10-20 09:22:10
【问题描述】:

我在使用 IE 时遇到了问题,大吃一惊吧?我有一个将姓名、电话和电子邮件提交到另一个域下的脚本的网络表单。我是 jquery.ajax 来提交表单的。我还使用 jquery.validate 进行表单验证。姓名和电子邮件是必需的。电话是可选的。

当我在 Chrome 中提交表单时,它运行良好。我收到了感谢邮件,并且我的数据到达了另一个域上的脚本。

当我在 IE9 中尝试相同的表单时,我填写了所有字段并点击了提交,它看起来像是已提交(我在表单所在的位置收到感谢消息),但没有任何数据进入服务并且我也没有收到确认电子邮件 - 所以它实际上没有发布。

那么我怎样才能让这个脚本在 IE7、8、9 中工作。这是现在的脚本...当我取消注释成功操作中的警报时,我会在 IE 中收到警报。它只是不发布数据。我在这里看到了很多关于此的帖子,但我并没有以一种易于理解的方式将所有部分放在一起。

我听说 IE10 开箱即用。

jQuery.validator.setDefaults({
submitHandler: function() {

var cons_info_component = jQuery("#cons_info_component").val();
var cons_mail_opt_in = jQuery("#cons_mail_opt_in").val();
var longnum = jQuery("#1540_6383_2_8347_1").val();
var survey_id = jQuery("#SURVEY_ID").val();
var cons_email_opt_in = jQuery("#cons_email_opt_in").val();
var cons_email_opt_in_requested = jQuery("#cons_email_opt_in_requested").val();
var cons_first_name = jQuery("input#cons_first_name").val();
var cons_last_name = jQuery("input#cons_last_name").val();
var cons_email = jQuery("input#cons_email").val();
var cons_phone = jQuery("input#cons_phone").val();

if(cons_phone === "PHONE NUMBER (OPTIONAL)") { cons_phone = ''; }

var ACTION_SUBMIT_SURVEY_RESPONSE = jQuery("#ACTION_SUBMIT_SURVEY_RESPONSE").val();

var dataString = 'cons_info_component='+cons_info_component+'&cons_mail_opt_in='+cons_mail_opt_in+'&1540_6383_2_8347='+longnum+'&SURVEY_ID='+survey_id+'&cons_first_name='+cons_first_name+'&cons_last_name='+cons_last_name+'&cons_email='+cons_email+'&cons_phone='+cons_phone+'&cons_email_opt_in='+cons_email_opt_in+'&cons_email_opt_in_requested='+cons_email_opt_in_requested+'&ACTION_SUBMIT_SURVEY_RESPONSE='+ACTION_SUBMIT_SURVEY_RESPONSE;


jQuery.ajax({   
type: "POST",
url: "http://urlthatIsubmittoo.com/script/",
crossDomain: true,
cache: false,
data: dataString,

statusCode: {
404: function() {
  //alert('page not found');
},
200: function() {
  //alert('success');
}
},
 success: function() {
    //alert('submited');    
},
 complete: function() {

    jQuery('div.convioform').html("<div class='tybox'></div>"); 
    jQuery('div.convioform .tybox').html("<h5 class='webform-title'>Thank You</h5><p>You'll soon be receiving our e-mails and updates now.</p>");
        }
    }); // close .ajax line

},  
 });

【问题讨论】:

  • @nathanhayfield:总是假设这些问题得到了可接受的答案。任何人都不应接受不能接受的答案,只是为了提高他们的评分。
  • 好点,但我只是说
  • 我是否可以建议,如果您对代码应用一些合理的缩进,这将使我们更容易理解,从而更容易发现任何问题?
  • 你试过设置数据类型为jsonp吗?另外,为什么不使用标准的 jquery ajax 响应回调(成功、错误等)?如果 ajax 调用甚至找到 post url,您将始终获得 200。获得 200 并不意味着请求实际上已成功完成。
  • 我没有尝试将dataType设置为jsonp。我也可以删除状态代码调用。任何使脚本更短的事情。 :)

标签: jquery cross-domain


【解决方案1】:

将其插入文件顶部(通过 github/jaubourg):

if ( window.XDomainRequest ) {
    jQuery.ajaxTransport(function( s ) {
        if ( s.crossDomain && s.async ) {
            if ( s.timeout ) {
                s.xdrTimeout = s.timeout;
                delete s.timeout;
            }
            var xdr;
            return {
                send: function( _, complete ) {
                    function callback( status, statusText, responses, responseHeaders ) {
                        xdr.onload = xdr.onerror = xdr.ontimeout = jQuery.noop;
                        xdr = undefined;
                        complete( status, statusText, responses, responseHeaders );
                    }
                    xdr = new XDomainRequest();
                    xdr.onload = function() {
                        callback( 200, "OK", { text: xdr.responseText }, "Content-Type: " + xdr.contentType );
                    };
                    xdr.onerror = function() {
                        callback( 404, "Not Found" );
                    };
                    xdr.onprogress = jQuery.noop;
                    xdr.ontimeout = function() {
                        callback( 0, "timeout" );
                    };
                    xdr.timeout = s.xdrTimeout || Number.MAX_VALUE;
                    xdr.open( s.type, s.url );
                    xdr.send( ( s.hasContent && s.data ) || null );
                },
                abort: function() {
                    if ( xdr ) {
                        xdr.onerror = jQuery.noop;
                        xdr.abort();
                    }
                }
            };
        }
    });
}

【讨论】:

  • 感谢林恩的回答。我现在要试试这个。男孩,我希望它有效吗!
  • Lyn,我试着把这段代码放在这一行的正上方:“jQuery.validator.setDefaults({” - 它似乎没有做任何事情。
  • 好的,让我的表单在 jsfiddle 中工作,使用您的代码之间的交叉并将“dataType:”jsonp“”添加到 jquery 中。接下来我将在我的页面中尝试,希望在丹麦一切都会好起来。谢谢!
  • 好的,这在 IE9 中有效,但它不会删除表单并在浏览器窗口中输入感谢消息...我现在要尝试解决这个问题。感谢您的帮助。
  • 不客气,很高兴你取得了进展。向前和向上!
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2022-11-14
  • 2011-11-06
相关资源
最近更新 更多