问题描述
默认是异步的,有没有办法变成同步方式提交。因为碰到一个问题,在表单提交的success里用window.open打开新窗口会跳出新的浏览器窗口而不会变成新Tab页,只有在form表单提交的代码段之外window.open才会变成tab页。另外想请教ajax的success里用window.open打开新窗口会跳出新的浏览器窗口而不会变成新Tab页是什么原因?浏览器是chrome
解决方案
submit: function(jq, options){ return jq.each(function(){ var opts = $.extend({}, $.fn.form.defaults, $.data(this, 'form') ? $.data(this, 'form').options : {}, options||{} ); ajaxSubmit(this, opts); }); }, function ajaxSubmit(target, options){ options = options || {}; var param = {}; if (options.onSubmit){ if (options.onSubmit.call(target, param) == false) { return; } } var form = $(target); if (options.url){ form.attr('action', options.url); } var frameId = 'easyui_frame_' + (new Date().getTime()); var frame = $('<iframe id='+frameId+' name='+frameId+'></iframe>') .attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank') .css({ position:'absolute', top:-1000, left:-1000 }); var t = form.attr('target'), a = form.attr('action'); form.attr('target', frameId); var paramFields = $(); try { frame.appendTo('body'); frame.bind('load', cb); for(var n in param){ var f = $('<input type="hidden" name="' + n + '">').val(param[n]).appendTo(form); paramFields = paramFields.add(f); } checkState(); form[0].submit(); } finally { form.attr('action', a); t ? form.attr('target', t) : form.removeAttr('target'); paramFields.remove(); } 在cb函数中使用了setTimeout,如果你在success方法中使用window.open ,是页面直接调用或通过定时器等调用的,没有通过鼠标键盘事件,在google浏览器下是会弹出新窗口的。
解决方案二:
$.ajax({ url: "test.html", data :[], async : false, });
解决方案三:
window.open(URL,name,features,replace)只有在设置了第三个参数才会打开新的窗口在没指定第三个属性时只会在当前窗口打开新的标签。(在IE中,如果要打开的URL与当前页面URL不属于同一个主域名则打开新窗口;在Chrome中,如果window.open()函数不是被鼠标键盘事件调用的,而是页面直接调用或通过定时器等调用的,则打开新窗口而非标签)既然用到了easyui,那可以使用tabsfunction addTab(title, url){ if ($('#tt').tabs('exists', title)){ $('#tt').tabs('select', title); } else { var content = '<iframe scrolling="auto" frameborder="0" src="'+url+'" style="width:100%;height:100%;"></iframe>'; $('#tt').tabs('add',{ title:title, content:content, closable:true }); } } 在jquery中的ajax方法中可以指定同步请求jquery API中这样描述的:async (default: true)Type: BooleanBy default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success().代码如下:$.ajax({ url: "test.html", data :[],});