一、元素查找问题
1. document.all[name]
  (1)现有问题:Firefox不支持document.all[name]
  (2)解决方法:使用getElementsByName(name),getElementById(id)等来替代。
2. 集合类对象问题
  (1)现有问题:IE中对许多集合类对象取用时可以用 (),但在Firefox只能用[]。
      如:IE中可以使用document.forms("formName")来返回名字为"formName"的Form,但在Firefox却行不通。
   (2)解决方法:使用[],上例中可以改为document.forms["formName"]
3. HTML元素的ID在JavaScript可见
  (1)现有问题:IE中HTML元素中的ID可以作为document的下属对象变量名直接使用。在Firefox中不能。
  (2)解决方法:使用getElementById("idName")代替idName作为对象变量使用。
4. eval(idName)取得对象
  (1)现有问题:在IE中,利用eval(idName)可以取得ID为idName的HTML对象,在Firefox中不能。
  (2)解决方法:用 getElementById(idName) 代替 eval(idName)。 
5. 变量名与某HTML对象ID相同
  (1)现有问题:在Firefox中,因为对象ID不作为HTML对象的名称,所以可以使用与HTML对象id相同的变量名,IE中不能。
  (2)解决方法:在声明变量时,一律加上var,以避免歧义,这样在IE中亦可正常运行。此外,最好不要取与HTML对象id相同的变量名,以减少错误。
注:3、4和5都属于同一类的问题。
6. Frame
  (1)现有问题:在IE中可以用window.top.frameId和window.top.frameName来得到该Frame所代表的Window,Firefox中只能用window.top.frameName。
  (2)解决方法:将Frame的Id和Name设置成相同,使用window.top.frameName来访问Frame。
二、DOM操作
1. 设置元素的文本内容。
  (1)现有问题:IE使用innerText,而Firefox使用textContent来设置元素文本内容。
  (2)解决方法:如果文本内容不包含"<"和">"等特殊字符,可以使用innerHTML。否则,可以使用:
   
1
2
3
var child = elem.firstChild;
if (child != null) elem.removeChild(child);
elem.appendChild(document.createTextNode(content));
2. parentElement,parent.children
  (1)现有问题:IE可以使用parentElement获得父结点,parent.children得到结点的所有孩子结点。Firefox不支持。
  (2)解决方法:使用parentNode和parent.childNodes。
3. 对childNodes的解释。
  (1)现有问题:IE和Firefox中对childNodes的解释不同,IE不会包含空白文本结点,而Firefox会包含。
  (2)解决方法:使用childNodes过滤文本结点,如下: 
1
2
3
4
5
6
var children = elem.childNodes;
for (i = 0; i < children.length; i++) {
if (children[i].nodeType != 3) { // 过滤文本结点
// ...
}
}
4. 对document.getElementsByName的解释。
  (1)现有问题:IE中getElementsByName只会检查<input>和<img>元素,而在Firefox下会检查所有元素。
  (2)解决方法:不要使用getElementsByName检查除<input>和<img>之外的元素,如果要获得单个元素,尽量使用getElementById。
5. 对document.getElementById的解释。
  (1)现有问题:IE中getElementById不仅检查Id属性,也会检查Name属性,当Name属性匹配参数时也会返回该元素。而在Firefox中只会检查Id属性。
  (2)解决方法:尽量保持Id和Name相同,不要让一个元素name属性和另一个元素的id属性相同。 
三、事件
1. event.x与event.y问题
  (1)现有问题:在IE中,event对象有x,y 属性,Firefox中没有。
  (2)解决方法:在Firefox中,与event.x 等效的是 event.pageX。可以使用:
      mX = event.x ? event.x : event.pageX;     
2. window.event
  (1)现有问题:使用window.event无法在Firefox上运行
  (2)解决方法:
         原代码(可在IE中运行):       
1
2
3
4
5
6
7
8
9
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>
        新代码(可在IE和Firefox中运行):         
1
2
3
4
5
6
7
8
9
10
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>
3. attachEvent和addEventListener
  (1)现有问题:IE中使用attachEvent来添加事件,Firefox中使用addEventListener。
  (2)解决方法:如下,注意事件参数的区别,一个是click,一个是onclick。
        if (document.attachEvent) document.attachEvent("click", clickHandler,false);
        else document.addEventListener("onclick",clickHandler);
四、语法
1. const
  (1)现有问题:在IE中不能使用const关键字。如const constVar = 32;在IE中这是语法错误。
  (2)解决方法:不使用const,以var代替。
2. 多余的逗号
  (1)现有问题:firefox中对象文字常量容许多余的逗号,在IE中不允许。下面语句在IE中非法。
      var obj = { 'key' : 'aaa', }
  (2)解决方法:去掉多余逗号。 
五、XML
1. 创建XMLHttpRequest
  (1)现有问题:Firefox使用XMLHttpRequest,IE使用ActiveXObject。
  (2)解决方法:  
1
2
3
4
5
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
2. 创建DOM
  (1)现有问题:Firefox和IE创建DOM的方式不同。
  (2)解决方法:      
1
2
3
4
5
6
7
8
function createXmlDom() {
var oXmlDom;
if (Window.ActiveXObject) { // IE
oXmlDom = new ActiveXObject("Microsoft.XmlDom");
} else { // Firefox
oXmlDom = document.implementation.createDocument("", "", null);
}
}
3. 加载XML
  (1)现有问题:如果要加载外部文件IE和Firefox都可以用:
          oXmlDom.async=false;      // 这在Firefox中是必须的
          oXmlDom.load("test.xml");
     但是它们加载xml字符串的方式不一样,IE中直接可以使用oXmlDom.loadXML("<root><child/></root>"),而Firefox要使用DOMParser:
        var oParser = new DOMParser();
          var oXmlDom = oParser.parseFromString("<root/>", "text/xml");
  (2)解决方法:比较好的方法是给Firefox产生的XMLDom加上loadXML方法:
        if (isFirefox) { // 需要浏览器检测   
1
2
3
4
5
6
7
8
9
10
11
12
Document.prototype.loadXML = function(sXml) {
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);
}
}
}
      这样在IE和Firefox就可以调用loadXML方法了。
4. XPath支持
  (1)现有问题:IE中可以直接用XmlDOM的selectNodes来根据XPath表示式来选择结点,Firefox则比较复杂,需要使用XPathEvaluator。
     IE:    
1
2
3
4
var lstNodes = oXmlDom.documentElement.selectNodes("employee/name");
for (var i = 0; i < lstNodes.length; i++) {
alert(lstNodes[i].firstChild.nodeValue);
}
     Firefox:        
1
2
3
4
5
6
7
var oEvaluator = new XPathEvaluator();
var oResult = oEvaluator.evaluate("employee/name", oXmlDom.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var oElement = oResult.iterateNext();
while (oElement) {
alert(oElement.firstChild.nodeValue);
oElement = oResult.iterateNext();
}
  (2)解决方法:比较好的方法给Firefox的Element添加selectNodes方法。      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (isFirefox) { // 需要浏览器检测
Element.prototype.selectNodes = function(sXPath) {
var oEvaluator = new XPathEvaluator();
var oResult = oEvaluator.evaluate(sXPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

var aNodes = new Array();

if (oResult != null) {
var oElement = oResult.iterateNext();
while (oElement) {
aNodes.push(oElement);
oElement = oResult.iterateNext();
}
}
return aNodes;
}
}
   这样在IE和Firefox中就都可以调用selectNodes方法了。  
5. XSLT支持
  (1)现有问题:IE中可以使用XmlDOM的transferNode方法将其转换成html,而Firefox需要使用XSLTProcessor。
  IE:    
1
2
3
oXmlDom.load("employee.xml");
oXslDom.load("employee.xslt");
var sResult=oXmlDom.transformNode(oXslDom);
    Firefox:     
1
2
3
4
5
6
var oProcessor = new XSLTProcessor();
oProcessor.importStylesheet(oXslDom);
var oResultDom = oProcessor.transformToDocument(oXmlDom);
var oSerializer = new XMLSerializer();
var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
alert(sXml);
  (2)解决方法:比较好的方法给Firefox的Node添加transferNode方法。      
1
2
3
4
5
6
7
8
9
10
11
12
if (isFirefox) { // 需要浏览器检测
Node.prototype.transformNode = function(oXslDom) {
var oProcessor = new XSLTProcessor();
oProcessor.importStylesheet(oXslDom);
var oResultDom = oProcessor.transformToDocument(oXmlDom);

var oSerializer = new XMLSerializer();
var sXml = oSerializer.serializeToString(oResultDom, "text/xml");

return sXml;
}
}
   这样在IE和Firefox中就都可以调用transferNode方法了。
 
 
一、document.formName.item(”itemName”) 问题
 
问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName"];Firefox 下,只能使用document.formName.elements["elementName"]。
解决方法:统一使用document.formName.elements["elementName"]。
 
二、集合类对象问题
 
问题说明:IE下,可以使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。
解决方法:统一使用 [] 获取集合类对象。
 
三、自定义属性问题
 
问题说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox下,只能使用 getAttribute() 获取自定义属性。
解决方法:统一通过 getAttribute() 获取自定义属性。
 
四、eval(”idName”)问题
 
问题说明:IE下,可以使用 eval(”idName”) 或 getElementById(”idName”) 来取得 id 为 idName 的HTML对象;Firefox下,只能使用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。
解决方法:统一用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。
 
五、变量名与某HTML对象ID相同的问题
 
问题说明:IE下,HTML对象的ID可以作为 document 的下属对象变量名直接使用,Firefox下则不能;Firefox下,可以使用与HTML对象ID相同的变量名,IE下则不能。
解决方法:使用 document.getElementById(”idName”) 代替 document.idName。最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var关键字,以避免歧义。
 
六、const问题
 
问题说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量。
解决方法:统一使用var关键字来定义常量。
 
七、input.type属性问题
 
问题说明:IE下 input.type 属性为只读;但是Firefox下 input.type 属性为读写。
解决办法:不修改 input.type 属性。如果必须要修改,可以先隐藏原来的input,然后在同样的位置再插入一个新的input元素。
 
八、window.event问题
 
问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用。
解决方法:在事件发生的函数上加上event参数,在函数体内(假设形参为evt)使用 var myEvent = evt?evt:(window.event?window.event:null)
示例:
 
<input type="button" onclick="doSomething(event)"/>
<script language="javascript">
function doSomething(evt) {
var myEvent = evt?evt:(window.event?window.event:null)
...
}
九、event.x与event.y问题
 
问题说明:IE下,even对象有x、y属性,但是没有pageX、pageY属性;Firefox下,even对象有pageX、pageY属性,但是没有x、y属性。
解决方法:var myX = event.x ? event.x : event.pageX; var myY = event.y ? event.y:event.pageY;
如果考虑第8条问题,就改用myEvent代替event即可。
 
十、event.srcElement问题
 
问题说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。
解决方法:使用srcObj = event.srcElement ? event.srcElement : event.target;
如果考虑第8条问题,就改用myEvent代替event即可。
 
十一、window.location.href问题
 
问题说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location。
解决方法:使用 window.location 来代替 window.location.href。当然也可以考虑使用 location.replace()方法。
 
十二、模态和非模态窗口问题
 
问题说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能。
解决方法:直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。
如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话,使用 var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。
 
十三、frame和iframe问题
 
以下面的frame为例:
 
(1)访问frame对象
IE:使用window.frameId或者window.frameName来访问这个frame对象;
Firefox:使用window.frameName来访问这个frame对象;
解决方法:统一使用 window.document.getElementById(”frameId”) 来访问这个frame对象;
(2)切换frame内容
在IE和Firefox中都可以使用 window.document.getElementById(”frameId”).src = “webjx.com.html”或 window.frameName.location = “webjx.com.html”来切换frame的内容;
如果需要将frame中的参数传回父窗口,可以在frame中使用parent关键字来访问父窗口。
 
十四、body载入问题
 
问题说明:Firefox的body对象在body标签没有被浏览器完全读入之前就存在;而IE的body对象则必须在body标签被浏览器完全读入之后才存在。
[注] 这个问题尚未实际验证,待验证后再来修改。
[注] 经验证,IE6、Opera9以及FireFox2中不存在上述问题,单纯的JS脚本可以访问在脚本之前已经载入的所有对象和元素,即使这个元素还没有载入完成。
 
十五、事件委托方法
 
问题说明:IE下,使用 document.body.onload = inject; 其中function inject()在这之前已被实现;在Firefox下,使用 document.body.onload = inject();
解决方法:统一使用 document.body.onload=new Function('inject()'); 或者 document.body.onload = function(){/* 这里是代码 */}
[注意] Function和function的区别
 
十六、访问的父元素的区别
 
问题说明:在IE下,使用 obj.parentElement 或 obj.parentNode 访问obj的父结点;在firefox下,使用 obj.parentNode 访问obj的父结点。
解决方法:因为firefox与IE都支持DOM,因此统一使用obj.parentNode 来访问obj的父结点。
 
十七、innerText的问题.
 
问题说明:innerText在IE中能正常工作,但是innerText在FireFox中却不行。
解决方法:在非IE浏览器中使用textContent代替innerText。
示例:
 
if(navigator.appName.indexOf("Explorer") >-1){
document.getElementById('element').innerText = "my text";
} else{
document.getElementById('element').textContent = ";my text";
}
[注] innerHTML 同时被ie、firefox等浏览器支持,其他的,如outerHTML等只被ie支持,最好不用。
 
十八、Table操作问题
 
问题说明:ie、firefox以及其它浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。document.appendChild在往表里插入行时FIREFOX支持,IE不支持
解决办法:把行插入到TBODY中,不要直接插入到表
解决方法:
 
//向table追加一个空行:
 
var row = otable.insertRow(-1);
var cell = document.createElement("td");
cell.innerHTML = "";
cell.className = "XXXX";
row.appendChild(cell);
[注] 建议使用JS框架集来操作table,如JQuery。
 
十九、对象宽高赋值问题
 
问题说明:FireFox中类似 obj.style.height = imgObj.height 的语句无效。
解决方法:统一使用 obj.style.height = imgObj.height + ‘px';
 
二十、setAttribute('style','color:red;')
FIREFOX支持(除了IE,现在所有浏览器都支持),IE不支持
解决办法:不用setAttribute('style','color:red')
而用object.style.cssText = ‘color:red;'(这写法也有例外)
最好的办法是上面种方法都用上,万无一失
 
二一、类名设置
setAttribute('class','styleClass')
FIREFOX支持,IE不支持(指定属性名为class,IE不会设置元素的class属性,相反只使用setAttribute时IE自动识CLASSNAME属性)
解决办法:
setAttribute('class','styleClass')
 
setAttribute('className','styleClass')
 
或者直接 object.className='styleClass';
 
IE和FF都支持object.className。
 
二二、用setAttribute设置事件
var obj = document.getElementById('objId');
obj.setAttribute('onclick','funcitonname();');
FIREFOX支持,IE不支持
解决办法:
IE中必须用点记法来引用所需的事件处理程序,并且要用赋予匿名函数
如下:
var obj = document.getElementById('objId');
obj.onclick=function(){fucntionname();};
这种方法所有浏览器都支持
 
二三、建立单选钮
IE以外的浏览器
var rdo = document.createElement('input');
rdo.setAttribute('type','radio');
rdo.setAttribute('name','radiobtn');
rdo.setAttribute('value','checked');
 
IE:
var rdo =document.createElement(”<input name=”radiobtn” type=”radio” value=”checked” />”);
解决办法:
这一点区别和前面的都不一样。这次完全不同,所以找不到共同的办法来解决,那么只有IF-ELSE了
万幸的是,IE可以识别出document的uniqueID属性,别的浏览器都不可以识别出这一属性。问题解决。

最新文章

  1. 记一次从邻居无线路由渗透到邻居PC
  2. XVII Open Cup named after E.V. Pankratiev. GP of SPb
  3. js判断只能输入数字和只能输入
  4. activity跳转到新的activity后清除之前的activity
  5. 1.Powershell认识
  6. correlation filters in object tracking2
  7. GPUImage相关(转)
  8. 关于WPF的退出
  9. java四舍五入的取舍
  10. SqlServer将数据库中的表复制到另一个数据库
  11. js 去掉空格
  12. Couchbase 服务器
  13. webpy
  14. Hibernate中,将session绑定到线程时,在保存和查询数据的代码里,要正确的关闭session
  15. radare2逆向笔记
  16. ABAP开发规范
  17. mysql 通过慢查询日志查写得慢的sql语句
  18. Jfrog Artifactory jenkins 流水线使用docker的方式培训[暂未成功]
  19. pyqt常用窗口组件
  20. JavaScript中Array

热门文章

  1. ecplise最有用的8个快捷键
  2. Matlab 多项式拟合、稳健滤波等实用函数
  3. awk脚本使用的几种方法
  4. https原理及实践
  5. [DeeplearningAI笔记]改善深层神经网络1.4_1.8深度学习实用层面_正则化Regularization与改善过拟合
  6. 高仿bootstrap样式的分页插件
  7. canvas将图片转为base64
  8. 精通libGDX游戏开发-RPG实战-欢迎来到RPG的世界
  9. 一道python面试题引发的血案
  10. ABP官方文档翻译 9.3 NHibernate集成