1.eval(idName)
【问题描述】: IE 、 safari 、 Chrome 浏览器下都可以使用 eval(idName) 或 getElementById(idName) 来取得 id 为 idName 的 HTML 对象; firefox 下只能使用 getElementById(idName) 来取得 id 为 idName 的 HTML 对象 .
【兼容办法】: 统一用 getElementById("idName") 来取得 id 为 idName 的 HTML 对象。
2.ActiveXObject
【问题描述】: IE 下支持用 var obj = new ActiveXObject() 的方式创建对象,但其它浏览器都会提示 ActiveXObject 对象未定义。
【兼容办法】:
(1) 在使用 new ActiveXObject() 之前先判断浏览器是否支持 ActiveXObject 对象,以创建 AJAX 对象为例:
1
if
(window.ActiveXObject)
2
{
3
this
.req=
new
ActiveXObject("Microsoft.XMLHTTP"
);
4
}
5
else
if
(window.XMLHttpRequest)
6
{
7
this
.req=
new
XMLHttpRequest();
8
}
(2) 使用 jQuery 封装的 ajax 方法来创建对象,以创建 AJAX 对象为例 (推荐) :
1
var
strResponse = ""
;
2
jQuery.ajax({ url: sAspFile, data: "<root>" + sSend + "</root>", processData:
false
, async:
false
, type: "POST"
,
3
error:
function
(XMLHttpRequest, textStatus, errorThrown)
4
{
5
strResponse =
textStatus;
6
},
7
success:
function
(data, textStatus)
8
{
9
strResponse =
data;
10
}
11
});
3.XML 操作
【问题描述】: 通常装载 xml 文档使用 ActiveXObject 对象,但除非 IE 外,其它浏览器都不支持此方法。 XML 文档操作, IE 和其它浏览器也存在不同,通常取 XML 对象的 XML 文本的方法是 xml.documentElement.xml ,但 xml 属性只有 IE 支持,其它浏览器均不支持。查找节点是常用的方法有 selectNodes 和 selectSingleNode ,这两个方法也只有 IE 支持,其它浏览器需要自己扩展。
【兼容办法】
(1) 装载 XML 文档:用 $.ajax() ,参考 jquery 帮助文档
(2)xml 对象转字符串, 如:
1
var
stringtoxml =
function
(str) {
//
字符串转xml对象
2
var
s = "<?xml version='1.0' encoding='utf-8' ?>" +
str;
3
var
objxml =
null
;
4
if
(window.ActiveXObject) {
5
objxml =
new
ActiveXObject("Microsoft.XMLDOM"
);
6
objxml.async =
false
;
7
objxml.loadXML(s);
8
}
9
else
{
10
objxml = (
new
DOMParser()).parseFromString(s, "text/xml"
);
11
}
12
return
objxml;
13
}
14
15
var
xmltostring =
function
(dom) {
//
xml对象转字符串
16
if
(dom
instanceof
jQuery) {
17
dom = dom[0
];
18
}
19
var
str =
null
;
20
if
(window.ActiveXObject) {
21
str =
dom.xml;
22
}
23
else
{
24
str = (
new
XMLSerializer()).serializeToString(dom);
25
}
26
return
str;
27
}
28
29
var
oXMLO = stringtoxml("<root>"+ xml +"</root>"
);
30
var
root =
oXMLO.documentElement;
31
var
strXml = xmltostring(root).replace("<root>","");
(3) 字符串转 xml 对象, 如:
1
var
oXML = stringtoxml("<root>" + document.getElementById("hidTaskXml").value + "</root>");
(4) 查找结点:可以用 JQUERY 同的 find 方法来查找结点,如:
1
var
item = $(oXML).find("record");
或者用原型扩展方法为 XML 对象添加 selectNodes 和 selectSingleNode 方法,扩展方法如下:
if
( document.implementation.hasFeature("XPath", "3.0"
) )
{
XMLDocument.prototype.selectNodes
=
function
(cXPathString, xNode)
{
if
( !
xNode )
{
xNode
=
this
;
}
var
oNSResolver =
this
.createNSResolver(
this
.documentElement);
var
aItems =
this
.evaluate(cXPathString, xNode, oNSResolver,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
) ;
var
aResult =
[];
for
(
var
i = 0; i < aItems.snapshotLength; i++
)
{
aResult[i]
=
aItems.snapshotItem(i);
}
return
aResult;
}
Element.prototype.selectNodes
=
function
(cXPathString)
{
if
(
this
.ownerDocument.selectNodes)
{
return
this
.ownerDocument.selectNodes(cXPathString,
this
);
}
else
{
throw
"For XML Elements Only"
;
}
}
XMLDocument.prototype.selectSingleNode
=
function
(cXPathString, xNode)
{
if
( !
xNode )
{
xNode
=
this
;
}
var
xItems =
this
.selectNodes(cXPathString, xNode);
if
( xItems.length > 0
)
{
return
xItems[0
];
}
else
{
return
null
;
}
}
Element.prototype.selectSingleNode
=
function
(cXPathString)
{
if
(
this
.ownerDocument.selectSingleNode)
{
return
this
.ownerDocument.selectSingleNode(cXPathString,
this
);
}
else
{
throw
"For XML Elements Only"
;
}
}
}
4.window.execScript()
【问题描述】: 只有 IE 浏览器支持 execScript 方法,其它的都不支持。但所有浏览器都支持 window.eval() 方法。
【兼容办法】: 用 window.eval() 方法代替 window.execScript() 。如
1
//
window.execScript(“alert(123)”);
2
3
window.eval(“alert(123)”);
5.window.createPopup()
【问题描述】: 创建一个弹出窗口的方法, IE 支持此方法, Safari 、 FireFox 、 Chrome 都不支持,使用时会提示 createPopup 方法未定义。
【兼容办法】: 可用如下方法为 window 对象添加 createPopup 方法。
if
(!
window.createPopup) {
var
__createPopup =
function
() {
var
SetElementStyles =
function
( element, styleDict ) {
var
style =
element.style ;
for
(
var
styleName
in
styleDict )style[ styleName ] =
styleDict[ styleName ] ;
}
var
eDiv = document.createElement( 'div'
);
SetElementStyles( eDiv, {
'position': 'absolute', 'top': 0 + 'px', 'left': 0 + 'px', 'width': 0 + 'px', 'height': 0 + 'px', 'zIndex': 1000, 'display' : 'none', 'overflow' : 'hidden'
} ) ;
eDiv.body
=
eDiv ;
var
opened =
false
;
var
setOpened =
function
( b ) {
opened
=
b;
}
var
getOpened =
function
() {
return
opened ;
}
var
getCoordinates =
function
( oElement ) {
var
coordinates = {x:0,y:0
} ;
while
( oElement ) {
coordinates.x
+=
oElement.offsetLeft ;
coordinates.y
+=
oElement.offsetTop ;
oElement
=
oElement.offsetParent ;
}
return
coordinates ;
}
return
{
htmlTxt :
''
,
document : eDiv,
isOpen : getOpened(),
isShow :
false
,
hide :
function
() {
SetElementStyles( eDiv, {
'top': 0 + 'px', 'left': 0 + 'px', 'width': 0 + 'px', 'height': 0 + 'px', 'display' : 'none'
} ) ;
eDiv.innerHTML
= ''
;
this
.isShow =
false
;
},
show :
function
( iX, iY, iWidth, iHeight, oElement ) {
if
(!
getOpened()) {
document.body.appendChild( eDiv ) ; setOpened(
true
) ;
} ;
this
.htmlTxt =
eDiv.innerHTML ;
if
(
this
.isShow) {
this
.hide() ;
} ;
eDiv.innerHTML
=
this
.htmlTxt ;
var
coordinates =
getCoordinates ( oElement ) ;
eDiv.style.top
= ( iX + coordinates.x ) + 'px'
;
eDiv.style.left
= ( iY + coordinates.y ) + 'px'
;
eDiv.style.width
= iWidth + 'px'
;
eDiv.style.height
= iHeight + 'px'
;
eDiv.style.display
= 'block'
;
this
.isShow =
true
;
}
}
}
window.createPopup
=
function
() {
return
__createPopup();
}
}
6.getYear() 方法
【问题描述】: 如下代码:
1
var
year=
new
Date().getYear();
2
3
document.write(year);
在 IE 中得到的日期是 "2011" ,在 Firefox 中看到的日期是 "111" ,主要是因为在 Firefox 里面 getYear 返回的是 " 当前年份 -1900" 的值。
【兼容办法】: 解决办法是加上对年份的判断,如 :
1
var
year=
new
Date().getYear();
2
year = (year<1900?(1900+
year):year);
3
document.write(year);
也可以通过 getFullYear getUTCFullYear 去调用 :
1
var
year =
new
Date().getFullYear();
2
3
document.write(year);
7.document.all
【问题描述】: document.all 在 IE 、 Safari 下都可以使用, firefox 、 Chrome 下不能使用
【兼容办法】: 所有以 document.all.* 方法获取对象的地方都改为 document.getElementById 或 document.getElementsByName 或 document.getElementsByTagName 。
8. 变量名与对象 ID 相同的问题
【问题描述】 :IE 下 ,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用,如下面的写法:
objid.value = “123”;
//
objid为控件ID
其它浏览器下则不能这样写。原因是其它浏览器下 , 可以使用与 HTML 对象 ID 相同的变量名, IE 下则不能。
【兼容办法】: 使用 document.getElementById(idName) 等通用方法先获取对象,再操行其它操作。如 :
document.getElementById(objid).value = “123”;
//
objid为控件ID
注: 最好不要取 HTML 对象 ID 相同的变量名 , 以减少错误 ; 在声明变量时 , 一律加上 var, 以避免歧义。
9.select 元素的 add 方法
【问题描述】: 在 IE , Safari , Chrome 下, select 控件添加项时使用如下的方法:
document.getElementById(“select1”).add(
new
Options(“aa”,”aa”));
但在 FireFox 下这样操作会报错。
【兼容办法】: 统一使用兼容方法,加 options 属性,如下:
document.getElementById(“select1”).options.add(
new
Options(“aa”,”aa”));
10.html 元素的自定义属性
【问题描述】: IE 下元素属性访问方法如 document.getElementById(id). 属性名,而且对于自定义属性和非自定义属性均有效。但在其它浏览器下该方法只适应于元素的公共属性,自定义属性则取不到。
【兼容办法】: 用 jQuery 的方法来取,如 $(“#id”).attr(“ 属性 ”) 或用 document.getElementById(id).getAttribute(“ 属性 ”), 两种方法都可以适用所有浏览器。
11.html 元素 innerText 属性
【问题描述】: 取元素文本的属性 innerText 在 IE 中能正常工作,但此属性不是 DHTML 标准,其它浏览器不支持,其它浏览器中使用 textContent 属性获取。
【兼容办法】:
(1) 通用方法是用 jQuery 方法 $(“#id”).text() ,如:
//
document.getElementById(id).innerText;
$(“#id”).text();
(2) 取值前判断浏览器,根据具体情况取值,如:
var
obj =
document.getElementById(id);
var
str = (obj.innerText)?obj.innerText:obj.textContent;
(3) 也可以通过原型扩展方法来为元素添加 innerText ,扩展方法如下:
if
(
typeof
(HTMLElement)!="undefined" && !
window.opera)
{
var
pro =
window.HTMLElement.prototype;
pro.__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;
});
pro.__defineSetter__(
"innerText",
function
(sText){
this
.textContent=
sText;
});
}
12.html 元素 innerHTML 、 outerHTML 属性
【问题描述】: innerHTML 是所有浏览器都支持的属性。 outerHTML 属性不是 DHTML 标准, IE 外的其它浏览器不支持。
【兼容办法】: 在非 IE 浏览器下必须使用扩展方法才能获取,扩展方法如下:
if
(
typeof
(HTMLElement)!="undefined" && !
window.opera)
{
var
pro =
window.HTMLElement.prototype;
pro.__defineGetter__(
"outerHTML",
function
(){
var
str = "<" +
this
.tagName;
var
a =
this
.attributes;
for
(
var
i = 0, len = a.length; i < len; i++
)
{
if
(a[i].specified)
{
str
+= " " + a[i].name + '="' + a[i].value + '"'
;
}
}
if
(!
this
.canHaveChildren)
{
return
str + " />"
;
}
return
str + ">" +
this
.innerHTML + "</" +
this
.tagName + ">"
;
});
pro.__defineSetter__(
"outerHTML",
function
(s){
var
r =
this
.ownerDocument.createRange();
r.setStartBefore(
this
);
var
df =
r.createContextualFragment(s);
this
.parentNode.replaceChild(df,
this
);
return
s;
});
}
13.html 元素 parentElement 属性
【问题描述】: parentElement 是取元素父结点的属性,此属性只有 IE 支持,其它浏览器均不支持。
【兼容办法】: 用 parentNode 属性来获取父结点,如:
//
document.getElementById(id).parentElement;
document.getElementById(id).parentNode;
14. 集合类对象问题
【问题描述】: IE 下对于集合类对象,如 forms,frames 等 , 可以使用 () 或 [] 获取集合类对象, Safari , Chrome 也都支持,如
document.forms(“formid”) 或 document.forms[“formid”]。 但 Firefox 下 , 只能使用 [] 获取集合类对象。
【兼容办法】: 统一使用 [] 获取集合类对象,如:
document.forms[0
];
document.forms[“formid”];
【注】: 所有以数组方式存储的对象都在访问子成员时,都必须以 [] 方式索引得到,如常见的 XML 文档遍历,也需要改,如下:
//
xmldoc.documentElement.childNodes(1)
xmldoc.documentElement.childNodes[
1]
15.frame 操作
【问题描述】: 在 IE、 Safari 、 Chrome 下,用 window 对象访问 frame 对象时,可以用 id 和 name 属性来获取,如
window.frameId;
window.frameName;
但在 firefox 下,必须使用 frame 对象的 name 属性才能获取到。
【兼容办法】:
(1) 访问 frame 对象: 统一使用 window.document.getElementById(frameId) 来访问这个 frame 对象。
(2) 切换 frame 内容: 统一使用 window.document.getElementById(testFrame).src=xxx.htm 切换。
如果需要将 frame 中的参数传回父窗口,可以在 frame 中使用 parent 来访问父窗口。例如: parent.document.form1.filename.value=Aqing;
(3)iframe 页中的对象 : $("#frameid").contents().find("#html 控件 id")
(4)iframe 页中的 iframe: $("#frameid").contents().find("#frameid1").contents();
(5)iframe 中的方法或变量: $("#frameid")[0] .contentWindow.SaveFile("false", strRet, a);
16.insertAdjacentHTML 和 insertAdjacentText
【问题描述】: insertAdjacentHTML 方法是比 innerHTML 、 outerHTML 属性更灵活的插入 HTML 代码的方法。它可以实现在一个 DOM 元素的前面、后面、第一个子元素前面、最后一个子元素后面四个位置,插入指定的 HTML 代码。不是 W3C 标准的 DOM 方法, W3C 近期在 HTML5 草案中扩展了这个方法。
insertAdjacentText 是比 innerText 、 outerText 属性更灵活的插入文本的方法。它可以实现在一个 DOM 元素的前面、后面、第一个子元素前面、最后一个子元素后面四个位置,插入指定的文本。不是 W3C 标准的 DOM 方法,至今为止 W3C 的 HTML5 还未涉及此方法。
insertAdjacentHTML 和 insertAdjacentText 可以 IE 、 Safari 、 Chrome 上执行,只有 FireFox 不支持,
【兼容办法】: 可用以下方法进行扩展:
if
(
typeof
(HTMLElement) != "undefined"
)
{
HTMLElement.prototype.insertAdjacentElement
=
function
(where, parsedNode)
{
switch
(where)
{
case
"beforeBegin"
:
this
.parentNode.insertBefore(parsedNode,
this
);
break
;
case
"afterBegin"
:
this
.insertBefore(parsedNode,
this
.firstChild);
break
;
case
"beforeEnd"
:
this
.appendChild(parsedNode);
break
;
case
"afterEnd"
:
if
(
this
.nextSibling)
this
.parentNode.insertBefore(parsedNode,
this
.nextSibling);
else
this
.parentNode.appendChild(parsedNode);
break
;
}
}
HTMLElement.prototype.insertAdjacentHTML
=
function
(where, htmlStr)
{
var
r =
this
.ownerDocument.createRange();
r.setStartBefore(
this
);
var
parsedHTML =
r.createContextualFragment(htmlStr);
this
.insertAdjacentElement(where, parsedHTML);
}
HTMLElement.prototype.insertAdjacentText
=
function
(where, txtStr)
{
var
parsedText =
document.createTextNode(txtStr);
this
.insertAdjacentElement(where, parsedText);
}
}
17.Html 元素的 children 属性
【问题描述】: children 是取 HTML 元素子结点的属性,只有 IE 下支持,其它浏览器下用 childNodes 。
【兼容办法】: 统一改为用 childNodes 属性取子结点。或用以下方法扩展 HTML 元素的属性:
if
(
typeof
(HTMLElement) != "undefined"
)
{
HTMLElement.prototype.__defineGetter__(
"children",
function
(){
var
returnValue =
new
Object();
var
number = 0
;
for
(
var
i=0; i<
this
.childNodes.length; i++
)
{
if
(
this
.childNodes[i].nodeType == 1
)
{
returnValue[number]
=
this
.childNodes[i];
number
++
;
}
}
returnValue.length
=
number;
return
returnValue;
})
}
18.insertRow \ inserCell
【问题描述】: insertRow 和 insertCell 是在表格中插入行或插入列的方法,在 IE 中使用方法如下
var
nowTB = document.getElementById("tb1"
);
nowTR
=
nowTB.insertRow();
nowTD
= nowTR.insertCell();
Safari 、 Chrome 下也可以正常执行,但插入行的位置不一样 IE 下默认在表尾插入行, Safari 、 Chrome 默认在表头插入行;但在 FireFox 下调用会报错。
【兼容办法】: 下面的方法可以在所有浏览器上调用,而且插入行的位置都是表尾,不同之处就是执行前传递一个默认值。推荐使用。
var
nowTB = document.getElementById("tb1"
);
nowTR
= nowTB.insertRow(-1
);
nowTD
= nowTR.insertCell(-1);
19.document.createElement
【问题描述】: IE 有 3 种方式都可以创建一个元素 :
1 document.createElement("<input type=text>"
)
2 document.createElement("<input>"
)
3 document.createElement("input")
Safari 、 FireFox 、 Chrome 只支持一种方式 :
document.createElement("input"
);
document.setAttribute(name,value);
【兼容办法】: 统一使用所有浏览器都支持的方法,如下:
document.createElement("input"
);
document.setAttribute(name,value);
20. 浏览器处理 childNodes 的异同
【问题描述】: 如下 HTML 代码:
<ul id="main">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<input type=button value="click me!" onclick=
"alert(document.getElementById('main').childNodes.length)">
分别用 IE 和其它浏览器运行, IE 的结果是 3 ,而其它则是 7 。
IE 是将一个完整标签作为一个节点,而 Safari 、 FireFox 、 Chrome 除了上述的的情况外,也把一个标签的结束符 “>” 到下一个标签的起始符 “<” 之间的内容(除注释外,包括任何的文字、空格、回车、制表符)也算是一个节点了,而且这种节点也有它们自己独特的属性和值 nodeName="#text" 。
【兼容办法】: 在实际运用中, Safari 、 FireFox 、 Chrome 在遍历子节点时,在 for 循环里加上
if(childNode.nodeName=="#text") continue; 或者 nodeType == 1 这样,便跳过不需要的操作,使程序运行的更有效率。也可以用 node.getElementsByTagName() 回避。
21.document.getElementsByName
【问题描述】: 在元素只有 name 属性,没有 id 属性的情况下,在 IE 中获取不到 DIV 元素,其它浏览器可以获取。当前 name 和 id 属性都存在时,所有浏览器都可以获取到 DIV 元素。
【兼容办法】: 尽量用 ID 来获取。
22.tr 操作
【问题描述】: IE 下 table 中无论是用 innerHTML 还是 appendChild 插入 <tr> 都没有效果,因为在 IE 浏览器下 tr 是只读的。而其他浏览器下可以这样操作。
【兼容办法】: 将 <tr> 加到 table 的 <tbody> 元素中,如下面所示:
var
row = document.createElement("tr"
);
var
cell = document.createElement("td"
);
var
cell_text = document.createTextNode("插入的内容"
);
cell.appendChild(cell_text);
row.appendChild(cell);
document.getElementsByTagName(
"tbody")[0].appendChild(row);
23. 移除节点 removeNode()
【问题描述】: appendNode 在 IE 和其它浏览器下都能正常使用,但是 removeNode 只能在 IE 下用。 removeNode 方法的功能是删除一个节点,语法为 node.removeNode ( false )或者 node.removeNode ( true ),返回值是被删除的节点。
removeNode ( false )表示仅仅删除指定节点,然后这个节点的原孩子节点提升为原双亲节点的孩子节点。
removeNode ( true )表示删除指定节点及其所有下属节点。被删除的节点成为了孤立节点,不再具有有孩子节点和双亲节点。
【兼容办法】: 兼容 IE 和其它浏览器的方法是 removeChild ,先回到父节点,在从父节点上移除要移除的节点。
//
为了在IE和其它浏览器下都能正常使用,取上一层的父结点,然后remove。
node.parentNode.removeChild(node);
24.expression
【问题描述】: IE 下样式支持计算表达式 expression ,但其它浏览器不支持,而且 IE 以后高版本也可能不再支持这种样式,所以不允许使用。下面是通常使用的情况:
<div id=
”content”
style
=’height:expression(document.body.offsetHeight-80)”></div>
【兼容办法】: 去掉样式设置,将其写到函数中,分别在页面加载完毕和页面尺寸发生变化时执行。如下:
$(
function
(){
$(“#content”).height($(document.body).height()
-80
);
})
$(window).resize(
function
(){
$(“#content”).height($(document.body).height()
-80
);
});
25.Cursor
【问题描述】: Cursor 的 hand 属性只有 IE 支持,其它浏览器没有效果,如:
<div style=”cursor:hand”></div>
【兼容办法】: 统一用 pointer 值,如:
<div style=”cursor: pointer”></div>
26.CSS 透明问题
【问题描述】: IE 支持但其它浏览器不支持的透明样式如下:
<div style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=20);width:200px;height:200px;background-color:Blue">ddddd</div>
其它浏览器支持但 IE 不支持的透明样式如下:
<div style="opacity:0.2;width:200px;height:200px;background-color:Blue">ddddd</div>
【兼容办法】: 利用 ”!important” 来设置元素的样式。 Safari , FireFox , Chrome 对于 ”!important” 会自动优先解析,然而 IE 则会忽略。如下
<div style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=20);width:200px;height:200px;background-color:Blue;!important; opacity:0.2">ddddd</div>
27.pixelHeight \ pixelWidth
【问题描述】: pixelHeight \ pixelWidth 是元素的高度和宽度样式,通常获取方法是:
obj.style.pixelWidth;
obj.style.pixelHeight;
IE , Safari , Chrome 都支持此样式,返回的值是整数, FireFox 不支持
【兼容办法】: 所有浏览器都支持 obj.style.height ,但返回的值是带单位的,如“ 100px ”。可以用如下方法来获取:
parseInt(obj.style.height)
28.noWrap
【问题描述】: nowrap 属性是被废弃的属性。
【兼容办法】: 使用 CSS 规则 white-space:nowrap 代替这个属性。
29.CSS 的 float 属性
【问题描述】: Javascript 访问一个给定 CSS 值的最基本句法是: object.style.property ,但部分 CSS 属性跟 Javascript 中的保留字命名相同,如 "float" , "for" , "class" 等,不同浏览器写法不同。
在 IE 中这样写:
document.getElementById("header").style.styleFloat = "left";
在其它浏览器中这样写:
document.getElementById("header").style.cssFloat = "left";
【兼容办法】: 兼容方法是在写之前加一个判断,判断浏览器是否是 IE :
if
(jQuery.browser.msie){
document.getElementById(
"header").style.styleFloat = "left"
;
}
else
{
document.getElementById(
"header").style.cssFloat = "left"
;
}
30. 访问 label 标签中的 for
【问题描述】: for 属性规定 label 与哪个表单元素绑定。 在 IE 中这样写:
var
myObject = document.getElementById("myLabel"
);
var
myAttribute = myObject.getAttribute("htmlFor");
在 Firefox 中这样写:
var
myObject = document.getElementById("myLabel"
);
var
myAttribute = myObject.getAttribute("for");
【兼容办法】: 判断浏览器是否是 IE :
var
myObject = document.getElementById("myLabel"
);
if
(jQuery.browser.msie){
var
myAttribute = myObject.getAttribute("htmlFor"
);
}
else
{
var
myAttribute = myObject.getAttribute("for"
);
}
31. 访问和设置 class 属性
【问题描述】: 同样由于 class 是 Javascript 保留字的原因,这两种浏览器使用不同的 JavaScript 方法来获取这个属性。
IE8.0 之前的所有 IE 版本的写法:
var
myObject = document.getElementById("header"
);
var
myAttribute = myObject.getAttribute("className");
适用于 IE8.0 以及 firefox 的写法:
var
myObject = document.getElementById("header"
);
var
myAttribute = myObject.getAttribute("class");
另外,在使用 setAttribute() 设置 Class 属性的时候,两种浏览器也存在同样的差异。
setAttribute("className",value); 这种写法适用于 IE8.0 之前的所有 IE 版本,注意: IE8.0 也不支持 "className" 属性了。 setAttribute("class",value); 适用于 IE8.0 以及 firefox 。
【兼容办法】:
1.两种都写上:
1
//
设置header的class为classValue
2
var
myObject = document.getElementById("header"
);
3
4
myObject.setAttribute("class","classValue"
);
5
6
myObject.setAttribute("className","classValue");
2. IE 和 FF 都支持 object.className ,所以可以这样写:
var
myObject = document.getElementById("header"
);
myObject.className
="classValue";
//
设置header的class为classValue
3.先判断浏览器类型,再根据浏览器类型采用对应的写法。
32. 对象宽高赋值问题
【问题描述】: 非 IE 浏览器中中类似 obj.style.height = imgObj.height 的语句无效 , 必须加上 ’px’ 。
【兼容办法】: 给元素高度宽度附值是,统一都加上 ’px’ ,如:
obj.style.height = imgObj.height + ‘px’;
33.鼠标位置
【问题描述】: IE 下, even 对象有 x 、 y 属性,但是没有 pageX 、 pageY 属性; Firefox 下, even 对象有 pageX 、 pageY 属性,但是没有 x 、 y 属性; Safari 、 Chrome中x 、 y 属性和 pageX 、 pageY 都有。
【兼容办法】: 使用 mX = event.x ? event.x : event.pageX; 来代替。复杂点还要考虑绝对位置。
function
getAbsPoint(e){
var
x = e.offsetLeft, y =
e.offsetTop;
while
(e =
e.offsetParent) {
x
+=
e.offsetLeft;
y
+=
e.offsetTop;
}
alert(
"x:" + x + "," + "y:" +
y);
}
34.event.srcElement
【问题描述】: IE 下, event 对象有 srcElement 属性,但是没有 target 属性;其它浏览器下, even 对象有 target 属性,但是没有 srcElement 属性。
【兼容办法】:
var
obj = event.srcElement?event.srcElement:event.target;
35. 关于 <input type="file">
(1) 在 safari 浏览器下的此控件没有文本框,只有一个“选取文件”的按钮,所有也没有 onblur 事件,如果在 <input type="file" onblur="alert(0);"> 中用到了需要做特殊处理。
(2) 在 FF 浏览器下用 <input type="file" name="file"> 上传文件后取 file.value 时只能去掉文件名而没有文件路径,不能实现预览的效果,可以用 document.getElementById("pic").files[0].getAsDataURL(); 取到 加密后的路径,此路径只有在 FF 下才可以解析。
(3) 在 safari 浏览器下用 <input type="file" name="file"> 上传文件后取 file.value 时只能去掉文件名而没有文件路径,不能实现预览的效果。建议使用上传后的路径预览。
36.jquery对象是否为空
jquery 对象是否为空判断,用 length 判断一下
$("#hidTitle").length>0

