`
zhao103804
  • 浏览: 124587 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

解决IE window.location.href不发送Referer的方法

    博客分类:
  • JS
 
阅读更多

JavaScript判断IE各版本最完美解决方案

jQuery在1.9版本之前,提供了一个浏览器对象检测的属性$.browser,使用率极高。但是在1.9版本发布之后,大家钟爱的这个属性被jQuery无情的抛弃了。大家开始着手寻找$.browser的替代方案。于是各种利用IE bug的检测方法被搜了出来:

// shortest from a Russian
var ie = !-[1,]

// Option from Dean Edwards:
var ie = /*@cc_on!@*/false

// Use the commented line:
var ie//@cc_on=1

// Variation (shorter variable):
var ie = '\v'=='v'

// Option to Gareth Hayes (former record-holder):
var ie = !+"\v1"

还有一些读取navigator.userAgent的方式,在苹果看来这些写法都不够友好,也不容易记忆,在搜索和挑选之后,终于找到了一个容易理解且友好方便的写法!

解决方案

IE知道自身毛病很多,于是提供的一套官方的HTML hack方式:

<!--[if IE]>
// 全部IE版本可见
<![endif]-->
<!--[if IE 6]>
// IE6可见
<![endif]-->

依次等等。
这样的写法在其它浏览器里,完全就是一坨注释而直接遭到无视,但在IE里却不会。IE会分析里面的提到的版本号,并根据版本号确定要不要解析里面的DOM元素和文本内容。等一下!DOM元素?那岂不是可以使用js来获取里面的DOM元素?反正谁看到了,谁就是IE!于是,国外大神就有了下面的写法:

var isIE = function(){
    var b = document.createElement('b')
    b.innerHTML = '<!--[if IE]><i></i><![endif]-->'
    return b.getElementsByTagName('i').length === 1
}

这也太巧妙了!首先生成了一个b元素,设置它的innerHTML为一坨只有IE才认识的注释,注释里只有一个空的标签,然后读取里面的出现的元素i的个数是不是等于1,是不是等于1,是不是等于1。。。。
在大苹果看来,这样的写法比其它任何一种都要好。至于为什么生成一个b元素并且里面写一个i元素而不是div或者strong,更多是考虑到前者字节量更小。
检测各个IE版本的方法也就顺理成章了:

var isIE6 = function(){
    var b = document.createElement('b')
    b.innerHTML = '<!--[if IE 6]><i></i><![endif]-->'
    return b.getElementsByTagName('i').length === 1
}
// var isIE7
// ...

更进一步

在苹果看来,还可以进一步将版本号提取成参数,就能生成一个通用的检测IE版本的函数了:

var isIE = function(ver){
    var b = document.createElement('b')
    b.innerHTML = '<!--[if IE ' + ver + ']><i></i><![endif]-->'
    return b.getElementsByTagName('i').length === 1
}
if(isIE(6)){
    // IE 6
}
// ...
if(isIE(9)){
    // IE 9
}

这样想检测哪个版本都毫无压力。但是,如果只想检测是不是IE,而不关心浏览器版本,那只需要在调用函数的时候,不传递参数即可。

var ie  = isIE()

最后依次贴下在各大浏览器里测试代码的截图。

alert('ie6:' + isIE(6) + '\n' + 'ie7:' + isIE(7) + '\n' + 'ie8:' + isIE(8) + '\n' + 'ie9:' + isIE(

 

 

====================================================================================

JavaScript客户端脚本语言

Javascript 是一种由Netscape的LiveScript发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。

 


 


HTTP Header referer这主要是告诉人家我是从哪个页面过来的,可以用于统计访问本网站的用户来源,也可以用来防盗链。获取这个东西最好的方式是js,如果在服务器端获取(PHP方法如:$_SERVER['HTTP_REFERER']) 不靠谱,可以伪造,用js获取最好很难伪造,

方法:利用js的 document.referer 方法可以准确地判断网页的真实来路。 目前百度统计,google ads统计,CNZZ统计,都是用的这个方法。防盗链也很简单了,js里判断来路url如果不是本站不显示图片。
众所周知,我们web开发人员痛恨IE浏览器,因为IE不支持标准,标准外的默认行为又和其他浏览器经常不一致:
在IE中用javascript做跳转,比如用window.location.href = “”; ie如果使用document.referrer无法取到浏览器请求的HTTP referrer,因为IE清空了
而其他主流浏览器Firefox和Chrome都会保留referrer,没办法,这意味着IE又要享受“部长级”特殊待遇了:
以下代码可以解决ie的这个问题:
//检测如果是ie浏览器,则手动的给增加一个referer

if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || /MSIE(\d+\.\d+);/.test(navigator.userAgent)){
    var referLink = document.createElement('a');
    referLink.href = url;
    document.body.appendChild(referLink);
    referLink.click();
} else {
    location.href = url;
}
这样的原理就是给IE浏览器的页面偷偷加了个链接,然后自动点这个链接,于是referrer就能保留了。

 

 

================================项目应用============================

// 判断是否IE
function isIE() {
 return ("ActiveXObject" in window);
}

/**
 * 在IE下面,使用window.loaction.href=url,window.open(url)时,referer会丢失,此时应使用该方法替代
 * window.location.reload()无问题
 *
 * @param {} url 新链接
 * @param {} newTab 是否要打开新窗口
 */
function gotoUrl(url, newTab) {
 if (isIE()) {
  if (newTab) {
   var referLink = document.createElement('a');
   referLink.href = url;
   referLink.target = "_blank";
   document.body.appendChild(referLink);
   referLink.click();
   document.body.removeChild(referLink);
  } else {
   var referLink = document.createElement('a');
   referLink.href = url;
   document.body.appendChild(referLink);
   referLink.click();
  }
 } else {
  if (newTab) {
   window.open(url);
  } else {
   window.location.href = url;
  }
 }
}

 

 

参考地址:

http://www.phperz.com/article/14/0702/2914.html

 

https://github.com/nioteam/jquery-plugins/issues/12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    IE下通过a实现location.href 获取referer的值

    如果不在IE环境下,就直接使用`window.location.href`进行跳转,因为非IE浏览器通常能正确处理`Referer`。 4. **工作原理**: 当`&lt;a&gt;`标签的点击事件被触发时,浏览器会按照标准的HTTP流程发送请求,包括`Referer`...

    js跳转方法,网页跳转。

    这个方法在一些老版本的IE浏览器中可用,但在现代浏览器中已被废弃,不推荐使用。 ```javascript window.navigate("top.jsp"); ``` 4. **`self.location`**: `self`是当前窗口或框架的引用,`self.location`...

    javascript页面跳转与自动刷新常用代码

    这种方法不会弹出提示框,但需要注意的是,`window.location.href="要刷新的页面"`在IE7中是可行的,但在IE6和其他一些浏览器中可能会出现问题。 #### 六、JavaScript页面跳转常用代码 除了刷新页面之外,...

    完美兼容各大浏览器获取HTTP_REFERER方法总结

    在某些情况下,通过`window.location.href`或直接赋值`location.href`在IE中可能无法正确设置HTTP_REFERER。这是由于IE的安全策略限制,对于非用户触发的页面跳转,如脚本直接修改`location.href`,IE不会记录...

    网页制作精华代码大全

    查看网页源代码 onclick="window.location='view-source:'+window.location;"&gt; ``` 提供一个按钮,让用户方便地查看当前页面的源代码,适合用于教学或示例网站。 ### 10. 检测代理服务器 ```asp &lt;%if Request....

    js使用小技巧

    无关闭按钮IE window.open("aa.htm", "meizz", "fullscreen=7"); 统一编码/解码 alert(decodeURIComponent(encodeURIComponent("http://你好.com?as= hehe"))) encodeURIComponent对":"、"/"、";" 和 "?"也编码 ...

    JavaScript中的document.referrer在各种浏览器测试结果

    - Internet Explorer (IE)的某些版本,如IE6到IE8,修改`location.href`或使用`window.open`打开页面时,`document.referrer`也会丢失。不过,IE9在使用`location.href`进行跳转时,仍能保留referrer信息。 - 当使用...

    ASP经典实用代码

    if (window == top) top.location.href = "frames.htm"; // frames.htm 为目标框架页面的路径 // --&gt; ``` 这段代码确保了非框架环境下的用户能够正确访问框架页面。 #### 七、防止嵌入框架 **代码片段9**:使用 ...

    制作网页时的23个经典代码.txt

    这段代码用于非 IE 浏览器设置书签图标,虽然不是标准的做法,但可以作为一种兼容性的解决方案。 ### 7. 禁用输入框中的输入法 #### 代码: ```html ;"&gt; ``` #### 解释: 通过设置`ime-mode: disabled;`样式属性...

    精华ASP代码.doc

    需要注意的是,这种方式只适用于IE浏览器,并且由于安全限制,在现代浏览器中可能无法正常工作。 通过上述知识点的详细介绍,我们可以看到这些技巧对于提高网站的功能性和安全性具有重要作用。当然,开发者还需要...

    Javascript中document.referrer隐藏来源的方法

    `window.location.replace()` 方法会替换当前的页面历史记录,从而不保留`referrer`信息。 3. **修改HTTP头信息**: 在服务器端,可以通过修改HTTP响应头中的`Referrer-Policy`字段来控制`referrer`的发送策略。...

    常用的16个脚本ASP.NET

    - **功能说明**:这段脚本确保当前页面不被嵌入到其他框架中,如果发现嵌套情况则将顶层窗口的地址更改为当前页面地址。 #### 10. 在禁用JavaScript时显示备选内容 - **代码实现**: ```html *....

    西电网络安全攻防大赛渗透测试部分答题

    在这里,我们可以使用 UTF-7 编码将提示信息解码,获得内容 `&lt;script&gt;window.location.href="utf-7.php"&lt;/script&gt;`,然后访问`http://test.xdsec.org/6/utf-7.php`,添加 Referer 头,获得答案。 这篇文章记录了...

    ASP和js常用代码

    第二种方法通过比较`top.location`与`self.location`来判断。 - **应用场景**:避免页面被恶意嵌入到其他网站的框架中。 3. **检测代理IP**: - **代码实现**:通过`Request.ServerVariables(...

Global site tag (gtag.js) - Google Analytics