浏览器兼容常见问题介绍(ff,ie,Chrome)总结
现在浏览器越来越多了,兼容性也特别复杂,下面我收藏了css与javascript中浏览器兼容常见问题总结,有需要的朋友可参考一下。
突然间,在Chrome下看起来很整齐的布局,在IE下变成一团糟。为了找出原因,我改动了div的background-color属性。最后,发现同一个DIV的宽度在IE和Chrome下却不一样。这大晚上的,真是怪吓人滴!
之后,做了个测试.
Css代码如下:
div1
{
width:960px;
margin:0px;
padding:0px;
}
这时,在两个浏览器下是没有区别滴!总宽度均是960px。
但是,当Css代码如下:
div1
{
width:960px;
margin:0px;
padding:0px 10px 0px 10px;
}
这时,Chrome就不干了。她居然把padding的20px加在了外面,这样div1的总宽度就是960px+10px+10px=980px;而,在IE中div1的宽度仍是960px;
按照我的思维,感觉padding应该算在width里面滴,没想到Chrome这么倔。
经过测试,border和padding一样,margin的值均算在“width”的外面。
还有,在没有设置float的情况下,Chrome会把div1当成position:absolute,而IE会把其当成poisttion:relative;所以,尽量都这是块级元素的float为left!
1. 居中问题
div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin:auto
2. 高度问题
两上下排列或嵌套的div,上面的div设置高度(height),如果div里的实际内容大于所设高度,在FF中会出现两个div重叠的现象;但在IE中,下面的div会自动给上面的div让出空间
所以为避免出现层的重叠,高度一定要控制恰当,或者干脆不写高度,让他自动调节,比较好的方法是 height:100%;
但当这个div里面一级的元素都float了的时候,则需要在div块的最后,闭和前加一个沉底的空div,对应CSS是:
.float_bottom {clear:both;height:0px;font-size:0px;padding:0;margin:0;border:0;line-height:0px;overflow:hidden;}
3. clear:both;
不想受到float浮动的,就在div中写入clear:both;
4. IE浮动 margin 产生的双倍距离,代码如下:
#box {
float:left;
width:100px;
margin:0 0 0 100px; //这种情况之下IE会产生200px的距离
display:inline; //使浮动忽略
}
5. padding 问题
FF设置 padding 后,div会增加 height 和 width,但IE不会 (* 标准的 XHTML1.0 定义 dtd 好像一致了)
高度控制恰当,或尝试使用 height:100%;
宽度减少使用 padding
但根据实际经验,一般FF和IE的 padding 不会有太大区别,div 的实际宽 = width + padding ,所以div写全 width 和 padding,width 用实际想要的宽减去 padding 定义
6. div嵌套时 y 轴上 padding 和 marign 的问题
FF里 y 轴上 子div 到 父div 的距离为 父padding + 子marign
IE里 y 轴上 子div 到 父div 的距离为 父padding 和 子marign 里大的一个
FF里 y 轴上 父padding=0 且 border=0 时,子div 到 父div 的距离为0,子marign 作用到 父div 外面
7. padding,marign,height,width 的傻瓜式解决技巧
注意是技巧,不是方法,写好标准头:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
高尽量用padding,慎用margin,height尽量补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div
宽尽量用margin,慎用padding,width算准实际要的减去padding
列表类
1. ul 标签在FF中默认是有 padding 值的,而在IE中只有margin有值
先定义 ul {margin:0;padding:0;}
2. ul和ol列表缩进问题
消除ul、ol等列表的缩进时,样式应写成: {list-style:none;margin:0px;padding:0px;}
显示类
1. display:block,inline 两个元素
display:block; //可以为内嵌元素模拟为块元素
display:inline; //实现同一行排列的的效果
display:table; //for FF,模拟table的效果
display:block 块元素,元素的特点是:
总是在新行上开始;
高度,行高以及顶和底边距都可控制;
宽度缺省是它的容器的100%,除非设定一个宽度
div,p,h1,form,ul 和 li 是块元素的例子
display:inline 就是将元素显示为行内元素,元素的特点是:
和其他元素都在一行上;
高,行高及顶和底边距不可改变;
宽度就是它的文字或图片的宽度,不可改变。
span,a,label,input,img,strong 和 em 是 inline 元素的例子
2. 鼠标手指状显示
全部用标准的写法 cursor: pointer;
背景、图片类
1. background 显示问题
全部注意补齐 width,height 属性
2. 背景透明问题
IE: filter: progid: DXImageTransform.Microsoft.Alpha(style=0,opacity=60);
IE: filter: alpha(opacity=10);
FF: opacity:0.6;
FF: -moz-opacity:0.10;
最好两个都写,并将opacity属性放在下面
javascript部份
1. document.form.item 问题
问题:代码中存在 document.formName.item("itemName") 这样的语句,不能在FF下运行
解决方法:改用 document.formName.elements["elementName"]
2. 集合类对象问题
问题:代码中许多集合类对象取用时使用(),IE能接受,FF不能
解决方法:改用 [] 作为下标运算,例:
document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]
3. window.event
问题:使用 window.event 无法在FF上运行
解决方法:FF的 event 只能在事件发生的现场使用,此问题暂无法解决。可以把 event 传到函数里变通解决:
- onMouseMove = "functionName(event)"
- function functionName (e) {
- e = e || window.event;
- ......
- }
4. HTML对象的 id 作为对象名的问题
问题:在IE中,HTML对象的 ID 可以作为 document 的下属对象变量名直接使用,在FF中不能
解决方法:使用对象变量时全部用标准的 getElementById("idName")
5. 用 idName 字符串取得对象的问题
问题:在IE中,利用 eval("idName") 可以取得 id 为 idName 的HTML对象,在FF中不能
解决方法:用 getElementById("idName") 代替 eval("idName")
6. 变量名与某HTML对象 id 相同的问题
问题:在FF中,因为对象 id 不作为HTML对象的名称,所以可以使用与HTML对象 id 相同的变量名,IE中不能
解决方法:在声明变量时,一律加上 var ,以避免歧义,这样在IE中亦可正常运行,最好不要取与HTML对象 id 相同的变量名,以减少错误
7. event.x 与 event.y 问题
问题:在IE中,event 对象有x,y属性,FF中没有
解决方法:在FF中,与 event.x 等效的是 event.pageX ,但event.pageX IE中没有,故采用 event.clientX 代替 event.x ,在IE中也有这个变量,event.clientX 与 event.pageX 有微妙的差别,就是滚动条
要完全一样,可以这样:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
8. 关于frame
问题:在IE中可以用 window.testFrame 取得该frame,FF中不行
解决方法:
window.top.document.getElementById("testFrame").src = 'xx.htm'
window.top.frameName.location = 'xx.htm'
9. 取得元素的属性
在FF中,自己定义的属性必须 getAttribute() 取得
10. 在FF中没有 parentElement,parement.children 而用 parentNode,parentNode.childNodes
问题:childNodes 的下标的含义在IE和FF中不同,FF的 childNodes 中会插入空白文本节点
解决方法:可以通过 node.getElementsByTagName() 来回避这个问题
问题:当html中节点缺失时,IE和FF对 parentNode 的解释不同,例如:
- <form>
- <table>
- <input/>
- </table>
- </form>
FF中 input.parentNode 的值为form,而IE中 input.parentNode 的值为空节点
问题:FF中节点自己没有 removeNode 方法
解决方法:必须使用如下方法 node.parentNode.removeChild(node)
由于chrome,safari,opara 浏览器还未支持自动 “设为首页” & “加入收藏”. 所以我们只能try, catch一下, 给个错误提示! 也算完美了.
另外ie中, 很多人也碰到过 它window.external.addFavorite. 时会报错的问题. 所以俺也只好抛出提示信息了.
加入收藏,Js代码如下:
- function addFavorite(){
- if (document.all){
- try{
- window.external.addFavorite(window.location.href,document.title);
- }catch(e){
- alert( "加入收藏失败,请使用Ctrl+D进行添加" );
- }
- }else if (window.sidebar){
- window.sidebar.addPanel(document.title, window.location.href, "");
- }else{
- alert( "加入收藏失败,请使用Ctrl+D进行添加" );
- }
- }
设为首页,Js代码如下:
- function setHomepage(){
- if (document.all){
- document.body.style.behavior='url(#default#homepage)';
- document.body.setHomePage(window.location.href);
- }else if (window.sidebar){
- if(window.netscape){
- try{
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
- }catch (e){
- alert( "该操作被浏览器拒绝,如果想启用该功能,
- 请在地址栏内输入 about:config,然后将项 signed.applets.codebase_principal_support 值该为true" );
- }
- }
- var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components. interfaces.nsIPrefBranch);
- prefs.setCharPref('browser.startup.homepage',window.location.href);
- }else{
- alert('您的浏览器不支持自动自动设置首页,
- 请使用浏览器菜单手动设置!');
- }
- }
xml兼容
函数有——
xml_loadFile:xml同步/异步加载。
xml_transformNode:xsl转换。
xml_text:节点的文本。
selectSingleNode:根据XPath选择单个节点。
selectNodes:根据XPath选择多个节点。
全部代码(zyllibjs_xml.js)——
- /*
- zyllibjs_xml
- XML处理
- @author zyl910
- 注意——
- 1. Chrome 由于其安全机制限制, 不能读取本地文件。
- Reference
- ~~~~~~~~~
- http://www.jinlie.net/?p=302
- Chrome浏览器加载XML文档
- Update
- ~~~~~~
- [2011-11-02]
- 定义。
- [2011-11-09]
- xml_loadFile: 为回调函数加上isError参数。
- [2011-11-21]
- selectSingleNode
- selectNodes
- */
- // 加载XML文件并返回XML文档节点
- // return: 成功时返回一个对象(同步模式下返回xml文档对象,异步模式下返回操作对象),失败时返回空。
- // xmlUrl: xml文件的url。
- // funcAsync: 回调函数. function onload(xmlDoc, isError){ ... }
- function xml_loadFile(xmlUrl, funcAsync)
- {
- var xmlDoc = null;
- var isChrome = false;
- var asyncIs = (null!=funcAsync); // 是否是异步加载。当funcAsync不为空时,使用异步加载,否则是同步加载。
- // 检查参数
- if (""==xmlUrl) return null;
- if (asyncIs)
- {
- if ("function"!=typeof(funcAsync)) return null;
- }
- // 创建XML对象
- try
- {
- xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); // Support IE
- }
- catch(ex)
- {
- }
- if (null==xmlDoc)
- {
- try
- {
- // Support Firefox, Mozilla, Opera, etc
- xmlDoc = document.implementation.createDocument("", "", null); // 创建一个空的 XML 文档对象。
- }
- catch(ex)
- {
- }
- }
- if (null==xmlDoc) return null;
- // 加载XML文档
- xmlDoc.async = asyncIs;
- if (asyncIs)
- {
- if(window.ActiveXObject)
- {
- xmlDoc.onreadystatechange = function(){
- if(xmlDoc.readyState == 4)
- {
- var isError = false;
- if (null!=xmlDoc.parseError)
- {
- isError = (0!=xmlDoc.parseError.errorCode); // 0成功, 非0失败。
- }
- funcAsync(xmlDoc, isError);
- }
- }
- }
- else
- {
- xmlDoc.onload = function(){
- funcAsync(xmlDoc, false);
- }
- }
- }
- try
- {
- xmlDoc.load(xmlUrl);
- }
- catch(ex)
- {
- // alert(ex.message) // 如果浏览器是Chrome,则会catch这个异常:Object # (a Document) has no method "load"
- isChrome = true;
- xmlDoc = null;
- }
- if (isChrome)
- {
- var xhr = new XMLHttpRequest();
- if (asyncIs) // 异步
- {
- xhr.onreadystatechange = function(){
- if(xhr.readyState == 4)
- {
- funcAsync(xhr.responseXML, xhr.status != 200);
- }
- }
- xhr.open("GET", xmlUrl, true);
- try // 异步模式下,由回调函数处理错误。
- {
- xhr.send(null);
- }
- catch(ex)
- {
- funcAsync(null, true);
- return null;
- }
- return xhr; // 注意:返回的是XMLHttpRequest。建议异步模式下仅用null测试返回值。
- }
- else // 同步
- {
- xhr.open("GET", xmlUrl, false);
- xhr.send(null); // 同步模式下,由调用者处理异常
- xmlDoc = xhr.responseXML;
- }
- }
- return xmlDoc;
- }
- // 使用XSLT把XML文档转换为一个字符串。
- function xml_transformNode(xmlDoc, xslDoc)
- {
- if (null==xmlDoc) return "";
- if (null==xslDoc) return "";
- if (window.ActiveXObject) // IE
- {
- return xmlDoc.transformNode(xslDoc);
- }
- else // FireFox, Chrome
- {
- //定义XSLTProcesor对象
- var xsltProcessor=new XSLTProcessor();
- xsltProcessor.importStylesheet(xslDoc);
- // transformToDocument方式
- var result=xsltProcessor.transformToDocument(xmlDoc);
- var xmls=new XMLSerializer();
- var rt = xmls.serializeToString(result);
- return rt;
- }
- }
- // 得到节点的文本
- function xml_text(xmlNode)
- {
- if (null==xmlNode) return "";
- var rt;
- if (window.ActiveXObject) // IE
- {
- rt = xmlNode.text;
- }
- else
- {
- // FireFox, Chrome, ...
- rt = xmlNode.textContent;
- }
- if (null==rt) rt=xmlNode.nodeValue; // XML DOM
- return rt;
- }
- // 添加方法。为了兼容FireFox、Chrome。
- if (!window.ActiveXObject)
- {
- XMLDocument.prototype.selectSingleNode = Element.prototype.selectSingleNode = function (xpath)
- {
- var x = this.selectNodes(xpath)
- if ( ! x || x.length < 1 ) return null ;
- return x[ 0 ];
- }
- XMLDocument.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;
- }
- }
- Chrome浏览器加载XML文档
- Chrome浏览器不支持load方法加载XML文档。网上找了下,需要如下解决
- function loadXMLDoc(xml_name)
- {
- var xmlDoc;
- try
- {
- xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); // Support IE
- }
- catch(e)
- {
- try
- {
- // Support Firefox, Mozilla, Opera, etc
- xmlDoc = document.implementation.createDocument("", "", null) ;// 创建一个空的 XML 文档对象。
- }
- catch(e)
- {
- alert(e.message);
- }
- }
- // 加载XML文档
- try
- {
- xmlDoc.async = false; // 关闭异步加载
- xmlDoc.load(xml_name);
- }
- catch(e)
- {
- // alert(e.message) 如果浏览器是Chrome,则会catch这个异常:Object # (a Document) has no method "load",所以,以下实现支持chrome加载XML文档(只是粗略的写下)
- var xhr = new XMLHttpRequest();
- xhr.open("GET", xml_name, false);
- xhr.send(null);
- xmlDoc = xhr.responseXML.documentElement;
- }
- return xmlDoc;
- }
BTW,各浏览器加载XML字符串也不同。
IE使用 loadXML() 方法来解析 XML 字符串:
代码如下:xmlDoc.loadXML(xml_str);
FireFox等使用DOMParser 对象解析XML字符串,代码如下:
var parseXml = new DOMParser();