标签归档:chrome

GFW、google

最近google越来越不好用了,网友表示这是有史以来GFW最大规模的对google的拦截封杀。在此情况下,google 搜索和gmail、google map基本都瘫痪了。chrome也不在那么流畅了。与此同时使用原生android系统的同学们估计也感受到了进来autoback等工具开始出问题,照片备份错乱,或者相册打开显示都会不同程度的出现问题。目前nexus5已经升级到了android 4.4.3,通讯录优化的很不错,但是可笑的是国内如此多的android智能机在使用google的系统,这是要断奶的节奏啊。难倒这真是要要推“国产操作系统”(cos)的节奏吗?

PS随之而来还有一些别的问题:
如果你发现,现在你的网站突然变慢了,那么很有可能是因为GFW拦截google的原因。可以查看页面源码搜索是否含有google的引用,比如下面的引用:
<script src=”//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit” type=”text/javascript”></script>

UserAgent的历史变迁(转载)

Google推出的Chrome让大家热议纷纷,只有专业用户才会注意到用Chrome访问网页时发出的“Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13”UserAgent字符串,貌似天书,它到底是怎么回事儿代表什么呢?我们来看看吧.

最早的时候有一个浏览器NCSA Mosaic,把自己标称为NCSA_Mosaic/2.0 (Windows 3.1),它支持文字显示的同时还支持图片,于是Web开始好玩起来。
然后出现了一个新的网页浏览器“Mozilla”,其实就是“Mosaic终结者”的意思,这搞的Mosaic很不爽,(毕竟Mosaic出道早,江湖老),新浏览器最后正式公布的名称是Netscape,它把自己标称为Mozilla/1.0 (Win3.1),更好玩了。Netscape支持框架显示,后来框架在大家中间流行起来了,但Mosaic不支持框架啊,于是伟大的“用户代理人探测”技术出现了,如果是“Mozilla”,那就发给支持框架的页面,至于其他的浏览器,则发给不含框架的页面。
Netscape想逗Microsoft玩儿,把Windows叫做“几乎不曾做过调试的设备驱动器”,后者很恼火。Microsoft于是推出了自己的 网页浏览器,叫做Internet Explorer,希望它能成为“Netscape终结者”。Internet Explorer也支持框架,但它不是Mozilla啊,所以没人给它发送带有框架的页面。Microsoft慢慢烦躁起来,不再寄希望于网站管理员逐渐 认识IE并给它发框架,而是宣称自己是“兼容Mozilla”的,开始模仿Netscape,把自己标称为Mozilla/1.22 (compatible; MSIE 2.0; Windows 95),这样Internet Explorer也能收到框架了,整个Microsoft狂喜,但网站管理员开始有点被搞糊涂了。 
Microsoft把IE和Windows一起卖,并且把产品也弄得比Netscape更好了,拉开了第一场浏览器之战。结果和大家知道的一样,Netscape被干掉了,Microsoft大胜、大喜。但是后来Netscape以Mozilla的新名称重生了,构造了Gecko,标称其为Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826,Gecko属于渲染引擎,表现优异。Mozilla开发了Firefox,标称为Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0,并且Firefox表现也非常优秀。Gecko扩张迅速,一些浏览器使用了它的代码并标称为Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1 ,这是一个,还有Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0,另一个,它们都伪装成Mozilla,同时也都是基于Gecko支持的。
Gecko表现优秀,IE则很差劲,于是身份甄别再次发生,输送给Gecko的是设计良好的网页代码,其他浏览器就没有这个待遇了。Linux的跟随者很伤心,因为他们创建了基于KHTML引擎支持的Konqueror,但却不会被输送好代码,虽然他们自己认为KHTML和Gecko一样优秀,于是Konquerer开始伪装自己“像Gecko”那样以得到好的网页,并标称自己为Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko),这个世界更让人困惑了.
后来出现了Opera这样的主儿,宣称“允许用户自己决定让浏览器装成谁”,它的菜单中提供了Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51, Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51Opera/9.51 (Windows NT 5.1; U; en) 供大家来选择,选谁是谁。
Apple开发了Safari,使用了KHTML,同时也增加了很多新特性,后来干脆一锅煮,另起炉灶叫了WebKit,但是它有希望能够得到那些为KHTML编写的网页,于是Safari标称自己为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5,这个世界更混乱了。
Microsoft越来越担心Firefox的发展,重新启动了Internet Explorer的开发,标称自己为Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ,可以很好的渲染代码,但那要看网站管理员是否指示它这么做。
Google也开发了自己的浏览器Chrome, 使用了Webkit,有点像Safari,希望能得到为Safari编写的网页,于是决定装成Safari。这样啊,Chrome使用了WebKit渲染 引擎,想装成Safari,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的,同时所有的浏览器又都宣称自己是 Mozilla,于是,Chrome宣称自己是Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13,,UserAgent字符串彻底混乱了,也几乎不再发挥任何作用,每个人都宣称自己是别人,混乱充斥人间啊。

PS:现在IE11的出现更热闹了

User-agent 字符串更改

对于许多传统网站,针对 IE11 的一些最明显的更新涉及 user-agent 字符串。 以下是针对 Windows 8.1 上的 IE11 报告的内容:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

用户代理字符串的特定值会因诸多因素(例如,运行浏览器的操作系统、运行浏览器的设备以及网站是否采用兼容性视图显示)而有所不同。 有关详细信息,请参阅用户代理字符串更改

与先前版本的 Internet Explorer 一样,部分 user-agent 字符串会因环境条件的不同而有所差异。 以下是针对 Windows 7 上的 IE11 显示的字符串:

如果将这些 user-agent 字符串与早期版本的 Internet Explorer 报告的字符串进行比较,你会发现以下更改:

  • 兼容 (“兼容”) 和浏览器 (“MSIE”) 令牌已删除。
  • “like Gecko” 令牌已添加(以便与其他浏览器一致)。
  • 浏览器版本现在由新版本 (“rv”) 令牌报告。

这些更改有助于防止 IE11 被(错误)标识为较早的版本。

通常,应避免检测特定浏览器或浏览器版本。 基于此类测试的假设易于在更新浏览器时导致误报。 相反,在你需要使用功能时检测功能并使用渐进增强为不支持所需功能的浏览器或设备提供简化体验。

在极少数情况下,必须唯一地标识 IE11。 使用 Trident 令牌来执行此操作。

文档模式更改

Windows Internet Explorer 8 中引入了文档模式,这些模式可以帮你实现从早期版本的浏览器支持的功能转换为现行标准和其他浏览器指定的功能。 Windows Internet Explorer 的后续版本继续使用此转换,方法是引入对行业标准所定义功能的支持的同时,引入模拟早期版本所支持功能的新文档模式。

当许多网站已更新为向其他浏览器提供更丰富的体验时,某些网站仍继续使用现有的传统功能支持向 Internet Explorer 提供传统体验,即便最新版本的浏览器支持为其他浏览器呈现的体验。

从 IE11 开始,边缘模式成为首选文档模式;它代表可供浏览器使用的现行标准的最高支持。

浏览器兼容性改造之为XML支持

1、问题描述

1.1、序列化XML

在IE中,提供xml属性,轻松序列化DOM文档,如下:     var xml = xmldom.xml;

为了将XML DOM文档序列化为XML字符串,FireFox 引入了XMLSerializer类型。其他浏览器Opera、Chrome和Safari都支持XMLSerializer,但IE8仍然不支持XMLSerializer。要序列化DOM文档,首先必须创建XMLSerializer的实例,然后将文档传入其中serializeToString()方法,如下:

var serializer = new XMLSerializer();

var xml = serializer.serializerToString(xmldom);

1.2、加载XML

IE中的XML文档对象可以加载来自服务器的文件。要加载XML文档必须与页面中运行的JavaScript代码来自同一台服务器。代码如下:     var xmldom = createDocument();     xmldom.async = false;     xmldom.load(“books.xml”);

Chrome由于安全方面的考虑,不支持load()方法,需要使用AJAX请求方式。

FireFox同样不支持,须为此添加load()方法。

1.3、解析XML

IE浏览器下,解析XML字符串,可通过如下方式:     var xmldom = createDocument();     xmldom.async = false;     xmldom.loadXML(“<BOOKS><BOOK><NAME>UML</NAME></BOOK></BOOKS>”);

为了将XML解析为DOM文档,FireFox引入了DOMPareser类型;后来,Opera也支持该类型。在解析XML之前,首先必须创建一个DOMParser的实例,然后再调用parseFromString()方法。这个方法接受两个参数:要解析的XML字符串和内容类型。返回值为Document的一个实例。如下例子:     var parse = new DOMParser();     var xmldom = parser.parseFromString(“<root></root>”, “text/xml”);

1.4、XPath支持

IE对XPath的支持是内置在XML DOM 文档对象中的。这个节库在每个节点上额外定义了两个方法:selectSingleNode()和selectNodes()。其中,selectSingleNode()方法接受一个XPath模式,在找到匹配节点是返回第一个匹配的节点,如果没有找到匹配的节点就返回null;     另一个方法selectNodes()也接受一个XPath模式作为参数,但它返回与模式匹配的所有节点的NodeList。     鉴于IE对XPath功能的支持有限,因此跨浏览器XPath只能保证到IE支持的功能。也就是要在其他使用DOM3级XPath对象的浏览器中,重新创建selectSingleNode()和selectNodes()方法。

2、解决方案

示例代码:

[javascript]
if (typeof ActiveXObject === ”" && document.implementation.hasFeature(“XPath”, ”3.0″)) {
Document.prototype.readyState = 0;
Document.prototype.onreadystatechange = null;
Document.prototype.__changeReadyState__ = function(iReadyState) {
this.readyState = iReadyState;
if (typeof this.onreadystatechange == ”function”) {
this.onreadystatechange();
}
};
Document.prototype.__initError__ = function () {
this.parseError.errorCode = 0;
this.parseError.filepos = -1;
this.parseError.line = -1;
this.parseError.linepos = -1;
this.parseError.reason = null;
this.parseError.srcText = null;
this.parseError.url = null;
};
Document.prototype.__checkForErrors__ = function() {
if (this.documentElement.tagName == ”parsererror”) {
var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
reError.test(this.xml);
this.parseError.errorCode = -999999;
this.parseError.reason = RegExp.$1;
this.parseError.url = RegExp.$2;
this.parseError.line = parseInt(RegExp.$3);
this.parseError.linepos = parseInt(RegExp.$4);
this.parseError.srcText = RegExp.$5;
}
};
Document.prototype.loadXML = function(sXml) {
this.__initError__();
this.__changeReadyState__(1);
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml, ”text/xml”);
while (this.firstChild) {
this.removeChild(this.firstChild);
}
for (var i=0; i < oXmlDom.childNodes.length; i++) {
var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
this.appendChild(oNewNode);
}
this.__checkForErrors__();
this.__changeReadyState__(4);
};
Document.prototype.load = function (sURL) {
this.__initError__();
this.__changeReadyState__(1);
this.__load__(sURL);
};
Document.prototype.__load__ = Document.prototype.load;
Document.prototype.__defineGetter__(“xml”, function() {
return (new XMLSerializer()).serializeToString(this, ”text/xml”);
});
Node.prototype.__defineGetter__(“text”, function() {
var sText = ”";
for (var i = 0; i < this.childNodes.length; i++) {
if (this.childNodes[i].hasChildNodes()) {
sText += this.childNodes[i].text;
} else {
sText += this.childNodes[i].nodeValue;
}
}
return sText;
});
Node.prototype.__defineSetter__(“text”, function(_value) {
this.textContent = _value;
});
Node.prototype.__defineGetter__(“xml”, function() {
return (new XMLSerializer()).serializeToString(this, ”text/xml”);
});
Document.prototype.selectSingleNode = Element.prototype.selectSingleNode = function(xpath) {
var x = this.selectNodes(xpath);
if (!x || x.length < 1) {
return null ;
}
return x[0];
};
Document.prototype.selectNodes = Element.prototype.selectNodes = function(xpath) {
var xpe = new XPathEvaluator();
var nsResolver = xpe.createNSResolver(this.ownerDocument == null ? this.documentElement : this.ownerDocument.documentElement);
var result = xpe.evaluate(xpath, this, nsResolver, 0, null);
var found = [];
var res;
while(res = result.iterateNext()) {
found.push(res);
}
return found;
};
HTMLElement.prototype.__defineGetter__( ”innerText”, function(){
var anyString = ”";
var childS = this.childNodes;
for(var i=0; i <childS.length; i++) {
if(childS[i].nodeType==1)
anyString += childS[i].tagName==”BR” ? ’\n’ : childS[i].innerText;
else if(childS[i].nodeType==3)
anyString += childS[i].nodeValue;
}
return anyString;
});
HTMLElement.prototype.__defineSetter__( ”innerText”, function(sText){
this.textContent=sText;
});
}
[/javascript]

本文转载自:http://blog.csdn.net/xuanze520/article/details/8060775