﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-eric-1001c-文章分类-JavaScript</title><link>http://www.blogjava.net/Ericzhang5231/category/42210.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 Oct 2009 20:04:25 GMT</lastBuildDate><pubDate>Thu, 29 Oct 2009 20:04:25 GMT</pubDate><ttl>60</ttl><item><title>浏览器网页兼容性问题--DOM基础篇</title><link>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 17 Oct 2009 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/298691.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/298691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/298691.html</trackback:ping><description><![CDATA[W3C针对XHTML以及HTML开发一种DOM，这个DOM是基于HTMLElement和HTMLDocument实现的。除了少数元素只包含HTMLElement属性和方法外，每个HTML元素都通过特定的HTMLElement类型表示。然而并不是所以浏览器对DOM都支持的，下面列出了一些经常会遇到的不兼容的DOM使用问题。<br />
<br />
1.childNodes <br />
不同浏览器使用childNodes在处理Text节点存在一些差异。Mozilla认为元素之间的空白是Text节点；而IE，会忽略这些空白。可以通过判断childNodes[x].nodeValue == "#text"，childNodes[x].nodeType == 1解决这个问题；或者使用children属性，children属性是一个数组，可以通过索引获取子节点；<br />
<br />
2.document<br />
IE使用document.all，而使用dom标准的浏览可以通过document.getElementsByTagName("*") ；<br />
<br />
3.Id&amp;getElementById<br />
在IE中可以把Id当作元素使用，但在其他浏览器不支持。因此建议使用getElementById，getElementById在IE6中使用，如果元素Name等于Id，也会一同返回；<br />
<br />
4.集合数组<br />
<span style="font-size: 12pt; font-family: 宋体;">IE中在使用集合类对象时候，访问可以通过</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">()</span></span><span style="font-size: 12pt; font-family: 宋体;">与</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">[]</span></span>。建议同一使用[]dom标准访问；<br />
<br />
5.body对象<br />
<span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">IE</span></span><span style="font-size: 12pt; font-family: 宋体;">中</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">body</span></span><span style="font-size: 12pt; font-family: 宋体;">对象要在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">&lt;body&gt;</span></span><span style="font-size: 12pt; font-family: 宋体;">标签完全读入才会存在，而在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">FireFox</span></span><span style="font-size: 12pt; font-family: 宋体;">中一开始就存在</span>；<br />
<br />
6.Type属性<br />
<span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">IE</span></span><span style="font-size: 12pt; font-family: 宋体;">中</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">input</span></span><span style="font-size: 12pt; font-family: 宋体;">标签的</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">type</span></span><span style="font-size: 12pt; font-family: 宋体;">属性是只读的，但在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">FireFox</span></span><span style="font-size: 12pt; font-family: 宋体;">中是可读写的；<br />
<br />
7.removeNodes/removeChild<br />
</span><span style="font-size: 12pt; font-family: 宋体;">在FireFox节点中没有removeNode方法，必须使用如下方法 node.parentNode.removeChild(node)</span>；<br />
<br />
8.ParentNode<br />
<span style="font-size: 12pt; font-family: 宋体;">IE</span><span style="font-size: 12pt; font-family: 宋体;">与FireFox的访问父元素有区别，IE为Obj.ParentElement属性;FireFox为Obj.ParentNode属性</span><span style="font-size: 12pt; font-family: 宋体;">解决办法：因为FireFox与IE都支持DOM，因此统一用ParentNode属性</span>；<br />
<br />
9.set/getAttribute<br />
IE的setAttribute不能设置对象属性、事件属性和style相关的属性，对于自定义的可以设置；要注意在FF中，通过自定义设置的属性和通过.方法设置的属性不是同一个属性；<br />
<br />
10.自定义属性<br />
<span style="font-size: 12pt; font-family: 宋体;">在FF中不支持像IE那样直接获取</span>，建议统一用getAttribute方法；<br />
<br />
11.class/className<br />
<span style="font-size: 12pt; font-family: 宋体;">IE</span><span style="font-size: 12pt; font-family: 宋体;">中用&#8221;classname&#8221;做为属性名来设置或取得css class，FF和其它浏览器用&#8221;class&#8221;做为属性名来设置或取得，Dom标准的node object具有className属性<br />
<br />
12.Range<br />
在IE中有document.selection.createRange(),document.body[button|input].createTextRange()；而在FF中可以通过document.getSelection()[.getRangeAt(0)];而对Range的操作中，除了IE和DOM标准的各种move外，FF中的node element还有selectionStart,selectionEnd只读属性<br />
</span><br />
<br />
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/298691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2009-10-17 16:52 <a href="http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浏览器网页兼容性问题--DOM EVENT篇</title><link>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 17 Oct 2009 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/298674.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/298674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/298674.html</trackback:ping><description><![CDATA[DOM的不兼容也说明了DOM高级特性Event的不兼容，因为我们在开发Web的时候，和用户的大量交互都是通过event来实现的，所以单独把event抽出来，把其不兼容性列出：<br />
<br />
<br />
Event的兼容性<br />
1.事件流的区别<br />
IE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 冒泡事件流&nbsp;&nbsp; 在IE6增加&lt;html&gt;等元素对事件流的响应<br />
Mozillal&nbsp;&nbsp; 冒泡事件流 &nbsp; 在IE6的基础上增加window对象对事件流的响应<br />
Netscape&nbsp;&nbsp; 捕获事件流&nbsp;&nbsp; 同Mozillal <br />
DOM标准&nbsp;&nbsp;&nbsp; 冒泡+捕获 &nbsp;&nbsp; 增加文本节点对事件流的响应；同时冒泡+捕获使得事件目标连续接收2次事件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （这可能是DOM的事件增加函数有第3个参数的原因）<br />
2.事件处理函数<br />
IE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attach(eventName, fn)、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; eventName=on+事件名 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; detachEvent(eventName, fn)<br />
DOM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addEventListener(eventName,fn,boolean)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeEventListener(eventName,fn,boolean)&nbsp;&nbsp;&nbsp; eventName=事件名;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean=true:捕获|false:冒泡<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remove只有同事件流才能起效
<br />
3.事件对象<br />
定位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IE：window.event；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.event||arguments[0]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM：arguments[0]（事件处理函数的参数），可以通过caller来防止硬编码获取；<br />
<br />
事件目标&nbsp;&nbsp; IE：event.srcElement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.srcElement||event.target <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM:event.target<br />
<br />
阻止事件&nbsp;&nbsp; IE: event.returnValue = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(isIE){window.event.returnValue = true;}<br />
默认行为&nbsp;&nbsp; DOM: event.preventDefault()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{arguments[0].preventDefault();}
<br />
<br />
3.1 鼠标事件[对象]<br />
鼠标位置&nbsp;&nbsp;&nbsp; IE：event.x,event.y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.x?event.x:event.PageX <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM:event.pageX, event.pageY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.y?event.y:event.PageY<br />
进入事件1&nbsp;&nbsp; IE ：onmouseenter, onmouseleave&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它们的区别在于处理嵌套dom object出入上，只有<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DOM：mouseover,mouseout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM标准才进行处理，enter/leave会忽略，也就是说 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(fromElement!=toElement) &amp;&amp; (this.contains(toElement)&nbsp; 触发onmouseover<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(fromElement!=toElement) &amp;&amp; (this.contains(fromElement) ) 触发onmouseout<br />
进入事件2&nbsp;&nbsp; IE：event.fromElement|toElement，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.srcElement<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM： target，relatedTarget&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于mouseover：fromElement=relatedElement,toElement = srcElement=target;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于mouseout : toElement=relatedElement,fromElement = srcElement=target; <br />
<br />
3.2 键盘事件<br />
字符代码&nbsp;&nbsp;&nbsp; IE：event.keyCode；DOM: 数值代码-event.keyCode。event.isChar?event.charCode:event.keyCode ，在FF中，keyCode只能获得功能键的数值代码，其他的需通过which和charCode，在Opera中，则只能通过which<br />
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/298674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2009-10-17 12:56 <a href="http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>