收录日期:2019/10/22 15:11:34 时间:2016/07/18 03:18:26 标签:JavaScript
因为最近在推广项目,所以看了下弹出窗口的js 

下面是仿www.taobao.com首页的弹出广告, 代码如下 
 function fuyouOpen(targetUrl){
                var win = window.open("about:blank","popup","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
                win.blur();
                win.opener.focus();
                win.location=targetUrl;
createCookie('fuyouCookieName_interval',new Date().getTime(),0);
            }
            function fuyouClickPop(url){
                document.onclick = function(){
                    fuyouOpen(url);
                } 
            }
            function fuyouPop(url){
try{
                    fuyouOpen(url);
  }catch(e){
                    fuyouClickPop(url);

                }
            }

为什么我的代码在ie8下,不能弹出,还taobao的可以
我仔细看下与taobao代码的区别,没发现有什么不同

下面是taobao相关弹出代码



FP.popupAD=(function()
{
    var d=YAHOO.util.Dom,a=YAHOO.util.Event;
    var g="_tb_defaultbackpop_",//cookieName 
e="http://www.taobao.com/promotion/defaultbackpop.html";
    var c=function()
    {
        var j=new Date();  //时间
        var k=j.getHours()*3600+j.getMinutes()*60+j.getSeconds();//秒
        var m=24*3600;//一天
        var l=m-k;//还有
var i=(function()
{
    var n=TB.bom.getCookie(g)||0;
    n>3?n=3:n=parseInt(n)+1;
    return n
}
)();//读cookie 

//写cookie
TB.bom.setCookie(g,i,l/m,TB.bom.pickDocumentDomain(),"/")
};

var b=function()
{
var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
i.blur();//弹出就失去焦点
i.opener.focus();//父窗口得到焦点
i.location=e;//加载地址
};



var f=function()
{
try
{
    b()  //直接调用window.open
}
catch(i)
{
    a.on(document,"click",h)  //事件加到document onclick上

finally
{
    c()
}
};


var h=function(i)
{
try
{
    var k=a.getTarget(i);
    if(k.id==="header"||d.isAncestor("header",k)||Array.indexOf(["input","select","option","button"],k.nodeName.toLowerCase())!=-1)
    {
        return
    }
}
catch(j)
{
}
a.removeListener(document,"click",arguments.callee);
try
{
    b()
}
catch(j)
{
}
};


因为你是直接设置的弹出窗口的地址会被浏览器阻止,
下面的是弹出后再设置地址 的
弹出后再设置location
var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
i.blur();//弹出就失去焦点
i.opener.focus();//父窗口得到焦点
i.location=e;//加载地址
使用框架,克服浏览器差异。
引用 2 楼 sohighthesky 的回复:
弹出后再设置location
var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
i.blur();//弹出就失去焦点
i.opener.focus();//父窗口得到焦点
i.location=e;//加载地址

我改过来了,还有下面的问题
还在ie8下报服务器出现意外情况,也导致打不开
引用 4 楼 fuyou001 的回复:
引用 2 楼 sohighthesky 的回复:
弹出后再设置location
var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
i.blur();//弹出就失去焦点
i.opener.focus();//父窗口得到焦点
i.location=e;//加载地址


我改过来了,还有下面的问题
还在ie8下报服务器出现意外情况,也导致打不开

 是这句 i.location=e报的
引用 5 楼 fuyou001 的回复:
是这句 i.location=e报的

e是你要指定的地址:

var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no"); 
i.blur();//弹出就失去焦点 
i.opener.focus();//父窗口得到焦点 
i.location="http://www.baidu.com";//加载地址 

点击查看运行效果:http://dl.getdropbox.com/u/2555620/jquery/test1.html
引用 6 楼 sohighthesky 的回复:
引用 5 楼 fuyou001 的回复:


是这句 i.location=e报的

e是你要指定的地址:
JScript codevar i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no"); 
        i.blur();//弹出就失去焦点        i.opener.focus();//父窗口得到焦点        i.location="http://www.baidu.com";//加载地址
点击查看运行效果:http://dl.getdropbox.com/u/2555620/jquery/test1.html

我是做为参数传过去啊
通常弹出窗口的阻止程序会进行一些判断
比如对window.open的阻止,并不是什么情况下都会阻止的
楼主可以做个实验,对一个文本框添加事件,分别是onfocus事件和onclick事件,都让它们的代码open一个新窗口。
结果你会发现,onfocus事件下,被阻止了,而onclick事件下顺利open

也就是说,通常浏览器会进行这样的判断:
如果由用户通过鼠标点击的事件,那么不阻止,因为用户鼠标点击是相当于由用户确认了以后才打开的。
但是由非用户动作而open的窗口,就会被阻止。
所以网上很多地方也利用了假的关闭按钮来引诱用户点击而打开广告窗口。

所以taobao中的代码就利用到了onclick事件的摸拟来绕过这种阻止方法
学习了
引用 7 楼 fuyou001 的回复:
我是做为参数传过去啊


function myopen(url) {
var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no"); 
i.blur();//弹出就失去焦点 
i.opener.focus();//父窗口得到焦点 
i.location=url;//加载地址 
}
http://technet.microsoft.com/zh-cn/library/cc784600(WS.10).aspx

弹出窗口阻止程序处于启用状态时,何时将看到弹出窗口?
在下列情况下,仍会看到弹出窗口处于打开状态:

弹出窗口是通过用户单击链接打开的。

弹出窗口是由在计算机上运行的软件打开的。

弹出窗口是由从网站实例化的 ActiveX 控件打开的。

弹出窗口是从“可信站点”或“本地 Intranet”区域打开的,而您尚未将弹出窗口阻止程序的作用域扩展到包括这些区域。
引用 10 楼 sohighthesky 的回复:
引用 7 楼 fuyou001 的回复:


我是做为参数传过去啊

HTML code
function myopen(url) {
    var i=window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no"); 
    i.blur();//弹出就失去焦点 
    i.opener.focus();//父窗口得到焦点 
    i.location=url;//加载地址 
}


 function fuyouOpen(e){
         var i = window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
            i.blur();
           i.opener.focus();
           i.location=e;
    
       }
//这是我的代码

上面是我的,在ie8是三次,有一次会报这样的问题
不是每次都报的
引用 12 楼 fuyou001 的回复:
上面是我的,在ie8是三次,有一次会报这样的问题
不是每次都报的


把参数e换个名字试试,另:还不行就把你调用 这个方法的代码贴出来


 function addEventSimple(obj,evt,fn) {
if (obj.addEventListener)
obj.addEventListener(evt,fn,false);  
else if (obj.attachEvent)
obj.attachEvent('on'+evt,fn);
}
function removeEventSimple(obj,evt,fn) {
if (obj.removeEventListener)
obj.removeEventListener(evt,fn,false);
else if (obj.detachEvent)
obj.detachEvent('on'+evt,fn);
}
 function netgyOpen(url){
         var i = window.open("about:blank","_backad","width=750,height=480,toolbar=no,location=no,directories=no,status=yes,resizable=no,scrollbars=no");
           i.blur();
           i.opener.focus();
           i.location=url;
      createCookie('netgyCookieName_interval',new Date().getTime(),0)
       }
   function netgyClickPop(url){
   function fnopen(){
netgyOpen(url);
 }
         addEventSimple(document,'click',fnopen)
 //removeEventSimple(document,'click',fnopen);
      }
        function netgyPop(url){
try{
                   netgyOpen(url);
  }catch(e){
                   netgyClickPop(url);
               }
           }



所有的代码
现在有二个总题:
1:ie8有时报服务器服务器出现意外情况,不是每次都这样,只是3次可能有1次
2:我想弹出窗口后,就把onclick取消了(上面有句注释的,好像不行 //removeEventSimple(document,'click',fnopen); ,),如果取消注释,就不弹出了
3:上面代码还有什么可以优化,让速度快些
4: 我只用了一点功能 ,就没用框架了,省得加大js文件

大家帮我看看,
1.没见过不知道
2.直接document.onclick=null;
3.代码基本没什么要优化的
http://www.webjishu.cn//htm/20091021/164.htm
Asp.net技术之BS模式下的MessageBox类
自己顶下
路过,顶下

怎样把一个已经查询出来的结果集进行分页 巧妙配置Windows7 彻底阻止U盘病毒侵袭 新人问下.net3.5 beta2 和.net3.5 有啥区别 《C++ Primer Plus》中关于基类和派生类都使用了new,重新定义赋值操作符的问题? OpenGL如何导入位图 如何获取一用户控件上的右键菜单? II6+win2003 silverlight4配置问题 [押宝党]交税~~~~~~~~~~~荣少 大家好,wm下有没有监视上网记录的工具软件? 房地产信息网? 把左边记录移到右边,在线等 以加载的bmp获取其大小 令人吐血的Hibernate多对多删除约束。。。。 有没有简单的diameter协议实现? jquery 不执行单击事件 具体代码如下 应该如何解决? 如何在项目里引用SharpZipLib.dll,SharpZipLib.dll在哪里找到? [已处理] 请问http://hi.csdn.net/zjq118的博客为什么不能访问了? 控制终端如何转移 [已处理] 申请开通博客 关于struts验证问题 问一个IDE的小问题 两个界面问题 为何mousemove不起作用? 如何黑网站? 求:DELPHI中的分类统计 在一张静态地图图片上添加标记,求思路?? 关于在类中定义静态static 全局私有的问题 关于更新oracle Inventory 谁知道这个银企直连Servlet如何调用? 求教:我修改了2.2源码中的Gallery,请问怎么把它安装到真实的手机上?非刷机不可吗?