做BS开发就难免会用到javascript,而每个浏览器对javascript的支持有不同。这就需要我们程序员去兼容他们
下面是兼容IE和FF的js脚本做法和分解(部分选自网上,经本人整理),希望对大家有帮助。
//window.event
IE:有window.event对象
FF:没有window.event对象。可以通过给函数的参数传递event对象。如οnmοusemοve=doMouseMove(event)
解决方法:var
example:
//鼠标当前坐标
IE:event.x和event.y。
FF:event.pageX和event.pageY。
通用:两者都有event.clientX和event.clientY属性。
//鼠标当前坐标(加上滚动条滚过的距离)
IE:event.offsetX和event.offsetY。
FF:event.layerX和event.layerY。
解决方法:
//event.srcElement问题
说明:IE下,event对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,
但是没有srcElement属性.
解决方法:使用obj(obj
来代替IE下的event.srcElement或者
Firefox下的event.target.
//event.toElement问题
问题:
IE下,even对象有srcElement属性,但是没有target属性;
Firefox下,even对象有target属性,但是没有srcElement属性
解决方法:
var
//标签的x和y的坐标位置:style.posLeft
IE:有。
FF:没有。
通用:object.offsetLeft
//窗体的高度和宽度
IE:document.body.offsetWidth和document.body.offsetHeight。注意:此时页面一定要有body标签。
FF:windows.innerWidth和windows.innerHegiht,
以及document.documentElement.clientWidth和document.documentElement.clientHeight。
通用:document.body.clientWidth和document.body.clientHeight。
//添加事件
IE:element.attachEvent("onclick",
FF:element.addEventListener("click",
通
onclick
例如:element.attachEvent("onclick",
element.attachEvent("onclick",
//标签的自定义属性
IE:如果给标签div1定义了一个属性value,可以div1.value和div1["value"]取得该值。
FF:不能用div1.value和div1["value"]取。
通用:div1.getAttribute("value")。
//document.form.item
IE:现有问题:现有代码中存在许多
FF/IE:
//集合/数组类对象问题
(1)现有问题:
(2)解决方法:
//HTML
(1)现有问题
(2)解决方法
//用idName字符串取得对象的问题
(1)现有问题
(2)解决方法
//变量名与某
(1)现有问题
(2)解决方法
//document.getElementsByName()
现有问题:在
(是否还有其它不能取的元素还不知道)。
//document.all
Firefox可以兼容document.all,
或者
不过对于document.all.length等属性,则完全不兼容
//input.type属性问题
说明:IE下input.type属性为只读;但是Firefox下input.type属性为读写
//window.location.href问题
说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,
只能使用window.location
解决方法:使用window.location来代替window.location.href
//模态和非模态窗口问题
说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口。
如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口.
例如:var
//frame问题
以下面的frame为例:
(1)访问frame对象:
IE:使用window.frameId或者window.frameName来访问这个frame对象.
FF:只能使用window.frameName来访问这个frame对象.
另外,在IE和Firefox中都可以使用window.document.getElementByIdx_x("frameId")来访问这个frame对象.
(2)切换frame内容:
在IE和Firefox中都可以使用window.document.getElementByIdx_x("testFrame").src
或window.frameName.location
如果需要将frame中的参数传回父窗口(注意不是opener,而是parent
例如:window.parent.document.form1.filename.value="Aqing";
//body问题
Firefox的body在body标签没有被浏览器完全读入之前就存在;而IE的body则必须在body标签被浏览器完全读入之后才存在
//事件委托方法
IE:document.body.onload
FF:document.body.onload
//firefox与IE的父元素(parentElement)的区别
IE:obj.parentElement
FF:obj.parentNode
解决方法:
//innerText在IE中能正常工作,但是innerText在FireFox中却不行.
//FireFox中设置HTML标签的style时,所有位置性和字体尺寸的值必须后跟px。这个ie也是支持的
//父节点、子节点和删除节点
IE:parentElement、parement.children,element.romoveNode(true)。
FF:parentNode、parentNode.childNodes,node.parentNode.removeChild(node)。
//对select的options集合操作
枚举元素除了[]外,SelectName.options.item()也是可以的,
SelectName.options.add/remove都可以在两种浏览器上使用。
注意在add后赋值元素,否则会失败
动态删除select中的所有options:
动态删除select中的某一项option:
动态添加select中的项option:
IE
document.getElementByIdx_x("ddlResourceType").options[indx]
//捕获事件
问题:
FF没有setCapture()、releaseCapture()方法
解决方法:
IE:
obj.setCapture();
obj.releaseCapture();
FF:
window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
if
}else
}
if
}else
}
//禁止选取网页内容
问题:
FF需要用CSS禁止,IE用JS禁止
解决方法:
IE:
FF:
//画图
IE:VML。
FF:SVG。
//CSS:透明
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
FF:opacity:0.6。
//CSS:圆角
IE:不支持圆角。
FF:-moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;
-moz-border-radius-bottomleft:4px;-moz-border-radius-
//CSS:双线凹凸边框
IE:border:2px
FF:-moz-
-moz-border-right-colors:#404040
1、浏览器兼容问题主要在CSS上,其次才是JS处理的问题。
浏览器兼容性问题处理很复杂,首先得考虑支持JS的浏览器与不支持JS的浏览器的问题,
其次得考虑不同类型的浏览器问题如:IE和FIREFOX,再次需要考虑同一类型浏览器不同版本的问题。
2、根据浏览器的特性做判断,如只有IE支持actionx控件,因此只要判断ActiveXObject函数就可以了
firefox中的dom元素都有getboxobjectfor函数,用来获取该元素的位置和大小。
opera有专门的标志window.opera
safari有openDatabase函数
3、可以通过http请求头中的User-Agent字段来判断浏览器的类型和版本。
4、可以使用HTML的注释符号来包裹JS以和谐掉不支持JS浏览器的问题
5、在使用sctipt标签的时候由于有多个脚本语言如:javascript、vbsctipt等,因此建议明确指明language,并且指明JS版本有利于解决JS低
版本不支持某些语法的问题,javasctipt1.5
6、如果实在没办法提供JS服务了,那么可以使用标记提示用户浏览器无法正确显示页面
7、除非绝对必须,否则不应该使用浏览器检测这个方法,因为他具有不准确性而且嵌套的if判断等大量判断语句会导致程序扩展性、阅读性以
及运行效率下降。必须使用浏览器检查一般是传递到方法的参数在浏览器之间执行不同的解释。
你还可以使用jquery的浏览器判断函数$.browser,它可以判断浏览器甚至版本。也可以使用$.boxModel来判断方框模型,$.styleFloat。
8、良好的跨浏览器编程应该是对在平时经验的积累中获知到哪些语句兼容性强,针对性的解决某些兼容问题。尽量选用兼容性强的JS语法表现
方式,如getElementById()而非document.forms[0].id;
某些JS函数增加有效性判断,如if(!windows.opener){xxx}else{xxxx}对浏览器是否支持opener函数进行了判断;又如针对EVENT的兼容,标准
事件模型定义addEventListener方法而IE为attachEvent()那么就针对性的编写
if(element.attachEvent){element.attachEvent('onclick',xxxx);}else
('click',xxxx);}else{throw
avascript部分
1.
问题:
代码中存在
解决方法:
改用
2.
问题:
代码中许多集合类对象取用时使用(),IE能接受,FF不能
解决方法:
改用
document.getElementsByName("inputName")(1)
3.
问题:
使用
解决方法:
FF的
onMouseMove
function
}
4.
问题:
在IE中,HTML对象的
解决方法:
使用对象变量时全部用标准的
5.
问题:
在IE中,利用
解决方法:
用
6.
问题:
在FF中,因为对象
解决方法:
在声明变量时,一律加上
最好不要取与HTML对象
7.
问题:
在IE中,event
解决方法:
在FF中,与
故采用
event.clientX
要完全一样,可以这样:
mX
然后用
8.
问题:
在IE中可以用
解决方法:
window.top.document.getElementByIdx_x("testFrame").src
window.top.frameName.location
9.
在FF中,自己定义的属性必须
10.
问题:
childNodes
解决方法:
可以通过
问题:
当html中节点缺失时,IE和FF对
FF中
问题:
FF中节点自己没有
解决方法:
必须使用如下方法
11.
问题:
在IE中不能使用
解决方法:
以
12.
FF的
这会产生在IE下,文档没有载入完时,在body上appendChild会出现空白页面的问题
解决方法:
一切在body上插入节点的动作,全部在onload后进行
13.
问题:
一般FF无法识别js中的&
解决方法:
在js中如果书写url就直接写&不要写&
14.
问题:
在FF中,所有节点均有
解决方法:
使用
15.
IE下
16.
问题:
在IE中,getElementsByName()、document.all[name]
是否还有其它不能取的元素还不知道(这个问题还有争议,还在研究中)
17.
在IE中,可以用如下方法来取得子元素中的值
document.getElementByIdx_x("frameName").(document.)elementName
window.frames["frameName"].elementName
在FF中则需要改成如下形式来执行,与IE兼容:
window.frames["frameName"].contentWindow.document.elementName
window.frames["frameName"].document.elementName
18.
问题:
FireFox中类似
解决方法:
统一使用
19.
问题:
innerText
解决方法:
在非IE浏览器中使用textContent代替innerText
20.
问题:
IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性
解决方法:
var
var
21.
问题:
FF需要用CSS禁止,IE用JS禁止
解决方法:
IE:
FF:
22.
问题:
FF没有setCapture()、releaseCapture()方法
解决方法:
IE:
obj.setCapture();
obj.releaseCapture();
FF:
window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
if
}else
}
if
}else
}
CSS部分
div类
1.
div里的内容,IE默认为居中,而FF默认为左对齐
可以尝试增加代码margin:auto
2.
两上下排列或嵌套的div,上面的div设置高度(height),如果div里的实际内容大于所设高度,在FF中会出现两个div重叠的现象;但在IE中,下面的div会自动给上面的div让出空间
所以为避免出现层的重叠,高度一定要控制恰当,或者干脆不写高度,让他自动调节,比较好的方法是
但当这个div里面一级的元素都float了的时候,则需要在div块的最后,闭和前加一个沉底的空div,对应CSS是:
.float_bottom
3.
不想受到float浮动的,就在div中写入clear:both;
4.
#box
float:left;
width:100px;
margin:0
display:inline;
}
5.
FF设置
高度控制恰当,或尝试使用
宽度减少使用
但根据实际经验,一般FF和IE的
6.
FF里
IE里
FF里
7.
注意是技巧,不是方法:
写好标准头
http://www.w3.org/1999/xhtml">
高尽量用padding,慎用margin,height尽量补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div
宽尽量用margin,慎用padding,width算准实际要的减去padding
列表类
1.
先定义
2.
消除ul、ol等列表的缩进时,样式应写成:
显示类
1.
display:block;
display:inline;
display:table;
display:block
总是在新行上开始;
高度,行高以及顶和底边距都可控制;
宽度缺省是它的容器的100%,除非设定一个宽度
,
,
,-
和 -
是块元素的例子
display: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属性放在下面