window.open弹出窗口在单击事件期间被阻止
我最终需要做的是运行$.ajax()
调用然后运行之后,打开一个新窗口。
用户单击“预览”按钮以保存其当前表单,然后打开一个新窗口,显示包含刚刚保存的数据的项目预览。
但是按原样, window.open
函数被弹出窗口阻止程序阻止。
这是我的代码的基本部分:
HTML:
Preview
JavaScript的:
$('.preview').live('click', function(event){ save_survey($(this).attr('href')); event.preventDefault(); }); function save_survey(url) { $.ajax({ type: "POST", url: form_url, dataType: 'json', data: form_data, success: function(data) { window.open(url, '_blank'); } }); }
我最近遇到了这个问题并发现了这个解决方法:
1)在调用$.ajax
并保存窗口引用之前调用window.open
:
var newWindow = window.open(...);
2)在保存的窗口引用的回调设置location
属性上:
newWindow.location = url;
也许它也会对你有所帮助。
弹出窗口阻止程序通常可以阻止显示的每个弹出窗口都不是由直接用户操作触发的,例如单击按钮或链接。
如果您在click事件上使用ajax请求,则会从click事件中触发异步请求,这就是为什么当ajax请求完成其工作并且您从事件请求获得响应时您失去了机会触发一个window.open没有弹出窗口阻止程序阻塞,原始的点击事件在那个时候已经很久了。
根据这篇文章 ,看起来你必须打开你的窗口直接响应点击(以避免被弹出窗口阻止程序击中),而不是等到AJAX调用完成打开新窗口。
我通过使Ajax调用同步来解决我的问题。 例如(使用jQuery):
$("form").submit(function(e){ e.preventDefault(); $.ajax({ async: false, url: ..., data: ..., success: function(results){ if(results.valid){ window.open(...); } } }); return false; });