• 360浏览器拦截弹窗,window.open方式打不开新页面(js操作新开页面)


    解决办法:把ajax异步请求变成同步请求即可,及

      $.ajax({

              //async:false,

       ...

      });

    详情:

    window.open虽然在很多时候被广大中小站长用于弹窗广告的展示,所以广受争议,但是在业务需求中还是有很多场景需要用到此功能。然而,大多数浏览器对此都有一定的安全策略进行阻止,为此本文将针对以下浏览器进行测试。

    Chrome16、Firefox10、360SE4.2、IE6、IE8

    1、首先是最原始的在head标签中加入

    <script>

            

           window.open('about:blank');                            //空白页

            

           window.open('http://www.1688.com/');   //非同源知名站点

            

           window.open('http://www.ginano.net/');  //同源

            

           window.open('http://www.aliren.org/');  //非同源非知名站点

            

           alert('over!');

            

    </script>

    结果显示:Firefox、IE6、Chrome、360SE均阻止了弹出广告;360SE在加载时,从第一个open开始阻止了弹窗并且停止了后续代码的执行,连over都没有弹出(这样也行)。

    2、在一个非a标签上执行click事件,然后触发行为

    $('#not-a').click(function(){

        window.open('http://www.1688.com/');

        window.open('http://www.aliren.org/');

        window.open('http://www.ginano.net/');

        window.open('about:blank');

        alert('over!');

    });

    <span id="not-a">dddd</span>

    结果显示:除了IE和360SE不允许同时打开两个及以上弹窗外,其他浏览器都能够正常打开所有窗口,但是360SE居然同样阻止弹窗的同时停止后后续的脚本执行!!

    3、在一个a标签上执行2中同样的操作,得出的结论一致,在此不再累述。同样从上面的测试中可见,对于打开多个窗口和打开单个窗口基本行为一致,只是在有些时候360SE这个号称安全的浏览器做了一些额外的处理而已,所以接下来的测试将会只针对一个弹窗进行测试。如果不同网址对应的弹窗行为不同将会做进一步说明。

    4、很多时候我们会根据ajax请求返回的结果来执行window.open操作,那么这个时候还能顺利打开么?

    $('#tag-a,#not-a').click(function(e){

          e.preventDefault();

          $.ajax({

              //async:false,

              url:'http://www.ginano.net/',

              success:function(){

                  window.open('http://www.ginano.net/');

              }

         });

        //return true;

    });

    <a href="http://www.ddddd.com" id="tag-a">testa</a> 

         <span id="not-a">testb</span>

    结果很意外的,360SE居然都能够打开弹窗,而其他所有浏览器都一致的阻止了弹窗。

    5、重复第4种情况的讨论,修改ajax请求为同步请求,看看什么反应。结果显示所有浏览器都能够正常打开弹窗,因此得出结论:同步的操作能够解除浏览器对弹窗的限制。

    6、其实还有一种非常恶心的场景,当然可以采用其他方式避免。但是如果你又不得不这样做呢?还是得看一下吧:

    如果想希望通过点击B的同时,使得某个链接A也被点击(好像大多数的广告需要被点击,许多垃圾站就这样做的),就需要用到此场景

    $('#not-a').click(function(){

        $('#tag-a').click();

    });

    <a href="http://www.ddddd.com" id="tag-a">test</a> 

    <span id="not-a">dddd</span>

    而这种情况,所有浏览器都会对js触发的和鼠标触发的点击事件做出正确的判断,因此不会自动打开链接,从而影响垃圾站长们的心情。但是不急,从上面几个场景的分析可以很容易得到以下的解决方法,那就是给所需要的链接增加一个click的事件,然后通过click事件注册window.open来打开所需要的窗口:

    $('#tag-a').click(function(){

        e.preventDefault();

        window.open($(this).attr('href'));

        return false;

    });

    因此就可以实现变态的需求了。。。站长们偷着乐吧!(其实这种方法和直接在触发标签中添加window.open事件别无两样)

    从上面的分析可见,浏览器对于鼠标点击和js触发点击是有不同的行为控制的,主要是需要判断标准为事件的触发起始必须为真实的鼠标事件,以及事件执行的连贯性。另外同时打开多个弹窗也会受到部分浏览器的安全屏蔽。所以,一开始就自动打开弹窗将会被阻止,而通过鼠标click事件来弹窗却可以正常打开;而ajax的异步操作同样会让浏览器认为其为非连贯性的鼠标点击事件,所以需要采用同步的请求来完成。

  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/miaSlady/p/8175877.html
走看看 - 开发者的网上家园