收录日期:2020/05/26 05:34:47 时间: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类
自己顶下
路过,顶下

请问有谁知道\"网络快车\"或者\"迅雷\"下载流媒体文件的原理吗? 求一SQL语句!谢谢!分不多! 为什么收不到文件?? 关于访问数据库的系统,有一事不明白 问一个关于串口通信的问题 为什么收不到文件?? sqlserver2000服务器恢复的问题 超级变态的门禁考勤系统的查询 怎样才能让页面编号居中显示呢????? 电脑开机后一会儿就不能用了,不知道是什么原因? vc2005 奇怪的编译问题 如何在动态SQL中引用DateTime变量 无法调整Web窗体中控件的大小? 超简单的问题,while(OleRd.Read())这样写对吗?快答快得! 喜欢ASP.NET的来这里!!!!!!1...... 如何统计出不同表中的数据,并且显示出结果 \"无法从未绑定到 DataTable 的 DataGrid 中读取数据\" 从SQL读出的二进制流放在单独Page里,怎么控制图片长宽缩放 如何将一个结构体写入二进制文件? 树型下拉菜单 DataGrid Ado 用VC++.NET的程序,编译成realease版本的后,拷贝到别的机器上为什么运行不了那?(急) DSPack与IdCmdTCPClient使用的问题 数组在不同的类里传值 如何将一个字符串保存为不同的文件格式,帮忙看看。 !!!!!求做毕业设计 时间紧急 打算用vc和sql做个数据库方面的小程序,但是遇到问题了,请教高手 出现\"无法打开数据库 \'Northwind\'。该数据库正处于还原操作中途。\"如何解决? 导出数据到execl如何设置sheet的名称 !!!!!求做毕业设计 时间紧急