`
奥义之舞
  • 浏览: 282054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IE、FF的JS兼容写法

阅读更多

BS 开发就难免会用到 javascript ,而每个浏览器对 javascript 的支持有不同。这就需要我们程序员去兼容他们
下面是兼容 IE FF js 脚本做法和分解(部分选自网上,经本人整理),希望对大家有帮助。    


/* 以下以 IE 代替 Internet Explorer ,以 MF/FF 代替 Mozzila Firefox  */  

//window.event    
IE :有 window.event 对象     
FF
:没有 window.event 对象。可以通过给函数的参数传递 event 对象。如 onmousemove=doMouseMove(event) 
解决方法: var   event  =  event  ||  window.event; 
example:
<script>
       
function   test(event) {
            
var   event  =  event  ||  window.event;
            
//do Something
       }
</script>
<input type="button"  value="click"  onclick="test(event)"/>


// 鼠标当前坐标     
IE event.x event.y     
FF
event.pageX event.pageY     
通用:两者都有 event.clientX event.clientY 属性。     

// 鼠标当前坐标 ( 加上滚动条滚过的距离 )    
IE event.offsetX event.offsetY     
FF
event.layerX event.layerY
解决方法:
<script>
       
function   test(event) {
            
var   event  =  event  ||  window.event;
            
//or var event = event ? event : window.event;// 2 中都可以,也可以用 if else (这简写)
             var   x  =  event.offsetX  ||  event.layerX;
            
var   y  =  event.offsetY  ||  event.layerY;
            
//do Something
       }
</script>    
<div onmousedown="test(event)"></div> 
/** 其他的兼容的解决方法类似,不再一一举例 **/

//event.srcElement 问题     
说明 :IE ,event 对象有 srcElement 属性 , 但是没有 target 属性 ;Firefox ,even 对象有 target 属性 ,
但是没有 srcElement 属性 .    
解决方法 : 使用 obj(obj  =  event.srcElement  ?  event.srcElement : event.target;)
来代替 IE 下的 event.srcElement 或者
Firefox
下的 event.target. 请同时注意 event 的兼容性问题。    

//event.toElement 问题     
问题:     
IE
下, even 对象有 srcElement 属性,但是没有 target 属性;
Firefox
下, even 对象有 target 属性,但是没有 srcElement 属性     
解决方法:     
var   target  =  e.relatedTarget  ||  e.toElement;    

// 标签的 x y 的坐标位置: style.posLeft style.posTop    
IE :有。     
FF
:没有。     
通用: object.offsetLeft object.offsetTop     

// 窗体的高度和宽度     
IE document.body.offsetWidth document.body.offsetHeight 。注意:此时页面一定要有 body 标签。     
FF
window.innerWidth window.innerHegiht
以及 document.documentElement.clientWidth document.documentElement.clientHeight     
通用: document.body.clientWidth document.body.clientHeight     

// 添加事件     
IE element.attachEvent("onclick",  function );     
FF
element.addEventListener("click",  function ,  true )     
用: element.onclick= function 。虽然都可以使用 onclick 事件,但是 onclick 和上面两种方法的效果是不一样的,
onclick
只有执行一个过程,而 attachEvent addEventListener 执行的是一个过程列表,也就是多个过程。
例如: element.attachEvent("onclick", func1);
element.attachEvent("onclick", func2)
这样 func1 func2 都会被执行。     

// 标签的自定义属性     
IE :如果给标签 div1 定义了一个属性 value ,可以 div1.value div1["value"] 取得该值。     
FF
:不能用 div1.value div1["value"] 取。     
通用: div1.getAttribute("value")     

//document.form.item 问题    
IE: 现有问题:现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 MF 下运行    
FF/IE: document.formName.elements["elementName"]   

// 集合 / 数组类对象问题    
(1) 现有问题:    
   
现有代码中许多集合类对象取用时使用 () IE 能接受, MF 不能。    
(2)
解决方法:    
   
改用 [] 作为下标运算。如: document.forms("formName") 改为 document.forms["formName"]    
   
又如: document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]   

//HTML 对象的 id 作为对象名的问题    
(1) 现有问题    
    
IE 中, HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。    
(2)
解决方法    
    
getElementById("idName") 代替 idName 作为对象变量使用    

// idName 字符串取得对象的问题    
(1) 现有问题    
    
IE 中,利用 eval(idName) 可以取得 id idName HTML 对象,在 MF 中不能。    
(2)
解决方法    
    
getElementById(idName) 代替 eval(idName)    

// 变量名与某 HTML 对象 id 相同的问题    
(1) 现有问题    
   
MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名, IE 中不能。    
(2)
解决方法    
   
在声明变量时,一律加上   var   ,以避免歧义,这样在 IE 中亦可正常运行。    
   
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。    

//document.getElementsByName() document.all[name] 的问题    
现有问题:在 IE 中, getElementsByName() document.all[name] 均不能用来取得 div 元素
(是否还有其它不能取的元素还不知道)。    
//document.all   
Firefox 可以兼容 document.all 但会生成一条警告。可以用 getElementById("*") 
或者 getElementByTagName("*") 来代替    
不过对于 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   parWin  =  window.opener; parWin.document.getElementById("Aqing").value  =  "Aqing";    

//frame 问题     
以下面的 frame 为例:     
<frame src="xxx.html"  mce_src="xxx.html"  id="frameId"  name="frameName"  />    
(1)
访问 frame 对象 :    
IE:
使用 window.frameId 或者 window.frameName 来访问这个 frame 对象 . frameId frameName 可以同名。     
FF:
只能使用 window.frameName 来访问这个 frame 对象 .    
另外,在 IE Firefox 中都可以使用 window.document.getElementById("frameId") 来访问这个 frame 对象 .    
(2)
切换 frame 内容 :    
IE Firefox 中都可以使用 window.document.getElementById("testFrame").src  =  "xxx.html"
window.frameName.location  =  "xxx.html" 来切换 frame 的内容 .    
如果需要将 frame 中的参数传回父窗口 ( 注意不是 opener, 而是 parent frame) ,可以在 frme 中使用 parent 来访问父窗口。
例如: window.parent.document.form1.filename.value="Aqing";    

//body 问题     
Firefox body body 标签没有被浏览器完全读入之前就存在;而 IE body 则必须在 body 标签被浏览器完全读入之后才存在    

// 事件委托方法     
IE document.body.onload  =  inject;  //Function inject() 在这之前已被实现     
FF document.body.onload  =  inject();    

//firefox IE 的父元素 (parentElement) 的区别     
IE obj.parentElement    
FF
obj.parentNode    
解决方法 : 因为 FF IE 都支持 DOM, 因此使用 obj.parentNode 是不错选择    

//innerText IE 中能正常工作,但是 innerText FireFox 中却不行 . 需用 textContent   

//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.length, 
SelectName.options.add/remove
都可以在两种浏览器上使用。    
注意在 add 后赋值元素,否则会失败    
动态删除 select 中的所有 options     
       document.getElementById("ddlResourceType").options.length=0;    
动态删除 select 中的某一项 option     
       document.getElementById("ddlResourceType").options.remove(indx);     
动态添加 select 中的项 option:    
       document.getElementById("ddlResourceType").options.add(
new   Option(text,value));    
IE FF
动态删除通用方法:    
document.getElementById("ddlResourceType").options[indx]  = 
null ;   

// 捕获事件     
问题:     
FF
没有 setCapture() releaseCapture() 方法     
解决方法:     
IE:    
obj.setCapture();    
obj.releaseCapture();    
FF:    
window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);    
window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);    
if   (!window.captureEvents) {    
       o.setCapture();    
}
else   {    
       window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);    
}    
if   (!window.captureEvents) {    
       o.releaseCapture();    
}
else   {    
       window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);    
}    


// 禁止选取网页内容     
问题:     
FF
需要用 CSS 禁止, IE JS 禁止     
解决方法:     
IE: obj.onselectstart  = 
function () { return   false ;}    
FF:  -moz-user-select:none;    


// 画图     
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-  bottomright:4px;
    

//CSS :双线凹凸边框     
IE border:2px outset;     
FF
-moz-  border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;
-moz-border-right-colors:#404040  #808080;-moz-border-bottom-colors:#404040  #808080;
 


本文来自 CSDN 博客,转载请标明出处: http: //blog.csdn.net/IBM_hoojo/archive/2010/07/02/5708440.aspx

 

分享到:
评论

相关推荐

    JAVASCRIPT IE 与 FF 中兼容写法记录

    下面是高手整理的一些javascript在ie和ff中的兼容写法

    Firefox和IE浏览器兼容JS脚本写法小结

    1.window.event兼容脚本 function getEvent(){ //获取浏览器事件,同时兼容ie和ff的写法 if(document.all) return window.event; func=getEvent.caller; while(func!=null){ var arg0=func.arguments[0];...

    IE浏览器兼容Firefox的JS脚本的代码

    父控件下的子控件 8.XmlHttp 1.window.event兼容脚本 function getEvent(){ //获取浏览器事件,同时兼容ie和ff的写法 if(document.all) return window.event; func=getEvent.caller; while(func!=null){ var arg0=...

    Javascript下IE与Firefox下的差异兼容写法总结

    window.event对象差异 IE:有window.event对象 FF:没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event) 获取鼠标当前坐标 IE:event.x和event.y。 FF:event.pageX和event...

    [removed]google 向上向下滚动特效,兼容IE6,7,8,FF

    2010最新全面兼容ie6,ie7,ie8,ff的CSS HACK写法 #google1 { border:none; width:270px; height:20px; margin:0px 0; font-size:12px; padding-left:0px; overflow:hidden; font-family:Arial; } #google1 ul { ...

    js拖动窗口

    javascript动窗口 javascriptdrag 拖动窗口原生写法 拖动窗口oop写法 oop封装 有详细的注释,兼容ie6,ff,chrome

    解决IE6、IE7、Firefox兼容比较简单的CSS Hack

    第二排给IE7(可能以后的IE8、IE9也是如此,谁知道呢)看 第三排给IE6以及更老的版本看 最好的应用就是可以让IE6也“支持”position:fixed,而且,配合这个原理,可以做到不引入JavaScript代码(仅用IE6的expression...

    JavaScript兼容性总结之获取非行间样式案例

    非行间样式案例 #div1 { width: 200px; height: 200px; background: red; } IE获取非行间样式 ...var oDiv = document.getElementById('div1');...我的兼容性写法 var oDiv = document.getElementById('di

    用javascript做拖动布局的思路

    格式化事件的函数 代码如下: function getEvent(){ //同时兼容ie和ff的写法 if(document.all) return window.event; func=getEvent.caller; while(func!=null){ var arg0=func.arguments[0]; if(arg0){ if((arg0....

    JavaScript阻止事件冒泡示例分享

    IE以前版本的兼容性还没测试,用到时再完善吧。  代码如下: //取消事件冒泡 function stopBubble(e) {  var evt = (e) ? e : window.event;//兼容FF  evt.cancelBubble = true; //evt.stopPro

    漂亮的消息提示框 消息提示组件 Javascript写的

    2、兼容IE6.0+、FF1.5+、Opear9+(在Opear下显示有一个小缺陷),兼容HTML4/XHTML1.0页面渲染模式。 3、完全的CSS皮肤定制功能,所有外观包括显示图标/关闭按钮等都可以通过css设置。目前提供了五种皮肤,Vista、QQ...

    好看好用的alert提示框

    2、兼容IE6.0+、FF1.5+、Opear9+(在Opear下显示有一个小缺陷),兼容HTML4/XHTML1.0页面渲染模式。 3、完全的CSS皮肤定制功能,所有外观包括显示图标/关闭按钮等都可以通过css设置。目前提供了五种皮肤,Vista、QQ...

    jquery插件使用方法大全

    它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX...

    精易模块[源码] V5.15

    MD5:6592799FF42CE9AFDF122C47642C9DEE 精易模块 V3.87 what’s new:(20141021) 1、新增“效验_取md5_进度”,进度获取文件MD5值,支持大文件,采纳易友【@易模块】建议。 2、改善“程序_禁止重复运行”添加...

Global site tag (gtag.js) - Google Analytics