异步请求后,浏览器屏蔽打开窗口,应该要怎么办
2013-04-02 15:20
239 查看
之前做支付中心和页游项目的时候,经常碰到一个这样的需求,比如点击一个a标签,产生了一个ajax请求,返回一个url给我,我拿着这个url打开新页面。需求是这样的,看起来按部就班很容易搞定,但是,发现好多浏览器下根本不能新打开窗口(标签)(至少在第一次打开的时候会这样,浏览器屏蔽了,然后说 刚屏蔽了一个打开窗口),因为被浏览器拦截了。百思不得其解,最后只好和产品说明白技术无法实现,改需求:第一次请求后,页面弹出一个温馨提示BOX,用户点击这个BOX上的按钮,我打开上回返回给我的URL。(如果有大神知道此解决方案,欢迎讨论,多多感谢)。
后面做页游的时候,看到一同事,写到这样的一段代码,说可以屏蔽浏览器拦截:
仔细分析了同事的代码后,我觉得存在几个问题:
1.应该首先尝试window.open打开方式,而不是把这个放到最后。(如果没有成功打开,window.open会有返回值,根据此值可以判断)
2.DOM方式创建一个a标签,然后去aDom.click()方式证明和window.open()一样的效果,放在这里属于多余。
3.自定义事件。通过度娘把我带到了https://developer.mozilla.org/en-US/docs/DOM/document.createEvent#Notes,完整使用例子可以见这个https://developer.mozilla.org/en-US/docs/DOM/Creating_and_triggering_events。自定义事件是指,在DOM2 级下,定义各种自定义事件,和浏览器本身所支持的事件没有关系,上面代码片段中定义了一个自定义事件,但是当出发自定义事件的click时候,和浏览器本身支持的click有区别(浏览器本身支持的click,一旦出发,是要跳转的),所以这种方式还是不行。
难道就没有一种好点的,解决浏览器异步请求里 打开窗口的问题么?
求各位大神拍砖
后面做页游的时候,看到一同事,写到这样的一段代码,说可以屏蔽浏览器拦截:
/** * 模拟window.open,防止window.open被浏览器拦截。无法解决异步情况(所有浏览器)下的拦截 * 使用实例: * $.windowopen('http://niu.xunlei.com/', '_blank'); */ (function($){ $.extend({"windowopen": function(url, target){ var a = document.createElement("a"); a.setAttribute("href", url); if(target == null){ target = ''; } a.setAttribute("target", target); //a.setAttribute("id", "windowopen_" + (new Date()).getTime() + Math.ceil((Math.random()*100000))); document.body.appendChild(a); if(a.click){ a.click(); }else{ try{ var evt = document.createEvent('Event'); evt.initEvent('click', true, true); a.dispatchEvent(evt); }catch(e){ window.open(url); } } document.body.removeChild(a); }}); })(jQuery);
仔细分析了同事的代码后,我觉得存在几个问题:
1.应该首先尝试window.open打开方式,而不是把这个放到最后。(如果没有成功打开,window.open会有返回值,根据此值可以判断)
2.DOM方式创建一个a标签,然后去aDom.click()方式证明和window.open()一样的效果,放在这里属于多余。
3.自定义事件。通过度娘把我带到了https://developer.mozilla.org/en-US/docs/DOM/document.createEvent#Notes,完整使用例子可以见这个https://developer.mozilla.org/en-US/docs/DOM/Creating_and_triggering_events。自定义事件是指,在DOM2 级下,定义各种自定义事件,和浏览器本身所支持的事件没有关系,上面代码片段中定义了一个自定义事件,但是当出发自定义事件的click时候,和浏览器本身支持的click有区别(浏览器本身支持的click,一旦出发,是要跳转的),所以这种方式还是不行。
难道就没有一种好点的,解决浏览器异步请求里 打开窗口的问题么?
求各位大神拍砖
相关文章推荐
- 异步请求后,浏览器屏蔽打开窗口
- 异步请求后在浏览器中打开窗口
- ExtJs怎么才能点击一个按钮后,重新打开一个浏览器窗口?
- 异步请求后根据结果window.open方式打开新页面,浏览器拦截弹窗问题
- AJAX方法中提交请求,target="_blank" 不能正确打开新的浏览器窗口
- ajax请求之后 用新窗口打开 防止浏览器阻止和拦截
- Firefox浏览器怎么设置搜索结果在新窗口打开?而不是覆盖原有的页面!
- jquery 触发a标签点击事件,弹出页面;不被浏览器屏蔽拦截的打开窗口的方法
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 自编的CHtmlView浏览器,怎么截获超连接,不让新窗口在IE中打开
- ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式
- IE和其他浏览器用JS新窗口打开的问题
- 在winform里c#验证用户正确后 怎么打开新窗口时关闭登陆窗口
- 如何实现在浏览器中打开IM聊天窗口? --转载
- 使用你自己的浏览器打开新窗口
- 检测浏览器是否自动屏蔽了弹出窗口
- JS 点击元素发ajax请求 打开一个新窗口
- JS打开和关闭浏览器窗口
- 浏览器请求阻塞到底是怎么回事?我们为什么要把静态资源分服务器放置?
- aspnet 怎么获取浏览器等客户端请求的url地址?