﻿<?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-liuzheng-文章分类-JavaScript</title><link>http://www.blogjava.net/liuzheng/category/24699.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 18 Jan 2008 19:46:15 GMT</lastBuildDate><pubDate>Fri, 18 Jan 2008 19:46:15 GMT</pubDate><ttl>60</ttl><item><title>javascript中函数的深入理解</title><link>http://www.blogjava.net/liuzheng/articles/175843.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 17 Jan 2008 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/175843.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/175843.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/175843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/175843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/175843.html</trackback:ping><description><![CDATA[unction funcName(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //函数体<br />
}<br />
//等价于<br />
var funcName=function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //函数体<br />
}
<p>　　但前面一种方式创建的是有名函数，而后面是创建了一个无名函数，只是让一个变量指向了这个无名函数。在使用上仅有一点区别，就是：对于有名函数，它可以出现在调用之后再定义；而对于无名函数，它必须是在调用之前就已经定义。例如：<br />
script language="JavaScript" type="text/javascript"＞<br />
＜!--<br />
func();<br />
var func=function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(1)<br />
}<br />
//--＞<br />
＜/script＞ </p>
<p>　　这段语句将产生func未定义的错误，而：</p>
<p><br />
＜script language="JavaScript" type="text/javascript"＞<br />
＜!--<br />
func();<br />
function func(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(1)<br />
}<br />
//--＞<br />
＜/script＞</p>
<p>　　则能够正确执行，下面的语句也能正确执行：</p>
<p><br />
＜script language="JavaScript" type="text/javascript"＞<br />
＜!--<br />
func();<br />
var someFunc=function func(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(1)<br />
}<br />
//--＞<br />
＜/script＞</p>
认识函数对象（Function Object）
<p>　　可以用function关键字定义一个函数，并为每个函数指定一个函数名，通过函数名来进行调用。在JavaScript解释执行时，函数都是被维护为一个对象，这就是要介绍的函数对象（Function Object）。</p>
<p>　　函数对象与其他用户所定义的对象有着本质的区别，这一类对象被称之为内部对象，例如日期对象（Date）、数组对象（Array）、字符串对象
（String）都属于内部对象。这些内置对象的构造器是由JavaScript本身所定义的：通过执行new
Array()这样的语句返回一个对象，JavaScript内部有一套机制来初始化返回的对象，而不是由用户来指定对象的构造方式。</p>
<br />
<br />
JavaScript为函数对象定义了两个方法：apply和call，它们的作用都是将函数绑定到另外一个对象上去运行，两者仅在定义参数的方式有所区别：
<p>Function.prototype.apply(thisArg,argArray);<br />
Function.prototype.call(thisArg[,arg1[,arg2&#8230;]]);</p>
在javascript的继承中可以使用其方法<br />
<br />
<br />
例如：<br />
function ClassA(sColor){<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.color=sColor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.sayColor=function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(this.color);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
function ClassB(sColor,sName){<br />
&nbsp;&nbsp;&nbsp;&nbsp;ClassA.call(this,sColor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;或者<br />
&nbsp;&nbsp;&nbsp;&nbsp;ClassA.apply(this, new Array(sColor));<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.name=sName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.sayName=function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/175843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2008-01-17 10:05 <a href="http://www.blogjava.net/liuzheng/articles/175843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在IE中使用Javasript对xml的解析</title><link>http://www.blogjava.net/liuzheng/articles/161219.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Sat, 17 Nov 2007 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/161219.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/161219.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/161219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/161219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/161219.html</trackback:ping><description><![CDATA[以下是万用的生成处理xml的<br />
<pre>ActiveXObject<br />
function loadXMLDoc(dname)<br />
{<br />
var xmlDoc;<br />
// code for IE<br />
if (window.ActiveXObject)<br />
{<br />
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");<br />
}<br />
// code for Mozilla, Firefox, Opera, etc.<br />
else if (document.implementation &amp;&amp; document.implementation.createDocument)<br />
{<br />
xmlDoc=document.implementation.createDocument("","",null);<br />
}<br />
else<br />
{<br />
alert('Your browser cannot handle this script');<br />
}<br />
xmlDoc.async=false;<br />
xmlDoc.load(dname);<br />
return(xmlDoc);<br />
}<br />
<br />
<br />
然后就可以使用xmlDoc了<br />
<br />
例如：<br />
<br />
xmlDoc=loadXMLDoc("books.xml");<br />
var x=xmlDoc.getElementsByTagName('book');<br />
var newel<br />
for (i=0;i&lt;x.length;i++)<br />
{<br />
newel=xmlDoc.createElement('edition');<br />
x[i].appendChild(newel);<br />
}<br />
<br />
进行添加删除节点属性等<br />
</pre>
<img src ="http://www.blogjava.net/liuzheng/aggbug/161219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-17 14:43 <a href="http://www.blogjava.net/liuzheng/articles/161219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype对ajax的支持</title><link>http://www.blogjava.net/liuzheng/articles/160942.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Fri, 16 Nov 2007 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/160942.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/160942.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/160942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/160942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/160942.html</trackback:ping><description><![CDATA[<h2 style="clear: both;"><tt>Ajax</tt> 对象</h2>
<p>上面提到的共通方法非常好，但是面对它吧，它们不是最高级的那类东西。它们是吗？你很可能自己编写了这些甚至在你的脚本里面有类似功能的方法。但是这些方法只是冰山一角。</p>
<p>我很肯定你对prototype.js感兴趣的原因很可能是由于它的AJAX能力。所以让我们解释当你需要完成AJAX逻辑的时候，这个包如何让它更容易。</p>
<p><tt>Ajax</tt> 对象是一个预定义对象，由这个包创建，为了封装和简化编写<a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29" target="_top">AJAX</a>
功能涉及的狡猾的代码。 这个对象包含一系列的封装AJAX逻辑的类。我们来看看它们的一些。</p>
<div>
<div>
<div>
<div>
<h3>1.4.1.&nbsp;使用 <tt>Ajax.Request</tt>类</h3>
</div>
</div>
</div>
<p>如果你不使用任何的帮助程序包，你很可能编写了整个大量的代码来创建<tt>XMLHttpRequest</tt>对象并且异步的跟踪它的进程，
然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。</p>
<p>为了支持 AJAX 功能。这个包定义了 <tt>Ajax.Request </tt>类。</p>
<p>假如你有一个应用程序可以通过url
<em>http://yoursever/app/get_sales?empID=1234&amp;year=1998</em>与服务器通信。它返回下面这样的XML
响应。</p>
<pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />
&lt;ajax-response&gt;<br />
&lt;response type="object" id="productDetails"&gt;<br />
&lt;monthly-sales&gt;<br />
&lt;employee-sales&gt;<br />
&lt;employee-id&gt;1234&lt;/employee-id&gt;<br />
&lt;year-month&gt;1998-01&lt;/year-month&gt;<br />
&lt;sales&gt;$8,115.36&lt;/sales&gt;<br />
&lt;/employee-sales&gt;<br />
&lt;employee-sales&gt;<br />
&lt;employee-id&gt;1234&lt;/employee-id&gt;<br />
&lt;year-month&gt;1998-02&lt;/year-month&gt;<br />
&lt;sales&gt;$11,147.51&lt;/sales&gt;<br />
&lt;/employee-sales&gt;<br />
&lt;/monthly-sales&gt;<br />
&lt;/response&gt;<br />
&lt;/ajax-response&gt;</pre>
<p>用
<tt>Ajax.Request</tt>对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。</p>
<pre>&lt;script&gt;<br />
function searchSales()<br />
{<br />
var empID = $F('lstEmployees');<br />
var y = $F('lstYears');<br />
var url = 'http://yoursever/app/get_sales';<br />
var pars = 'empID=' + empID + '&amp;year=' + y;<strong><br />
var myAjax = new Ajax.Request(<br />
url,<br />
{method: 'get', parameters: pars, onComplete: showResponse}<br />
);</strong><br />
<br />
}<br />
<br />
function showResponse(originalRequest)<br />
{<br />
//put returned XML in the textarea<br />
$('result').value = originalRequest.responseText;<br />
}<br />
&lt;/script&gt;<br />
<br />
&lt;select id="lstEmployees" size="10" onchange="searchSales()"&gt;<br />
&lt;option value="5"&gt;Buchanan, Steven&lt;/option&gt;<br />
&lt;option value="8"&gt;Callahan, Laura&lt;/option&gt;<br />
&lt;option value="1"&gt;Davolio, Nancy&lt;/option&gt;<br />
&lt;/select&gt;<br />
&lt;select id="lstYears" size="3" onchange="searchSales()"&gt;<br />
&lt;option selected="selected" value="1996"&gt;1996&lt;/option&gt;<br />
&lt;option value="1997"&gt;1997&lt;/option&gt;<br />
&lt;option value="1998"&gt;1998&lt;/option&gt;<br />
&lt;/select&gt;<br />
&lt;br&gt;&lt;textarea id=result cols=60 rows=10 &gt;&lt;/textarea&gt;</pre>
<p>你看到传入 <tt>Ajax.Request</tt>构造方法的第二个对象了吗？
参数<tt>{method: 'get', parameters: pars, onComplete:
showResponse}</tt> 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为
<tt>method</tt> 值为 <tt>'get'的属性，</tt>另一个属性名为
<tt>parameters</tt>
包含HTTP请求的查询字符串，和一个<tt>onComplete</tt>
属性/方法包含函数<tt>showResponse</tt>。</p>
<p>还有一些其它的属性可以在这个对象里面定义和设置，如
<tt>asynchronous</tt>，可以为<tt>true</tt> 或
<tt>false</tt> 来决定AJAX对服务器的调用是否是异步的（默认值是
<tt>true</tt>）。</p>
<p>这个参数定义AJAX调用的选项。在我们的例子中，在第一个参数通过HTTP GET命令请求那个url，传入了变量
<tt>pars</tt>包含的查询字符串， <tt>Ajax.Request
</tt>对象在它完成接收响应的时候将调用<tt>showResponse</tt> 方法。</p>
<p>也许你知道，
<tt>XMLHttpRequest</tt>在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段：<em>Loading</em>,
<em>Loaded</em>, <em>Interactive</em>, 或
<em>Complete</em>。你可以使 <tt>Ajax.Request</tt>
对象在任何阶段调用自定义方法 ，<em>Complete</em>
是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 <tt>onXXXXX</tt>
属性/方法中提供自定义的方法对象。 就像我们例子中的 <tt>onComplete</tt>
。你传入的方法将会被用一个参数调用，这个参数是 <tt>XMLHttpRequest</tt>
对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的
<tt>status</tt> 属性。</p>
<p>还有另外两个有用的选项用来处理结果。我们可以在<tt>onSuccess</tt>
选项处传入一个方法，当AJAX无误的执行完后调用，
相反的，也可以在<tt>onFailure</tt>选项处传入一个方法，当服务器端出现错误时调用。正如<tt>onXXXXX</tt>
选项传入的方法一样，这两个在被调用的时候也传入一个带有AJAX请求的<tt>XMLHttpRequest对象。</tt></p>
<p>我们的例子没有用任何有趣的方式处理这个 XML响应，
我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息，然后更新页面中的某些元素，
或者甚至可能做某些XSLT转换而在页面中产生一些HTML。</p>
<p>更完全的解释，请参照 <a href="https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html#ajax_request_reference" title="2.14.&nbsp;Ajax.Request 类">Ajax.Request
参考</a> 和 <a href="https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html#options_reference" title="2.15.&nbsp;options 参数对象">Ajax选项参考</a>。</p>
</div>
<div>
<div>
<div>
<div>
<h3>1.4.2.&nbsp;使用 <tt>Ajax.Updater</tt> 类</h3>
</div>
</div>
</div>
<p>如果你的服务器的另一端返回的信息已经是HTML了，那么使用这个程序包中
<tt>Ajax.Updater</tt>
类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了，例子比我写说明的更清楚。</p>
<pre>&lt;script&gt;<br />
function getHTML()<br />
{<br />
var url = 'http://yourserver/app/getSomeHTML';<br />
var pars = 'someParameter=ABC';<br />
<br />
<strong>var myAjax = new Ajax.Updater('placeholder', url, {method: 'get', parameters: pars});</strong><br />
<br />
}<br />
&lt;/script&gt;<br />
<br />
&lt;input type=button value=GetHtml onclick="getHTML()"&gt;<br />
&lt;div id="placeholder"&gt;&lt;/div&gt;</pre>
<p>你可以看到，这段代码比前面的例子更加简洁，不包括 <tt>onComplete</tt>
方法，但是在构造方法中传入了一个元素id。 我们来稍稍修改一下代码来描述如何在客户端处理服务器段错误成为可能。</p>
<p>我们将加入更多的选项， 指定处理错误的一个方法。这个是用 <tt>onFailure</tt>
选项来完成的。</p>
<p>我们也指定了一个 <tt>placeholder</tt>
只有在成功请求之后才会被填充。为了完成这个目的我们修改了第一个参数从一个简单的元素id到一个带有两个属性的对象，
<tt>success</tt> (一切OK的时候被用到) 和 <tt>failure</tt>
(有地方出问题的时候被用到) 在下面的例子中没有用到<tt>failure</tt>属性，而仅仅在
<tt>onFailure</tt> 处使用了 <tt>reportError</tt>
方法。</p>
<pre>&lt;script&gt;<br />
function getHTML()<br />
{<br />
var url = 'http://yourserver/app/getSomeHTML';<br />
var pars = 'someParameter=ABC';<strong><br />
var myAjax = new Ajax.Updater(<br />
{success: 'placeholder'},<br />
url,<br />
{method: 'get', parameters: pars, onFailure: reportError});</strong><br />
<br />
}<br />
<br />
function reportError(request)<br />
{<br />
alert('Sorry. There was an error.');<br />
}<br />
&lt;/script&gt;<br />
<br />
&lt;input type=button value=GetHtml onclick="getHTML()"&gt;<br />
&lt;div id="placeholder"&gt;&lt;/div&gt;</pre>
<p>如果你的服务器逻辑是返回JavaScript 代码而不是单纯的 HTML 标记，
<tt>Ajax.Updater</tt>对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript，你只需在最后参数的对象构造方法中简单加入<tt>evalScripts:
true</tt>属性。</p>
<p><br />
</p>
</div>
<img src ="http://www.blogjava.net/liuzheng/aggbug/160942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-16 10:51 <a href="http://www.blogjava.net/liuzheng/articles/160942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于页面两个列表的数据传输的js算法</title><link>http://www.blogjava.net/liuzheng/articles/160329.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 13 Nov 2007 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/160329.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/160329.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/160329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/160329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/160329.html</trackback:ping><description><![CDATA[页面设计如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;select id="availableRoles" size="10" multiple="multiple" style="width: 150px;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;option&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/select&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align="center"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="javascript:secure.addRole()" class="button" style="width: 60px;"&gt;Add &amp;gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="javascript:secure.removeRole()" class="button" style="width: 60px;"&gt;&amp;lt; Remove&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;select id="roles" size="10" multiple="multiple" style="width: 150px;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;option&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/select&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
<br />
对应的js如下（这里的js是使用的prototype的js方法）<br />
<p>Security = Class.create();</p>
<p>Security.prototype =<br />
{</p>
<br />
<br />
addRole: function()<br />
&nbsp;{<br />
&nbsp;&nbsp;var availableRolesList = $("availableRoles");<br />
&nbsp;&nbsp;var rolesList = $("roles");<br />
&nbsp;&nbsp;this.moveOption(availableRolesList, rolesList);<br />
&nbsp;},<br />
&nbsp;<br />
&nbsp;removeRole: function()<br />
&nbsp;{<br />
&nbsp;&nbsp;var availableRolesList = $("availableRoles");<br />
&nbsp;&nbsp;var rolesList = $("roles");<br />
&nbsp;&nbsp;this.moveOption(rolesList, availableRolesList);<br />
&nbsp;},<br />
&nbsp;<br />
&nbsp;moveOption: function(source, target)<br />
&nbsp;{<br />
&nbsp;&nbsp;var lastInsert = null;<br />
&nbsp;&nbsp;for (var i = source.options.length - 1; i &gt;= 0; i--)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;if (source.options[i].selected)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var option = source.removeChild(source.options[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;target.insertBefore(option, lastInsert);<br />
&nbsp;&nbsp;&nbsp;&nbsp;lastInsert = option;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;},<br />
}<br />
<p>var secure = null;</p>
<p>function initSecurity()<br />
{<br />
&nbsp;secure = new Security();<br />
&nbsp;secure.setup();<br />
}</p>
<p>Event.observe(window, "load", initSecurity, false);</p>
<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/160329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-11-13 20:03 <a href="http://www.blogjava.net/liuzheng/articles/160329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript的基本概念</title><link>http://www.blogjava.net/liuzheng/articles/156897.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 30 Oct 2007 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/156897.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/156897.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/156897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/156897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/156897.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
javascript 中 对类型的转化 <br />
<br />
1.转换成字符串 <br />
使用toString()的方法 <br />
2.转换成数字 <br />
使用parseInt和parsefloat的方法<br />
<br />
NaN表示是不是数字（not a number）这种情况发生在类型转化失败时候，并且NaN和自身比较不相等。<br />
isNaN是判断是否是数字 。<br />
<br />
typeof运算需要一个参数，即要检查的参数或变量。<br />
比如t变量是null或引用类型，typeof返回object<br />
<br />
<br />
javascript中的switch语句<br />
<br />
switch（expression）<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;case value: statement<br />
&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case value: statement<br />
&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
}<br />
<br />
<br />
如果函数无返回值，那么可以调用没有参数的 return运算符随时退出函数。<br />
如果函数没有明确的返回值，或调用了没有参数的return语句，那么他真正返回的值是undefined<br />
<br />
Array对象声明数组<br />
toString()方法<br />
返回字符串，用逗号将他们连接起来<br />
join(&#8220;&#8221;)方法，选择特定的符号连接字符串。<br />
<br />
string的split方法可以将string转化为array<br />
<br />
<br />
javascript中的object类&nbsp;<br />
<br />
javascript中所有的类都是继承object类，很重要的属性就是prototype--对该对象的对象原型的引用，返回对象object的实例 ,<br />
可以使用prototype为任何已有的类定义新的方法<br />
<br />
<br />
<br />
javascript中的array类<br />
shift（）方法是删除第一个字符串<br />
unshift（&#8220;&#8221;）方法是在数组的第一个位置上添加新元素，其他的向后摞<br />
array中还可以使用pop和push方法，把array当作栈来使用。<br />
<br />
javascript中的date类用来表示时间<br />
var date=new Date()<br />
date.getTime()<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/156897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-30 12:01 <a href="http://www.blogjava.net/liuzheng/articles/156897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript中定义类和对象最好的方法</title><link>http://www.blogjava.net/liuzheng/articles/156742.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Mon, 29 Oct 2007 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/156742.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/156742.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/156742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/156742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/156742.html</trackback:ping><description><![CDATA[function Car(sColor,iDoors,iMpg){<br />
this.color=sColor;<br />
this.doors=iDoors;<br />
this.mpg=iMpg;<br />
this.drivers=new Array("Mike", "Sue");<br />
}<br />
Car.prototype.showColor =function(){<br />
alert(this.color);<br />
}<br />
<br />
var oCar1=new Car("red",4,23);<br />
<br />
<br />
或者是<br />
function Car(sColor,iDoors,iMpg){<br />
this.color=sColor;<br />
this.doors=iDoors;<br />
this.mpg=iMpg;<br />
this.drivers=new Array("Mike", "Sue");<br />
if(typeof Car._initialized=="undefined")<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Car.prototype.showColor=function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(this.color);<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;Car._initialized=true;<br />
}<br />
<br />
<br />
}
<img src ="http://www.blogjava.net/liuzheng/aggbug/156742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-29 17:59 <a href="http://www.blogjava.net/liuzheng/articles/156742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴javascript心得（二）</title><link>http://www.blogjava.net/liuzheng/articles/153035.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Mon, 15 Oct 2007 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/153035.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/153035.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/153035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/153035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/153035.html</trackback:ping><description><![CDATA[<p><strong>1</strong>，不要认为Struts已经过时了，也不要盲目的去追随JSF以及更新的MVC框架，在目前Struts仍旧是最为优秀的MVC框架，尤其是后来与Spring、Hibernate（或者Ibatis）的结合，使得Struts的应用得到了进一步的发展，也许你认为Webwork2、SpringMVC或者JSF更为优秀和实用，那么也没有关系，其实只要对你或你的公司适用，那么就可以了。</p>
<p><strong>2</strong>，你知道Javascript中的typeof和instanceof操作吗，如果不知道，劝你还是看看这方面的知识吧，typeof返回的是对象的类型，例如string、number、object等等，而instanceof判断的是一个对象是否是某个类的实例，例如：<br />
&nbsp; var arr=new Array();<br />
&nbsp; var type=typeof(arr);//返回object<br />
&nbsp; var flag=arr instanceof Array;//返回true<br />
&nbsp; var flag2=arr instanceof Object;//返回true;<br />
&nbsp; 在实际使用过程中，你会发现instanceof是更为强大的，当然了许多时候typeof用起来很方便，但是对于复杂的场合typeof就不太适用了，尤其是对于自定义对象以及对象之间有着复杂的继承关系时，使用instanceof可以方便的对这些进行判断。</p>
<p><strong>3</strong>，虽然你可能知道javascript中typeof的用法，但是如果你不能做对下面的题，说明你对typeof的理解还是不够的，例如：<br />
&nbsp; var a;<br />
&nbsp; var rs=typeof(a);//请问rs的值是什么？<br />
&nbsp; （A）object （B）variable （C）undefined (D) string （E）null （F）以上答案全不正确<br />
&nbsp; 如果你选择A还算对JS有一些了解，如果选择B则基本上是乱猜的，如果选择D什么也说明不了，如果选择E则说明你对于Java和Javascript有些东西还没有分清楚，选择F也是不正确的。答案是C，记住在Javascript之中，如果一个变量没有初始化，那么该变量的类型为undefined。</p>
<p><strong>4</strong>，也许你一直在抱怨Javascript之中没有列表、哈西表以及堆栈、队列等数据结构，如果真的在抱怨，那么也不是你的错，毕竟包括我自己在内，我们对JS的了解太少了，其实在JS之中，数组对象自身完全支持上面的那些数据结构，例如：<br />
&nbsp; var list=new Array();//列表<br />
&nbsp; list[0]="a";<br />
&nbsp; list[100]="b";<br />
&nbsp; var map=new Array();//哈西表<br />
&nbsp; map["001"]="a";<br />
&nbsp; map["username"]="zhangsan";<br />
&nbsp; var stack=new Array();//堆栈，即后进先出<br />
&nbsp; stack.push("a");<br />
&nbsp; stack.pop();<br />
&nbsp; var queue=new Array();//队列，即先进先出<br />
&nbsp; queue.unshift("a");<br />
&nbsp; queue.shift();<br />
&nbsp; 可见JS是非常强大的，关键是我们知道的太少了，关于Javascript对于数组的操作，你也可以参考《<a href="http://www.ciksa.com/projects/jsjava/blog/?p=18"><font color="#000080">Javascript对数组的操作</font></a>》。</p>
<p><strong>5</strong>，作为一个web开发人员，我们不能指望美工在完成漂亮的效果图之后，还要为我们将图切分，最后生成html文件后再给我们，然后我们对这些html文件，再修改转换为jsp、asp或者php文件。我一直认为效果图的切分应该或者最好由我们程序员自己来做，因为美工做的效果图实际上是要应用到我们的产品或者项目中的，而具体的产品和项目，对效果图中哪些部分是需要输入文字的，哪些地方是需要背景的，哪些地方是需要可以自动伸缩的，而哪些地方又是必须保证大小的，是有很严格的要求的，尤其是我们的产品或项目中如果使用了类似sitemesh等的模板技术，那么切图的工作就更要由我们自己来做了。这样并不是说美工不需要懂得html、css等技术，也不是说美工切出的图，会不符合我们的要求，我们知道，一张效果图，可以有n种切法，但是要能够满足实际的需求，往往只有一种最合适的切法，而这个切法一般来说美工是不太清楚的，开发人员也是不清楚的，只有既是开发人员，又懂得美工切图的人，才能够找到最为合适的切分方法，而这样的人才是非常奇缺的！</p>
<p><strong>6</strong>，不要过于痴迷Ajax技术，也不要过于追捧web2.0这个时髦的词汇，并不是说什么东西粘上ajax或者web2.0，就能够火起来或者对我们的实际发展有利的，如果你是做公网网站的，那么要注意，不合适的ajax使用，会使得网站被搜索引擎收录的信息大幅度减少，但是ajax或者Flex2等技术对于用户体验而言，还是相当不错的，因此是否使用ajax等技术，一要看对你们的解决方案宣传是否有作用，另外一点就是要看，它是否真正的改进了我们的应用。</p>
<p><strong>7</strong>，对于ajax的post提交方式，可能你有些问题要问，例如post的方式是不是只要在open时指定method就可以了，为什么我将大数据放到url后面，而没有被完全传递过去，为什么我后台使用类似jsp中的request.getParamter方法接收不到数据，我们通过一个例子看一下ajax发送/接受大数据的方式：</p>
<p>&nbsp; 1）send.jsp:（我举的例子使用的是Javascript开源框架JsJava的ajax类库，该类库对IE和Firefox等的XMLHttpRequest等对象进行了易用性的封装，不像prototype.js默认对传递的数据进行urlencode编码）</p>
<p>&nbsp;var ajaxRequest=new AjaxRequest();<br />
&nbsp;ajaxRequest.setRequestMethod("post");<br />
&nbsp;ajaxRequest.setRequestURL("ajaxresponse.jsp");<br />
&nbsp;ajaxRequest.setAsync(true);<br />
&nbsp;ajaxRequest.setMethodOnSuccess(onSuccess,[ajaxRequest]);<br />
&nbsp;ajaxRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");<br />
&nbsp;ajaxRequest.send("content=这是一篇几千字的文档...在此省略");</p>
<p>&nbsp; 要注意设置发送方式为post，设置头信息的内容类型为application/x-www-form-urlencoded，charset是否设置要看内容的编码情况，另外大数据就放到send之中，记住大数据不是放在url的参数之中的。</p>
<p>&nbsp; 2）receive.jsp</p>
<p>&nbsp;&nbsp;&nbsp; InputStream stream=request.getInputStream();<br />
&nbsp;&nbsp;&nbsp; InputStreamReader isr=new InputStreamReader(stream);<br />
&nbsp;&nbsp;&nbsp; BufferedReader br=new BufferedReader(isr);<br />
&nbsp;&nbsp;&nbsp; String str=br.readLine();&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; System.out.println(str);<br />
&nbsp;&nbsp;&nbsp; br.close();</p>
<p>&nbsp; 要知道，对于ajax post方式提交的数据，在服务器端如果是jsp不是简单使用getParameter就能取得到的，需要从输入流中去取，这和附件上传有些类似的地方。当然要注意编码和解码的问题。</p>
<p><strong>8</strong>，我们在界面中经常会通过setTimeout方法来实现定时或者异步操作，例如：<br />
&nbsp; setTimeout(myfunc,2000);//两秒后执行myfunc函数<br />
&nbsp; 但是要注意setTimeout方法并不能阻止后面js代码逻辑的执行，例如：<br />
&nbsp; &lt;script&gt;<br />
&nbsp;&nbsp;&nbsp; var a =8;<br />
&nbsp;&nbsp;&nbsp; setTimeout(myfunc,3000);<br />
&nbsp;&nbsp;&nbsp; document.write("wait...");<br />
&nbsp; &lt;/script&gt;<br />
&nbsp; 上面的代码中，document.write("wait...");逻辑并不会等到3秒后才执行，而是立即执行的，其实这一点可能大部分开发人员都知道，但是如果不注意，就很容易犯下面的错误，如下面代码所示：<br />
&nbsp; var ajax2HasExecuted=false;<br />
&nbsp; var ajaxRequest1;<br />
&nbsp; function ajax1Func(){<br />
&nbsp;&nbsp;&nbsp; if(!ajax2HasExecuted){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setTimeout(ajax1Func,200);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; var text=ajaxRequest1.getResponseText();<br />
&nbsp;&nbsp; ...<br />
&nbsp; }<br />
&nbsp; var ajaxRequest2;<br />
&nbsp; function ajax2Func(){<br />
&nbsp;&nbsp; var text=ajaxRequest2.getResponseText();<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ajax2HasExecuted=true;<br />
&nbsp; }<br />
&nbsp; 上面的代码是一个页面中同时发送了两个ajax异步请求，分别有两个对应的接收操作，而业务逻辑要求，这两个操作是要有先后顺序的，其中第一个接收操作，需要等待第二个接收操作完成之后，才能进行处理，于是第一个操作中就采用setTimeout的方式，本意是在执行第一个操作的开始的地方，先判断第二个操作是否已经执行完毕，如果没有执行完毕，则等待200毫秒后，重新执行第二个操作，然后由于setTimeout并不能组织后续的逻辑继续执行，所以实际上不管第二个操作是否完成，第一个操作都会一直往下执行下去，从而导致业务上的错误。解决方法要么是在if后面加上else，或者在setTimeout之后直接return，例如：<br />
&nbsp; if(!ajax2HasExecuted){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setTimeout(ajax1Func,200);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp; }</p>
<p><strong>9</strong>，window.open和window.showModalDialog方法相信你已经用到过许多次了，但是总是出现这样或那样的问题，问题主要是以下几个方面：<br />
1）showModalDialog这个函数名经常被写错，例如经常被写成showModelDialog，使得不能执行打开窗口的操作。<br />
2）控制打开窗口的属性，例如尺寸、滚动条、菜单、状态栏等，是我们经常会碰到的情况，但是我们经常会将这两种打开方式的属性名称以及属性之间的分隔符混用，使得属性执行不正确，例如我举下面的例子，要求弹出一个宽200高300的窗口，你看哪些方式是对的？<br />
（A）&nbsp; window.open("about:blank","","width=200,height=300");<br />
（B）&nbsp; window.open("about:blank","","width:200,height:300");<br />
（C）&nbsp; window.open("about:blank","","width=200;height=300");<br />
（D）&nbsp; window.open("about:blank","","width:200;height:300");<br />
（E） window.showModalDialog("about:blank","","dialogWidth:200px;dialogHeight:300px");<br />
（F） window.showModalDialog("about:blank","","dialogWidth=200px;dialogHeight=300px");<br />
（G） window.showModalDialog("about:blank","","dialogWidth:200;dialogHeight:300");<br />
再多的选项就不写了，正确答案是A和E，通过上面的问题我们需要记住一下几点：</p>
<ul>
    <li>window.open控制属性之间的分隔符是逗号&#8220;,&#8221;，属性和值之间用等于号"="连接
    <li>window.showModalDialog控制属性之间的分隔符是分号&#8220;;&#8221;，属性之间的用冒号&#8220;:&#8221;连接
    <li>window.open控制属性中长度和宽度尺寸可以直接写数字，也可以加上度量，例如px，但是对于window.showModalDialog的长度和宽度则必须带上px，否则尺寸无效，这一点是很重要的。 </li>
</ul>
<p><strong>10</strong>，对于数据库中的varchar型字段，是有长度限制的，例如oracle10g中varchar2字段的最大长度为4000字符,在mysql中varchar最长为255字符，要注意这里面的限制值是单字节字符值，而汉字属于双字节字符，因此对于汉字存储而言，varchar2字段最多可以存储2000个汉字，由此引申出来的一个问题，就是web开发过程中的表单提交验证问题，因为对于中国用户而言，输入的内容有可能是汉字和英文字符的组合，因此判断输入字符串的长度需要注意，Javascript中判断一个字符串的长度的方法为：<br />
&nbsp; var str="abcdef";<br />
&nbsp; var length=str.length;<br />
但是字符串的这个属性，计算的是独立字符的长度，例如一个中文字符按长度1计算，因此如下：<br />
&nbsp; var str="你好";<br />
&nbsp; var length=str.length;<br />
其长度的值为2，而不是4，那么如何计算含有汉字或者说是双字节字符的真实长度呢？通过搜索可以很快找到方法，就是先将双子节字符替换为两个单字节字符，然后计算替换后的字符的长度，当然了JsJava中提供了对于双字节字符串真实长度的计算支持，你可以查看其中的StringUtils类。</p>
<p><strong>11</strong>，如果你不能默写出常用颜色的英文表示值和16进制表示值，那么说明你的HTML基本功还是需要练的，例如白色是white，十六进制是FFFFFF，红色是red，十六进制是FF0000，蓝色是blue，十六进制是0000FF，紫色是purple，橙色是orange，网页中常用的灰色一般都是EEEEE，或者再浅一些EFEFEF，当然说这些并不是让你去背大量的颜色和十六进制值，但掌握一些常用的，还是很有必要的。</p>
<p><strong>12</strong>，Javascript支持多维数组，但是没有构造函数可以直接生成多维数组，例如一维数组可以通过Array生成，例如：<br />
&nbsp; var arr=new Array(12);<br />
生成多维数组，虽然没有构造函数支持，但是可以通过另外一种方式实现，例如实现一个12x5的二维数组：<br />
&nbsp; var arr=new Array(12);<br />
&nbsp; for(var i=0;i&lt;arr.length;i++){<br />
&nbsp;&nbsp;&nbsp; arr[i]=new Array(5);<br />
&nbsp; }<br />
另外，你可以直接使用JsJava的标准类MultiDimensionArrayUtils，支持生成二维和三维数组。</p>
<p><strong>13</strong>，对于img标签，我们知道它有一个align属性，这个align是控制该图片与临近文本的位置关系，按照MSDN的说法，该属性的默认值是left，但是从实际的显示效果来看，好像并非如此，我们可以一起来比较一下不写align属性和将align赋值为left的情况，如果默认就是left，那么不写align和将align赋值left，其效果应该是一样的，那我们来一下：<br />
&lt;img src="http://jsjava.sourceforge.net/images/logo.gif"&gt;JsJava是最优秀的Javascript类库解决方案和界面应用开发支撑框架！<br />
效果如下：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/imgalign1.gif" /><br />
再看加入align=left的情况：<br />
&lt;img src=http://jsjava.sourceforge.net/images/logo.gif" _fcksavedurl="http://jsjava.sourceforge.net/images/logo.gif"" _fcksavedurl="http://jsjava.sourceforge.net/images/logo.gif"" _fcksavedurl="http://jsjava.sourceforge.net/images/logo.gif"" _fcksavedurl="http://jsjava.sourceforge.net/images/logo.gif"" align="left"&gt;JsJava是最优秀的Javascript类库解决方案和界面应用开发支撑框架！<br />
效果图如下：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/imgalign2.gif" /><br />
从实际效果来看，img的默认align并非是left，好像应该是bottom，而且上面的情况在IE6.0和Firefox2.0上都试验过，看来MSDN的说法是不太可信的，或者是自己理解错了？你可以看一下MSDN中的描述：<a href="http://msdn2.microsoft.com/en-us/library/ms533066.aspx"><font color="#000080">http://msdn2.microsoft.com/en-us/library/ms533066.aspx</font></a></p>
<p><strong>14</strong>，在界面中添加事件的方式主要有如下几种，例如当页面加载之后，执行函数myfunc，几种定义方式如下：<br />
1）在&lt;body/&gt;标签中加入onload事件，即：<br />
&lt;body onload="myfunc()"...&gt;<br />
2）在任何一个可以执行Javascript的地方定义window.onload，即：<br />
window.onload=myfunc;<br />
3）在&lt;script/&gt;标签中定义，即：<br />
&lt;script for=window event=onload&gt;<br />
&nbsp; myfunc();<br />
&lt;/script&gt;<br />
4）将事件加入到事件队列中，即：<br />
IE中 window.attachEvent("onload",myfunc)<br />
Firefox中 window.addEventListener("load",myfunc,false)<br />
建议大家使用第四种方式，因为只有第四种方式，可以避免将其它的同类事件覆盖，第四种方式是将该事件加入到同类的事件的队列之中，不会覆盖其它的同类事件，这在web开发过程种，是需要特别注意的，尤其我们自己定义一些界面框架或者组建的时候，经常需要定义onload事件，这个时候最好是使用第四种方式，因为引用界面框架和组建的用户，可能在页面上也想使用onload逻辑，当然用户自己使用第四种方式也不会有问题，但是做为一个负责任的界面高手，是不应该这样想得，我们应该严于律己，而宽以待人。</p>
<p><strong>15</strong>，并不只是body（或者说window）有onload事件，&lt;iframe/&gt;中也可以定义onload事件，还有&lt;img/&gt;也可以定义onload事件，例如当图片加载完毕后，在window的状态栏种显示加载成功的字样：<br />
&lt;img src=http://jsjava.sourceforge.net/images/logo.gif" onload="window.status='加载完毕！'"&gt;<br />
当然了对于img，你最好深入研究一下其各个事件和属性的用法，你会发现原来不知道的东西还有那么多，当然肯定有不少开发人员，已经对这一点有所研究了，但是大多数开发人员还是缺乏对这方面知识的了解。</p>
<p><strong>16</strong>，如何在HTML种加入一段保留格式化的文本，相信你会想到&lt;pre&gt;&lt;/pre&gt;标签，例如：<br />
&lt;pre&gt;<br />
&nbsp; 这是一段格式化文本，<br />
里面的文字直接将格式输出<br />
&lt;/pre&gt;<br />
显示结果为：<br />
&nbsp; 这是一段格式化文本，<br />
里面的文字直接将格式输出</p>
<p>对于一般情况而言，pre标签就够用了，但是pre标签的不足之处，在于它不能将其中的html标签也原样输出，而是进行了解析，例如：<br />
&lt;pre&gt;<br />
&nbsp; 这是一段格式化文本，&lt;font color="red"&gt;里面的文字&lt;/font&gt;直接将&lt;br&gt;格式输出<br />
&lt;/pre&gt;<br />
显示结果为：<br />
&nbsp; 这是一段格式化文本，<font color="#ff0000">里面的文字</font>直接将<br />
格式输出</p>
<p>那么如何才能将含有HTML的内容也原样输出呢？实际上在HTML规范种有&lt;xmp/&gt;标签，可以实现这种效果，例如：<br />
&lt;xmp&gt;<br />
&nbsp; 这是一段格式化文本，&lt;font color="red"&gt;里面的文字&lt;/font&gt;直接将&lt;br&gt;格式输出<br />
&lt;/xmp&gt;<br />
显示结果为：<br />
&nbsp; 这是一段格式化文本，&lt;font color="red"&gt;里面的文字&lt;/font&gt;直接将&lt;br&gt;格式输出</p>
<p><strong>17</strong>，如何获取某个对象区域的尺寸以及坐标，是我们界面开发过程种经常会遇到的一个问题，一般我们都采用getBoundingClientRect方法来获取对象的区域，进而得到该区域的尺寸和坐标，但是该方法只能在IE中使用，当然Firefox也有类似的方法，相信大多数开发人员不知道，该方法就是getBoxObjectFor，为了不想为跨浏览器而操心，你可以直接下载JsJava，使用其中的DocumentUtils类的getElementRectangle静态方法，例如：<br />
&lt;script src="jsjava.js"&gt;&lt;/script&gt;<br />
&lt;script&gt;<br />
&nbsp; var elemObj=document.getElementById("div1");//div1是一个div的id<br />
&nbsp; var rect=DocumentUtils.getElementRectangle(elemObj);//返回的rect是JsJava中的Rectangle对象<br />
&nbsp; var x=rect.getX();<br />
&nbsp; var y=rect.getY();<br />
&nbsp; var width=rect.getWidth();<br />
&nbsp; var height=rect.getHeight();<br />
&lt;/script&gt;<br />
JsJava的类和方法都是经过IE和Firefox测试的，使用起来很方便。</p>
<p><strong>18</strong>，在界面中对象的位置的计算与理解是比较麻烦的一件事情，例如clientHeight、clientTop、scrollHeight、scrollTop、offsetHeight、offsetTop，这些该怎么区分，又分别代表什么意思，对位置属性的深入理解，非常有助于对HTML界面布局本质的理解，是成为高手的必由之路，下面就简单介绍一下：<br />
1）clientHeight，代表对象区域的屏幕高度，不包含区域的border尺寸，但包含padding的尺寸<br />
2）clientTop，对象区域offsetHeight与clientHeight的差的一半<br />
3）scrollHeight，代表对象区域内容的底部距区域最上边的距离<br />
4）scrollTop，代表对象区域滚动部分的高度，即区域的最上边距离该区域可见部分的最上边的距离<br />
5）offsetHeight，代表对象区域的屏幕高度，包含border和padding尺寸<br />
6）offsetTop，代表对象区域距离上一个对象高度<br />
上面的解释如果没有实际的经验，多少会有些迷糊，没有关系，我给你一个示意图：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/objdim1.gif" /><br />
因此，scrollHeight并非总是大于或等于clientHeight，实际上确实有一些开发人员认为一个区域没有滚动时scrollHeight和clientHeight相等，有滚动时scrollHeight＝clientHeight+scrollTop，这种认识是不对的或者说是不准确的。<br />
上面的图的html源码为：<br />
&lt;script&gt;<br />
&nbsp; function pos(){<br />
&nbsp;&nbsp;&nbsp; debug(test1.clientHeight);<br />
&nbsp;&nbsp;&nbsp; debug(test1.clientTop);<br />
&nbsp;&nbsp;&nbsp; debug(test1.scrollHeight);<br />
&nbsp;&nbsp;&nbsp; debug(test1.scrollTop);<br />
&nbsp;&nbsp;&nbsp; debug(test1.offsetHeight);<br />
&nbsp;&nbsp;&nbsp; debug(test1.offsetTop);<br />
&nbsp;&nbsp;&nbsp; debug("--------------");<br />
&nbsp;&nbsp;&nbsp; debug(test2.clientHeight);<br />
&nbsp;&nbsp;&nbsp; debug(test2.clientTop);<br />
&nbsp;&nbsp;&nbsp; debug(test2.scrollHeight);<br />
&nbsp;&nbsp;&nbsp; debug(test2.scrollTop);<br />
&nbsp;&nbsp;&nbsp; debug(test2.offsetHeight);<br />
&nbsp;&nbsp;&nbsp; debug(test2.offsetTop);<br />
&nbsp;&nbsp;&nbsp; debug("--------------");<br />
&nbsp; }<br />
&nbsp; function debug(str){<br />
&nbsp;&nbsp;&nbsp; info.value+=str+"\n"; <br />
&nbsp; }<br />
&lt;/script&gt;<br />
&lt;body onclick="pos()"&gt;<br />
&nbsp; &lt;div id="test1" style="padding:5;border-width:15;border-color:black;border-</p>
<p>style:solid;background-color:red;height:100;width:200"&gt;区域1，高100&lt;/div&gt;<br />
&nbsp; &lt;span id="test2" style="background-color:blue;height:50;width:200"&gt;区域2，高50&lt;/span&gt;<br />
&nbsp; &lt;div id="test4" style="height:100;width:200;background-color:green"&gt;区域4，高100&lt;/div&gt;<br />
&nbsp; &lt;textarea id="info" cols="50" rows="20"&gt;&lt;/textarea&gt;<br />
&lt;body&gt;<br />
显示结果为：<br />
70<br />
15<br />
28<br />
0<br />
100<br />
15<br />
--------------<br />
50<br />
0<br />
18<br />
0<br />
50<br />
115<br />
--------------</p>
<p><strong>19</strong>，网上许多人都问，如何将一个RGB颜色转换为HTML中的十六进制颜色，我看到了一些网友的实现，例如定义一个长度为256的数组，并按照十六进制的规律将其全部初始化，还有的利用了HTML标签的一些特点，不过有一定的局限性，其实我们只要理解了RGB颜色的基本知识，转换起来是很方便的，RGB分别代表红（Red）、绿（Green）、蓝（Blue）三种基色，其中每一种基色从浅到深又可以定义256色，这样RGB总共可以表示256x256x256种颜色，而对于十六进制颜色来说，其实就是用十六进制数字来表示RGB，例如FFFFFF代表rgb(256,256,256)，换算起来也很简单，就是十进制与十六进制之间的表示方法的转换，例如对于RGB颜色rgb(132,216,12)，用十六进制颜色表示的计算方式为：<br />
132转换为十六进制数字为84<br />
216转换为十六进制数字为D8<br />
12转换为十六进制数字为0C<br />
因此rgb(132,216,12)的十六进制颜色就是84D80C，我们可以看一下两者的效果：<br />
&lt;div style="background-color:rgb(132,216,12);width:50;height:50"&gt;&lt;/div&gt;<br />
&lt;br&gt;<br />
&lt;div style="background-color:#84D80C;width:50;height:50"&gt;&lt;/div&gt;<br />
显示为：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/rgbhexcolor.gif" /><br />
那么Javascript之中是否提供了十进制数与十六进制数的转换呢，Javascript没有提供内置的函数来进行这种转换，不过你可以下载JsJava，使用其中Integer类的静态方法：toHexString方法，例如<br />
&lt;script src="jsjava.js"&gt;&lt;/script&gt;<br />
&lt;script&gt;<br />
&nbsp; var hex=Integer.toHexString(253);<br />
&nbsp; document.write("&lt;br&gt;"+hex);//显示为FD<br />
&lt;/script&gt;<br />
或者你直接使用JsJava种的Color对象：<br />
var color=new Color(132,216,12);<br />
var hex=color.toHexValue();//hex的值为84d80c</p>
<p><strong>20</strong>，web开发过程中，经常会遇到原页面与弹出页面之间进行交互的问题，如果只是简单的变量传递，还是不难的，而我们经常遇到的一个实际场景是：例如有一个用户列表页面，点击&#8220;新建&#8221;按钮，弹出一个创建用户的页面，填写完信息后要提交表单并关闭窗口，同时列表页面中要列出新建的用户，这个时候我们一些开发人员喜欢使用的方式为：<br />
userForm.submit();<br />
opener.location.reload();//或者有些开发人员喜欢用opener.location=列表页面的请求url<br />
window.close();<br />
上面的代码有一个很明显的问题，就是如果表单提交给后台，后台还在处理，而此时原页面已经执行了重载，那么等新用户在后台存储后了，也不会反映到列表页面中了，当然刷新一个就有了，但是就达不到我们所要的效果了。下面给你介绍一种比较稳妥的方式（ajax方式就不介绍了）：<br />
先让表单提交，提交后还是回到弹出的那个页面，或者一个其它的页面，然后在该页面中做判断，如果后台信息处理成功，那么就执行原页面的重载，然后关闭窗口。<br />
当然有些开发人员说，前面的那种方式，一直在项目中使用没有发现什么问题，那我告诉你，那是因为你比较幸运，后台处理速度很快，列表重载的时候，后台已经处理完了，但是一旦后台处理慢了，客户就该找麻烦了。</p>
<p><strong>21</strong>，界面问题是当前web开发领域（不要认为只是asp、jsp和或者php等的开发，大的说可以包括ASP.NET以及J2EE等）最为棘手的问题之一，而且大部分开发人员，不懂得该如何去解决界面问题，而且经常会遇到一些不可思议的问题。其实我告诉你，界面问题的确有一些是非常奇怪的，但是不要因为这样，就不去深究问题的原因所在，我在这些年的开发中，遇到了不少的离奇的界面问题，包括自己碰到的和别人让我去解决的，不过我发现，在这些离奇的问题背后，体现的却是我们大部分开发人员，在界面能力和素养方面的一些问题，例如有些人就是太粗心，而有些人则是缺乏界面基础知识等等。成为界面高手不是目的，培养解决界面问题的能力和素养才是最关键的。</p>
<p><strong>22</strong>，在连接标签中加入onclick操作是很常用的一种方式，例如：<br />
&lt;a href="#" onclick="window.open('yoururl')"&gt;人员管理&lt;/a&gt;<br />
一般情况，这种方式是没有问题，但是如果页面内容比较长，出现了上下滚动条的时候，这种方式就会出一些问题，主要是由于href的#造成的，我们知道锚的作用就是让页面定位并移动到锚处，上面的代码开发人员的意图主要是想点击的时候不要执行链接href，所以写一个#，但是#对于滚动的页面，会在执行onclick的同时，页面出现移动定位行为，这样的用户体验是很不好，解决方式有如下几种：<br />
&lt;a href="javascript:void 0" onclick="window.open('yoururl')"&gt;人员管理&lt;/a&gt;<br />
&lt;a href="javascript:return" onclick="window.open('yoururl')"&gt;人员管理&lt;/a&gt;<br />
建议使用void 0方式，因为return方式，有时会影响click事件的传播，尤其是return false的时候。</p>
<p><strong>23</strong>，在Window XP系统中，我们经常奇怪为什么我们使用的Javascript控制窗口尺寸和位置的一些操作，而IE竟然没有全部支持呢，例如下面的代码：<br />
&lt;script&gt;<br />
&nbsp; window.open("about:blank","","width=10000,height=15000");<br />
&lt;/script&gt;<br />
按道理应该弹出一个10000x15000的大窗口，然后实际上IE给我们弹出的不过是一个和浏览器尺寸大小一致的窗口，为什么会这样呢？其实我们理解微软，如果不这样限制，系统可能会因为大量的这种代码而最终崩溃，当然微软的IE也提供了配置入口，配置是否进行限制，具体入口为：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/iejsset1_1.gif" /><br />
对一般站点类说，默认都是禁用的，只要打开就可以了。</p>
<p><strong>24</strong>，我们页面中经常会以post方式提交表单数据，提交之后，如果我们刷新页面，IE中一般都会提示如下图所示的信息：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/ieinfo1.gif" /><br />
如果避免这种提示出现，一种是编程上去解决，即表单提交后，不要从其它窗口对该窗口继续执行location的reload方法等等，最好是使用location的href属性或者assign、replace等方法），在IE的高级选项中，也有一个条目可以设置重定向表单提交时是否给出提示信息，但是设置了之后，没有什么效果，因此也就不过多介绍了。</p>
<p><strong>25</strong>，现在很流行div+css方式的布局，的确这样做界面框架的灵活性大为增加，可以说什么布局都能出的来，而且目前的ajax方式的轻量级portal框架基本上都采用的是div+css的布局方式，但是也不要过度的使用，或者什么场合下都使用，例如对于一个中大型的项目而言，要考虑的不仅仅是布局这样的事情，还要考虑界面框架的许多东西，在这种情况下，还是使用模板的方式比较好，事实上div+css是一种布局，而模板是一种&#8220;框架&#8221;，两者可以结合使用，至于能结合到什么程度，就看你的实际本领了。</p>
<p><strong>26</strong>，做为一个项目经理、产品经理或者是技术总监，你应该要重视界面方面的问题了，想想吧我们现在的开发人员，大都能很快的完成后台逻辑的开发，但是到了界面展现却是捉襟见肘，界面效果和易用性做的都不到位，界面方面都调整好了，需要的时间往往并不比后台逻辑开发用的时间少多少，相信你见到过吧，为了调试一个界面中的奇怪的问题，往往会用掉一个人一两天的时间，如果再不重视界面技术的学习和素养的培养，我们的路还能走多远。</p>
<p>&nbsp; 又七七八八的为大家总结了一下我在web开发尤其是界面开发上的一些经验，这些都是摸爬滚打出来的，可以算作是经验，但不一定就特别的正确，许多东西还需要你自己去实践、检验和再总结，如果我写的这些东西，对你而言哪怕只是有一点的用处，我都是很欣慰的，另外一点我需要说的，就是我们应该逐步走出大师崇拜的阴影，不要再津津乐道于敏捷开发、极限编程等等，面对那些国外的大师，我们更为重要的是学习他们身上的精神和品质，而不是做一个忠实的传道士，对于这些精神和品质，我们中华民族实际上很早就有了，只是到现在已经少的可怜的，但并不是说我们就没有希望了，看看当今科学界和各个行业的民族精英们，看看他们骨子里面的那种精神，是很值得我们崇敬和学习的。</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/153035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-15 17:34 <a href="http://www.blogjava.net/liuzheng/articles/153035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转贴javascript学习心得</title><link>http://www.blogjava.net/liuzheng/articles/153030.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Mon, 15 Oct 2007 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/153030.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/153030.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/153030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/153030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/153030.html</trackback:ping><description><![CDATA[<p><strong>1，</strong>document.getElementById方法只能获取到一个对象，即使有多个同名的对象，也只取第一个具有该名称的对象，例如在一个form（名称为myform）中，有三个id="mycheckbox"的复选框，那么使用document.getElementById("mycheckbox")，返回的是第一个checkbox对象，而不是返回一个数组，如果使用document.myform.mycheckbox则返回一个数组。</p>
<p><strong>2，</strong>使用showModalDialog打开一个页面，则在这个页面中，对于任何链接和任何表单提交，都会在新的窗口中执行，即使你在链接或form中指定了target="_self"也是没有用的。例如使用showModalDialog打开一个test.html，在该页面有一段代码<br />
&lt;a href="test2.html" target="_seft"&gt;打开&lt;/a&gt;<br />
如果点击该链接，那么将会在新窗口中打开test2.html，至少在ie中是这样的，那么是不是就没有办法解决了呢？不是的，我们可以通过在弹出的页面的head中加入下面的代码来解决这个问题：<br />
&lt;head&gt;<br />
&nbsp; &lt;base target="_self"&gt;<br />
&lt;/head&gt;</p>
<p><strong>3，</strong>在一个页面含有某个iframe，其id="myframe" name="myframe"，此时使用document.getElementById("myframe")取到的是iframe标签对象，通过该对象可以获取iframe的各个属性，例如src、frameborder、style等等，但是不能获取到iframe所包含的子页面的各个对象。如果使用document.frames("myframe")取到的是iframe组件对象，通过该对象可以获取到iframe所包含的页面的子页面的各个对象，例如子页面的window对象，但是不能获得iframe标签得各个属性，例如上面说到的src等等。请参看如下类似代码：<br />
1.html<br />
&lt;script&gt;<br />
&nbsp; function check(){<br />
&nbsp;&nbsp;&nbsp; var obj1=document.getElementById("myframe");<br />
&nbsp;&nbsp;&nbsp; alert(obj1.src);<br />
&nbsp;&nbsp;&nbsp; //alert(obj1.window.document.myform.username.value);//Error<br />
&nbsp;&nbsp;&nbsp; var obj2=document.frames("myframe");<br />
&nbsp;&nbsp;&nbsp; alert(obj2.window.document.myform.username.value);<br />
&nbsp;&nbsp;&nbsp; //alert(obj2.src);//Error<br />
&nbsp; }<br />
&lt;/script&gt;<br />
&lt;body onload="check()"&gt;<br />
&nbsp; &lt;iframe id="myframe" name="myframe" src="2.html" frameborder="3" style="width:300;height:200;border-width:1;border-color:red;border-style:solid"&gt;&lt;/iframe&gt;<br />
&lt;/body&gt;<br />
2.html<br />
&lt;body&gt;<br />
&nbsp; &lt;form name="myform"&gt;<br />
&nbsp;&nbsp;&nbsp; 用户名：&lt;input type="text" name="username" value="test" /&gt;<br />
&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;</p>
<p><strong>4，</strong>在table中，如果在table中加入border="1" bordercolor="red"，那么table中所有单元格都会加上厚度为1的红色边框，但是如果在table中加入css style="border-width:1;border-color:red;border-style:solid" 那么只会在整个table的最外面加上厚度为1的红色边框，分别如下图所示：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq1.gif" /><br />
当然第一个出现了双边框，这是因为没有设置cellspacing的缘故，只要在table中设计cellspacing="0"，那么就变为单边框了。</p>
<p><strong>5，</strong>许多时候我们需要在页面加载时能够通过javascript去动态操作html中的一些对象，对于这些操作我们最好是在body中定义onload操作，然后在该操作中去完成这些任务，尽量避免在html中嵌入script执行代码，因为对于比较大的页面，当这些脚本执行的时候，页面往往还没有加载完毕，因此许多页面对象还没有被生成，此时动态去改变很可能会报异常。</p>
<p><strong>6，</strong>有时候我们需要在iframe子页面中调用父页面的javascript函数，例如在父窗口中定义了一个函数如下：<br />
&lt;html&gt;<br />
&nbsp; &lt;script&gt;<br />
&nbsp;&nbsp;&nbsp; function loadImage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br />
&nbsp;&nbsp; }<br />
&nbsp;&lt;/script&gt;<br />
&lt;body&gt;<br />
//...<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
那么在iframe子页面中可以通过parent.loadImage()来实现调用，这也说明用户在页面定义的所有javascript函数都属于window对象之下。那么在父窗口如何调用子窗口中的函数呢，应该很简单了，就是获得子窗口对象，然后调用子窗口对象的window对象下的这些函数即可，例如iframe的name为myframe，在子窗口定义了一个函数getUserName，那么父窗口中的调用方式为document.frames("myframe").getUsername();另外对于父窗口调用子窗口中的方法，还要注意一个问题，就是子窗口的加载有时候会比较慢，如果子窗口正在加载，那么此时它的各种页面对象都不存在，那么当在父窗口调用子窗口的方法时，为了保险可以使用借助setTimeout来实现异步调用，即通过setTimeout指定一定时间之后（例如100ms），再执行调用，调用执行总是判断子窗口页面是否加载完毕，如果没有加载完毕，则继续使用setTimeout方法，循环往复直到子窗口被完全加载，然后执行子窗口的函数调用。既然这里解释了窗口间的异步调用，后面就不专门解释了。</p>
<p><strong>7，</strong>在一个网页中如何最小化窗口，当然你可能会说，网页的右上角不是有最小化、最大化和关闭三个按钮吗，当然了这里说这个问题是指，如果不点击网页右上角的最小化，如何实现网页的最小化操作，例如有些项目中，用户需要办公界面是全屏化的，这意味着网页自己提供的许多操作都不可见，更不用说去操作了。在网络上我们搜索最小化的解决方式，我们会发现千篇一律的使用如下的方式实现：<br />
<font size="2">&lt;object&nbsp;id=hh1&nbsp;classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt;&nbsp; <br />
&lt;param&nbsp;name="Command"&nbsp;value="Minimize"&gt;&lt;/object&gt;<br />
&lt;input&nbsp;type=button&nbsp;value=最小化&nbsp;onclick=hh1.Click()&gt;&nbsp; <br />
在win98和windows2000中这个方式可能是可以的，但是在windows XP中却是不再支持了，不仅如此在windows XP中对javascript不少函数做了限制。那么在XP中如何实现最小化呢，一个可以实现的方式就是自己写一个activeX控件，这个是在项目中证明可以实现的。（不要认为activeX控件很难写，也不要以为activeX控件用户不接受，在实际的项目中如果用户使用的都是ie，那么用户一般是会接受的，当然这里的项目最好是内网办公项目，对于公网项目来说，用户接不接受就很难说了）</font></p>
<p><font size="2"><strong>8，</strong>注意td中nowrap的使用，这个属性是很有用的，例如如果一个td中含有多张图片，那么如果不加入nowrap，那么很可能这些图片会由于其它的td的挤压而产生细微的上下错位，这表现的页面上就是某处出现了一条横向的细缝。这一点很重要，页面中许多非常奇怪的现象都与此有关。</font></p>
<p><font size="2"><strong>9，</strong>对于showModalDialog弹出的页面，不能使用右键菜单，也不支持F5和ctrl+r刷新，如果此时修改弹出页面的内容，那么必须关闭该窗口，然后重新弹出才可以。另外，对于许多web服务器，由于服务器都设置有缓存，如果修改了弹出页面的内容，那么许多时候只是关闭弹出页面还是不够的，往往还需要关闭弹出该页面的那个页面才可以。在这里多说一句，web开发许多奇怪的页面现象都和web服务器的缓存有着很大的关系，因此出现问题时考虑一下是否是由于服务器的缓存所致。</font></p>
<p><font size="2"><strong>10，</strong>我们喜欢在form中定义onsubmit操作，主要是为了在表单提交之前可以做一些有意义的操作，例如检查输入域的有效性等等，但是一定要注意，如果我们通过点击该form中的submit按钮（type=submit或type=image）提交表单，那么该onsubmit操作会被执行，但是如果通过document.formName.submit()提交表单，那么此onsubmit操作将不被执行。</font></p>
<p><font size="2"><strong>11，</strong>许多时候我们修改了页面的内容，但是我们刷新页面或重新打开该页面，却看不到修改的效果，除了前面提到过的showModalDialog和缓存的情况要考虑外，还要检查一下是否改对了地方，即你修改的那个页面是否是服务器上的那个页面，有可能你修改了其它地方的一个页面，如果不是这个原因，那么再进行其它方面的检查。</font></p>
<p><font size="2"><strong>12，</strong>在没有系统规划好之前，请不要在css中定义html标签的统一行为，即下面的形式：<br />
&lt;style&gt;<br />
</font><font size="2">&nbsp; TABLE{font-size:11pt;color:black;}<br />
&nbsp;&nbsp;INPUT{border-width:1;border-color:pink;border-style:solid} <br />
&lt;/style&gt;<br />
因为一但定义了这些标签的属性，那么这将会影响页面中所有的这些标签属性，尤其在一些公用的css文件中，尽量不要定义html标签的统一行为。当然如果经过了系统的良好的规划，那么这样做将是非常好的，只是在国内在css上经过良好规划的并不多，因此虽然我们见到许多项目和产品中对html标签做了许多css的定义，但是真正起到作用的并不多。</font></p>
<p><font size="2"><strong>13，</strong>在html标签中有许多属性的名称都是复合词，例如borderColor、frameBorder、readOnly等等，注意这些复合词在html的书写，一般来说我们在html标签中写为borderColor和bordercolor，各个浏览器的解析都会通过，但是我们在使用javascriopt引用这些属性时却需要注意了，一定使用正确的属性名称，严格来说，对于复合词而言，除了第一个有意义的词之外，其它任何有意义的词的首字母都要大写，例如对于上面列出的三个属性的引用，一定要使用borderColor、frameBorder、readOnly的形式。<br />
&lt;input type="text" id="myinput" readonly /&gt;<br />
&lt;script&gt;<br />
&nbsp;&nbsp;&nbsp; var flag=document.getElementById("myinput").readOnly;//正确的方式<br />
&nbsp;&nbsp;&nbsp; //var flag=document.getElementById("myinput").readonly;//错误的方式<br />
&lt;/script&gt; </font></p>
<p><strong>&nbsp;14，</strong>我们知道当使用浏览器的菜单&#8220;查看&#8221;-&gt;&#8220;文字大小&#8221;来改变文字的显示时（或者有些浏览器也可以使用ctrl+滚轮键），网页中的文字的字号会发生相应的变化，如果我们在网页中的文字块中定义了style="font-size:10pt"，那么这些文字块中的文字的大小将是固定的了（注意在&lt;font/&gt;标签定义size属性是不能固定字号的），我想这一点多数人都应该知道的。但是我们使用中有时会出现一种非常奇怪的现象，例如下面的一段代码：<br />
&lt;table&gt;&lt;tr&gt;&lt;td&gt;<br />
&lt;div style="font-size:10pt;border-width:1;border-color:red;border-style:solid"&gt;<br />
&nbsp; 这是上面<br />
&lt;/div&gt;<br />
&lt;br /&gt;<br />
&lt;div style="font-size:10pt;border-width:1;border-color:green;border-style:solid"&gt;<br />
&nbsp; 这是下面<br />
&lt;/div&gt;<br />
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br />
我们看一下在字号显示&#8220;最大&#8221;和&#8220;最小&#8221;下的差别：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq2.gif" /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq3.gif" /><br />
从上图我们可以看到字号我们是固定住了，但是table的高度却会随着查看方式的不同而发生变化，这是为什么呢？原因就在于td当中的那个&lt;br /&gt;，我们知道&lt;br /&gt;是表示段内换行，但是要注意在网页中所谓的行也是有一定的默认高度的，而且这个高度随着查看方式的不同而发生相应的变化，因此如果我们想固定上面table的高度不发生变化，有下面两种方式：<br />
方式一：在table标签中加入字号限制例如&lt;table style="font-size:10pt"...<br />
方式二：在&lt;br /&gt;中加入字号限制例如&lt;br style="font-size:10pt" /&gt;...<br />
如果你是一个web开发人员，你可以试着使用ctrl+滚轮键改变网页查看文字的大小，你会发现不少页面都存在这个问题的。</p>
<p><strong>15，</strong>网页中定位对象的方式有许多种，下面先简单总结一下，以后再专门写这个方面的文章的：<br />
1）页面内通用定位方式（这些定位方式适用于后面其它元素的定位）<br />
document.getElementById(objId);//通过对象的id获取对象，这个是各个浏览器都支持的，返回一个对象<br />
document.getElementsByName(objName);//通过对象的name获取对象，这个是各个浏览器都支持的，返回一个数组<br />
document.getElementsByTagName(tagName);//通过标签名称获取对象，这个是各个浏览器都支持的，返回一个数组<br />
document.all.objId;//通过对象id获取对象，这个是ie支持的，返回一个对象<br />
document.all(objId);//通过对象id获取对象，这个是ie支持的，返回一个对象<br />
document.layers.objId;//通过对象id获取对象，这是Netscape支持的，返回一个对象<br />
document.layers(objId);//通过对象id获取对象，这是Netscape支持的，返回一个对象<br />
window.objName;//通过对象名称获取对象，至少在ie中如此<br />
objName;//通过对象名称获取对象，至少在ie中如此<br />
2）页面内集合元素的定位方式<br />
我们知道在页面中有许多集合，例如form、frame、image等等，引用这些集合中某个对象的方式为，举其中一个为例，其它都差不多，以form为例：<br />
document.formName;//通过表单name获取表单对象<br />
document.forms[index];//通过索引获取表单对象，浏览器会按顺序将页面中所有的表单集合城数组，可以通过下标引用<br />
document.forms(formName);//通过表单name获取表单对象<br />
3）定位子窗口的方式（定位子窗口对象，不是标签对象，见前面3中的说明）<br />
子窗口是指页面中frame或iframe窗口，定位方式为：<br />
document.frames[index];//索引定位方式<br />
document.frames(frameName);//通过名称定位<br />
window.frameName;//通过名称定位<br />
frameName;//直接通过名称来定位<br />
4）在子定位父窗口的方式<br />
通过关键字parent来引用即可，同理parent.parent则表示父父窗口，top则表示最上层窗口。<br />
5）原窗口定位open弹出窗口的方式，例如下面代码：<br />
window.open("test.html");<br />
这里我们要知道window.open将会返回一个弹出窗口的句柄，即可以如下：<br />
var owin=window.open("test.html");<br />
owin即代码弹出窗口对象，通过改对象可以引用到弹出窗口的各个对象。<br />
6）原窗口定位showModalDialog弹出窗口的方式，例如：<br />
window.showModalDialog("test.html");<br />
注意showModalDialog与open不同，open弹出窗口后，window.open后面的代码可以继续执行，而showModalDialog弹出窗口后，原页面被阻塞，即window.showModalDialog后面的代码不被执行，直到用户关闭了弹出窗口才会继续往下执行，但这时因为已经关闭了弹出窗口，所以已经无法再对该窗口进行引用。<br />
7）open弹出的窗口对原窗口的定位方式，这个我们一般都知道，在弹出窗口中使用opener即可。<br />
8）showModalDialog弹出的窗口对原窗口的定位方式，这个不是使用opener，而应该在弹出窗口中使用parent。</p>
<p><strong>16，</strong>编写页面代码尽量使用标准的html、css和javascript，不要以为只要在ie上通过就可以了，要注意最近浏览器市场已经开始发生变化了，不知道你是否听说过Firefox2.0，它的用户量已经不在ie之下了，至少你的代码要在ie和Firefox上都通过才可以，另外现在linux越来越吃香，保不准几年后我们的许多客户都开始使用linux，到那个时候，我们将不得不对原来已经完成的项目进行维护，与其这样的后果，还不如从现在开始就使用标准为好，不要认为跨浏览器是很虚的话题，觉得没有必要，要知道这已经不是几年前了，现在形式和市场都在发生变化，我们的思想也该变一变了。</p>
<p><strong>17，</strong>我们的产品或OA系统往往会有许多模块，例如用户管理、发文流程、物品管理等等，我们在为这些模块命名时往往都是不太讲究的，没有注意名字的结构、字数等的统一，例如在个人事务模块下面有三个子模块，名称分别如下：待办事项、已办事项，维护个人信息。对于字数而言我们往往不会苛求太多，但是对于词的结构，我们还是要讲究的，例如上面的三个模块，前两个是名词结构，而后一个是谓词结构（动宾结构），这是不太妥当的，也许你觉得这有些吹毛求疵，当然大多数项目中不会要求这么严格，但是有些客户的确会有这样的要求，另外对我们自己而言，这也体现了我们做事认真、一丝不苟的品格和态度。</p>
<p><strong>18，</strong>图标与文字的配比要合适，这不仅要求图标能够正确显示文字的意思，而且还要求图标不能盖过文字的显示与含义，即图标太显眼而文字无足轻重的情况需要避免，例如下面的情况就是不太合适的：<br />
<img height="18" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq5.jpg" width="18" />&nbsp;用户管理<br />
之所以不合适，主要是因为图标的含义与用户管理关系不大，图标的含义更接近&#8220;XX编辑&#8221;的意思，和用户管理基本没有什么联系。</p>
<p><strong>19，</strong>在用户登录和表单处理页面，我们要处理用户按enter键的情况，即用户按enter键也要触发提交事件，不要只有用户点击&#8220;登录&#8221;或&#8220;提交&#8221;按钮才触发提交操作。</p>
<p><strong>20，</strong>如果我们在页面中使用&lt;a /&gt;标签，那么默认情况，当鼠标移到该链接时，鼠标自动会变为手的形状，许多时候我们希望鼠标移动到其它非链接的区域，也希望鼠标变为手的形状，我们一般的处理方式为在该区域的style中加入cursor属性，如下：<br />
&lt;span style="cursor:hand" onclick="myfunc()"&gt;下一页&lt;/span&gt;<br />
或者使用：<br />
&lt;span style="cursor:url('http://webme.bokee.com/inc/mouse118.cur')" onclick="myfunc()"&gt;下一页&lt;/span&gt;<br />
但是要注意，只有在ie中才支持cursor:hand，在firefox2.0中的cursor中是没有hand的，像wait、help等都是支持的，另外firefox中也不支持cursor:url方式。</p>
<p><strong>21，</strong>我们有时想通过javascript进行跨域页面的调用，不过出于安全性的考虑，各个浏览器一般都是不支持的，例如下面的代码：<br />
&lt;iframe src="<a href="http://www.google.com%22%3e%3c/iframe"><u><font color="#0000ff">http://www.google.com"&gt;&lt;/iframe</font></u></a>&gt;<br />
&lt;script&gt;<br />
&nbsp; setTimeout("document.frames[0].window.location.href",3000);<br />
&lt;/script&gt;<br />
使用setTimeout是为了可以让iframe子页面可以加载完毕，上面的调用会报安全性警告，例如在ie如下：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq6.gif" /><br />
<br />
那么是不是说只要是跨域就能不能进行javascript访问了呢？不是的，一种比较常用的办法就是设置document.domain属性，这种方式的描述如下：<br />
假设有两个页面<br />
test1.html 所在域：aaa.maindomain.com 访问协议：http 端口：8080<br />
test2.html 所在域：bbb.maindomain.com 访问协议：http 端口：8080<br />
满足上面条件的两个页面test1.html、test2.html是可以通过javascript相互访问的，上面的条件即为两个页面位于同一个基础域（例如上面同为maindomain.com），遵循同一个访问协议和端口（例如上面同为http 8080）。只要在这样的两个页面中都设置document.domain为所在基础域名，就可以相互调用了，例如：<br />
test1.html 所在域为aaa.mydomain.com<br />
&lt;script&gt;<br />
&nbsp; document.domain="mydomain.com";<br />
&lt;/script&gt;<br />
&lt;iframe src=http://bbb.mydomain.com/test2.html&gt;&lt;/iframe&gt;<br />
&lt;script&gt;<br />
&nbsp; setTimeout("document.frames[0].window.location.href",3000);<br />
&lt;/script&gt;<br />
test2.html 所在域为bbb.mydomain.com<br />
&lt;script&gt;<br />
&nbsp; document.domain="mydomain.com";<br />
&lt;/script&gt;<br />
...<br />
这样一来，test1.html的调用就是可以的了。一般来说跨域调用的场景发生在集团型企业项目或多机构的政务项目中，而对于这种类型的项目，它们的基础域基本上是相同的，只是三级域名不同，因此可以使用上面的方式来进行跨域调用。</p>
<p><strong>22，</strong>你会页面中的javascript调试吗？也许你还不会使用ie或firefox提供的页面调试器或插件，那么没有关系，至少你懂得一种最基本的调试：alert调试，不要认为这是一种很土或很傻的方式，很多时候这种方式都很非常有用的，对于一段很长的javascrip代码，从头到尾加入几个alert，那么立即就能定位错误的大概位置，当然使用调试器的断点也可以很快定位，只是说alert也是一种不错的方式。当然还是希望你能够掌握更为高级的调试器的使用，毕竟调试器带给我的功能更强大。</p>
<p><strong>23，</strong>我们许多时候编写完网页之后，发现最终的显示效果和我们想象的不太一样，这有些时候是由于浏览器的不同造成的，但除此之外，我们如何具体定位到底是页面的哪块代码导致不太理想的页面效果呢？当然你可能会使用Dreamweaver或Frontpage打开出问题的页面，然后查找原因，但是这些所见即所得的网页设计器，并非我们想象的那么完美，例如明明在设计器种预览很好的效果，到了真实环境中页面竟然出现了错位等等，这里和你介绍一种非常不错的css的调试方式，这里就不具体说了，请参看我新写过的一篇文章【<a id="CategoryEntryList.ascx_EntryStoryList_Entries_ctl01_TitleUrl" href="http://blog.csdn.net/eye_of_back/archive/2006/07/15/923320.aspx"><u><font color="#0000ff">css在html中的调试作用</font></u></a> 】</p>
<p><strong>24，</strong>网页打印我们都知道可以调用window.print函数，那么如果想打印iframe子窗口中页面呢，如果你只是获得子窗口对象，然后调用子窗口对象的print方法，此时打印机打印出却不是子窗口页面的内容，而是父窗口页面自身，为什么会这样呢？原来（至少在ie中如此）在父页面调用子窗口的print函数时，因为此时焦点还在父窗口之中，所以打印机此时会将获得焦点的窗口进行打印，我们在打印子窗口之前，只需做一件事即可完成对子窗口的打印，如下代码：<br />
&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp; &lt;script&gt;<br />
&nbsp;&nbsp;&nbsp; function myprint(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.frames("myframe").window.focus();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.frames("myframe").window.print();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp; &lt;/script&gt;<br />
&nbsp;&lt;/head&gt;<br />
&lt;body onload="myprint()"&gt;<br />
&nbsp; &lt;iframe name="myframe"&nbsp;src="test2.html"&gt;&lt;/iframe&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p><strong>25，</strong>网页切图许多人都习惯于网页三剑客的配合使用，网页三剑客就是网页开发者都熟悉的Dreamweaver、Fireworks和Flash，一般我们使用使用Flash或Fireworks将动画或图切分后输出成为html页面，然后通过Dreamweaver编辑输出后的页面，这是我们网页切图常用的配合方式，但是通过使用比较发现，在图片的切分方面，使用Photoshop要好于Fireworks，Photoshop不仅定位更加精确，而且由于自身是平面设计的标准，因此它提供了许多图片编辑的其它功能，这要比fireworks强大得多。目前专业的网页设计师都在开始或一直使用Photoshop进行网页设计并切分后输出成为HTML页面。如果你是三剑客的爱好者也没有关系，你可以使用一下看看效果如何，总之我从2000年就开始使用三剑客，现在才逐渐认识到Photoshop已经不仅仅是平面设计的标准了。</p>
<p><strong>26，</strong>在javascript中有一个方法可以列出当前对象所支持的所有属性、集合和事件，通过使用in关键字来实现，如下样例代码：<br />
var str="";<br />
for(var i in document){<br />
&nbsp;&nbsp;&nbsp; str+=i+"\n";<br />
}<br />
alert("document's all attributes:"+str);</p>
<p><strong>27，</strong>在一个名称为myform的表单中，含有一个名称为mychckbox的复选框，那么document.myform.mycheckbox所取到的是那个复选框对象，那么此时调用document.myform.mycheckbox.length是错误的，如果该表单中含有多个名称为mycheckbox的复选框，那么document.myform.mycheckbox返回的是一个数组，此时调用document.myform.mycheckbox.length就是正确的。单独说这个问题，可能感觉比较简单，但是在实际应用中我们经常会犯与此相关的错误，如下图所示：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq7.gif" /><br />
上图是我们在应用中经常遇到的&#8220;增、删、改&#8221;的逻辑，我们在其中经常会对复选框做操作，经常会使用类似document.myform.mycheckbox.length的方式，一般情况不会报错，这主要是因为在我们的列表中一般来说都不会只有一条记录，但是当列表中只有一条记录的时候（尽管这种时候不常见），这样引用就会报错，因为此时document.myform.mycheckbox返回的不是一个数组，则对length的引用就没有意义了，这种错误说起来很容易，但是在编程时往往就会忽略，因此在编程时我们建议如下方式：<br />
if(document.myform.mycheckbox.length){<br />
&nbsp; //...<br />
}else{<br />
&nbsp; //...<br />
}</p>
<p><strong>28，</strong>在ie中有一个很特别的css语法，如果你听说过，那说明你的积累真是太丰富了！在css中有一种给汉语注音的语法，如下所示：<br />
&lt;style&gt; <br />
&nbsp;&nbsp;&nbsp; ruby{font-size:13pt;}&nbsp;<br />
&nbsp;&nbsp;&nbsp; rt{font-size:18pt;color:red}<br />
&lt;/style&gt;<br />
&lt;ruby&gt;你知道这个语法吗？&lt;rt&gt;ni zhi dao zhe ge yu fa ma&lt;/rt&gt;&lt;br&gt;<br />
不知道&lt;rt&gt;bu zhi dao&lt;/rt&gt;&nbsp;&nbsp;&nbsp; <br />
&lt;/ruby&gt;<br />
你运行这段代码看看什么效果（要在ie中运行），我这里效果如下：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq8.gif" /></p>
<p><strong>29，</strong>我们项目中经常会遇到页面打印的需求，许多时候用户需要只打印页面某一部分，如果直接调用window.print则打印的是整个网页的内容。解决办法不外乎两种，第一种方式是将整个页面分为几个部分，将需要打印的部分放在其中的一个部分，然后定义onbeforeprint和onafterprint两个操作，即打印之前将不要打印的部分隐藏，打印之后将隐藏的部分显示，类似代码如下：<br />
&lt;script&gt;<br />
&nbsp;&nbsp; function beforePrint(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("hidden1").style.display="none";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("hidden2").style.display="none";<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; function afterPrint(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("hidden1").style.display="block";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("hidden2").style.display="block";<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; document.onbeforeprint=beforePrint;<br />
&nbsp;&nbsp; document.onafterprint=afterPrint;<br />
&lt;/script&gt;<br />
&lt;div id="hidden1" style="display:block"&gt;<br />
这里不需要打印<br />
&lt;/div&gt;<br />
&lt;div id="printDiv" style="display:block"&gt;<br />
这里需要打印<br />
&lt;/div&gt;<br />
&lt;div id="hidden2" style="display:block"&gt;<br />
这里不需要打印<br />
&lt;/div&gt;<br />
&lt;input type="button" value="打印" onclick="window.print()"/&gt;<br />
第二种方式是将需要打印的部分放到iframe之中，然后将焦点移到子窗口，然后调用子窗口的print方法即可。</p>
<p><strong>30，</strong>Javascript中的数组和我们一般的编程语言中的数组是不太一样，一般语言中数组的长度是固定的，有些语言中数组中的数据类型也要求是一样的，但是javascript数组却不受这些限制，在javascript中数组基本上是没有长度限制的，而且类型也没有限制，例如下面的一些使用方法：<br />
var arr=new Array();<br />
arr[1000]="ok";<br />
arr[300]=255;<br />
arr[200]=new Date();<br />
var date=arr[200];<br />
alert(date.getTime());<br />
因为数组的这种机制，我们可以使用数组实现许多数据结构，例如列表、哈西表等等。</p>
<p><strong>31，</strong>对于XML的处理一般情况下都是在服务器端处理的，例如在Java中有W3C、JDOM、XPath等许多xml的解析器，但是现在许多时候我们需要在浏览器端处理xml字符串，目前在ie和netscape中都有针对xml字符串的解析，如果你喜欢使用，也没有什么关系，不过对于Java程序员，我给你介绍一个完全按照W3C Document API实现的XML解析器，相信你会非常喜欢的，因为完全是Java的风格，请从&nbsp;<a href="http://download.jsjava.com/"><u><font color="#0000ff">http://download.jsjava.com</font></u></a> 下载jsjava0.91，在其中的src/jsorg/w3c/dom下有XML各个对象的实现，在页面中只需引用其中的xmlp.js和i18n.js即可，具体使用可以参考里面的例子：位于下载包的examples/XMLParser/XMLW3CParser下面，也可以直接访问：<a href="http://jsjava.sourceforge.net/examples/XMLParser/XMLW3CParser/W3CXMLParser.html"><u><font color="#0000ff">http://jsjava.sourceforge.net/examples/XMLParser/XMLW3CParser/W3CXMLParser.html</font></u></a>&nbsp;查看例子。</p>
<p><strong>32，</strong>一段文本的首行文本缩进两个汉字，这是中文段落的格式要求，我们可以通过在首行加入多个&amp;nbsp;来实现，不过还是建议使用css的标准属性text-indent，例如下面的代码：<br />
&lt;p style="text-indent:28;font-size:10pt"&gt;<br />
这是一段文本，请注意它的格式，&lt;br&gt;<br />
你看到了什么效果？如果你看到首行&lt;br&gt;<br />
缩进了，那么说明起作用了。<br />
&lt;/p&gt;<br />
显示效果如下：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq9.gif" /></p>
<p><strong>33，</strong>在Javascript中字符串的替换函数为<span class="mono">replace(<em>regexp</em>, <em>newSubStr</em>)，其中第一个参数是一个正则表达式，但是我们在实际使用中，往往习惯使用为一个字符串，这虽然不会报错，但是得到的结果往往是不正确的，例如下面的例子：<br />
var str=&#8220; abbbbacc&#8221;;<br />
var rs=str.replace(&#8220;a&#8221;,&#8221;0&#8221;);<br />
(A)0bbbbacc (B)0bbbb0cc<br />
正确答案是A，当然A可能不是你想要的结果，你想要的结果是字符串中所有的&#8220;a&#8221;都被替换为&#8220;0&#8221;，可是上面的使用方式只能将第一个&#8220;a&#8221;替换为&#8220;0&#8221;，正确的使用方式，在第一个参数中输入一个正则表达式，如下所示：<br />
var str=&#8220; abbbbacc&#8221;;<br />
var rs=str.replace(&#8220;/a/g&#8221;,&#8221;0&#8221;);//注意如果第一个参数为/a/，结果也是不正确的。<br />
(A)0bbbbacc (B)0bbbb0cc <br />
这样的话答案就是B了，如果你不明白/a/g是什么意思，那么你就需要对Javascript的正则表达式好好学习了，具体可以参看我以前写过的一篇文章：<a href="http://blog.csdn.net/eye_of_back/archive/2006/07/14/922667.aspx"><u><font color="#0000ff">http://blog.csdn.net/eye_of_back/archive/2006/07/14/922667.aspx</font></u></a></span></p>
<p><span class="mono"><strong>34，</strong>无论你使用的是ASP，还是PHP，或者JSP，都不建议在页面代码中夹杂着大量的业务逻辑代码。我们应该将业务逻辑代码封装到应用服务器层或者说业务层，web端只是进行调用。在JSP和PHP中我们可以将业务逻辑封装到BO（业务对象）中，由于支持类、接口等一套面向对象的机制，使得这种封装显得很容易，对于ASP，由于ASP.NET和C#的兴起，使得它对业务封装也变得相当方便。虽然我们都懂得服务器的三层架构，但是我们发现许多的项目之中，开发人员仍然在页面中直接编写业务逻辑，甚至直接访问数据库，面对这种情况，不能不说我们的项目管理是存在很大的问题的，我们的项目经理和程序设计师们，我们应该好好反思一下了。</span></p>
<p><span class="mono"><strong>35，</strong>有些时候我们在&lt;a/&gt;标签的href中直接加入javascript代码，通过window.open来打开一个自己可以控制许多属性的窗口，例如下面的代码：<br />
&lt;a href="javascript:window.open('http://www.google.com');"&gt;打开Google&lt;/a&gt;<br />
当我们点击链接后，确实弹出了Google的页面，但同时原页面却变为了下面的样子：<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/eye_of_back/web_tech_faq10.gif" /><br />
这种情况相信有些人遇到过，解决方式如下：<br />
&lt;a href="javascript:window.open('http://www.google.com');window.opener=null;window.close()"&gt;打开Google&lt;/a&gt;<br />
但是为什么前面的那种方式就会出现那种情况呢，其实只要做个简单实验就会明白了，你运行一下下面的代码，点击链接看看会出现什么结果：<br />
&lt;a href="javascript:window"&gt;打开Google&lt;/a&gt;<br />
实验后你会发现，点击链接后页面出现的结果与上面那种结果相同，然后你再实验一下下面的代码：<br />
&lt;a href="javascript:'test'"&gt;打开Google&lt;/a&gt;<br />
点击链接后，你会发现页面中会显示test字样。可见对于类似<br />
&lt;a href="javascript:js代码"&gt;点击&lt;/a&gt;<br />
的代码，如果js代码执行完毕后返回一个对象，那么页面内容会被冲掉，然后将该对象的描述输出到页面中，我们知道window.open方法返回的是弹出的页面的窗口对象（window），因此javascript:window.open将会在弹出一个窗口的同时，原页面会冲掉原有内容并将返回的window对象输出到原页面中。如果在window.open后面加入window.opener=null;window.close()，则弹出窗口后，返回给原页面的对象为空，则原页面不执行任何其它操作。</span></p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/153030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-15 17:18 <a href="http://www.blogjava.net/liuzheng/articles/153030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页中浮动对象总是显示在窗体的某个位子的javascript实现</title><link>http://www.blogjava.net/liuzheng/articles/150342.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 04 Oct 2007 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/150342.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/150342.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/150342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/150342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/150342.html</trackback:ping><description><![CDATA[网页中浮动对象总是显示在窗体的某个位子的javascript实现<br />
<br />
<br />
例子：<br />
<br />
<br />
&lt;script language="javascript"&gt;<br />
&nbsp;<br />
&nbsp;function dealScroll()<br />
&nbsp;{<br />
&nbsp;&nbsp;it.style.top=document.body.scrollTop+<span style="color: red">50</span>;//scrollTop表示的是：设置或获取位于<span replace="1">对象</span>最顶端和窗口中可见内容的最顶端之间的距离。<br />
&nbsp;&nbsp;it.style.left=document.body.scrollLeft;<br />
&nbsp;}<br />
&nbsp;&lt;/script&gt;<br />
&nbsp;&lt;body onscroll="dealScroll()" onselectstart="return false"&gt;<br />
&nbsp;&nbsp;&lt;textarea rows="500" cols="500" id="textarea"&gt;<br />
&nbsp;&nbsp;&lt;/textarea&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;a id=it href="#" style="position: absolute ;LEFT:0;TOP:<span style="color: red">50</span>"&gt;&nbsp;走&lt;/a&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;/body&gt;
<img src ="http://www.blogjava.net/liuzheng/aggbug/150342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-04 11:21 <a href="http://www.blogjava.net/liuzheng/articles/150342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript 中innerText,innerHTML,outerText,outerHTML之间的不同和区别</title><link>http://www.blogjava.net/liuzheng/articles/150336.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Thu, 04 Oct 2007 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/150336.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/150336.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/150336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/150336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/150336.html</trackback:ping><description><![CDATA[javascript 中innerText,innerHTML,outerText,outerHTML之间的不同和区别<br />
<br />
<br />
innerText是指设置和返回的是HTML元素的标签对之间的内容。如果设置值中包含其他的HTML标签，其他的HTML标签符号将作为普通文本显示在网页中。读取时，如果标签对之间的内容包含其他的标签，返回内容将<span style="color: red">不包括其他标签符号本身</span>。<br />
<br />
outerText与innerText不同的是包括设置和返回HTML元素的<span style="color: red">标签符号本身</span>和其中嵌套的内容。<br />
<br />
innerHTML也是设置和返回的是HTML元素的标签对之间的内容，但是如果设置值中包含其他的HTML标签，浏览器将按照这个被包含的<span style="color: red">HTML标签的意义控制文本在网页中的显示的效果</span>，读取该属性时，如果标签对之间的内容包含其他的标签，<span style="color: red">则将被包含的标签符号本身连同其他内容一起返回。<br />
</span><br />
outerHTML与innnerHTML不同的是包括设置和返回HTML元素的<span style="color: red">标签符号本身</span>和其中嵌套的内容<br />
<img src ="http://www.blogjava.net/liuzheng/aggbug/150336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-10-04 10:39 <a href="http://www.blogjava.net/liuzheng/articles/150336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript 中改变当前window和frame的page的方法</title><link>http://www.blogjava.net/liuzheng/articles/144273.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 11 Sep 2007 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/144273.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/144273.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/144273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/144273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/144273.html</trackback:ping><description><![CDATA[<br />
可以使用location<br />
<p class="docText">To load a different page into the current window or frame, assign the new page's URL string to the <tt>location.href</tt> property: </p>
<pre>location.href=<a href="http://www.megacorp.com/products/framistan309.html">http://www.megacorp.com/products/framistan309.html</a>;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>location是window对象和document对像的属性，所以window.location和document.location是相同的，可以相互使用</pre>
<img src ="http://www.blogjava.net/liuzheng/aggbug/144273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-09-11 15:36 <a href="http://www.blogjava.net/liuzheng/articles/144273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript中的事件处理</title><link>http://www.blogjava.net/liuzheng/articles/137814.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Sat, 18 Aug 2007 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/137814.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/137814.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/137814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/137814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/137814.html</trackback:ping><description><![CDATA[<pre>function submitViaEnter(evt) {
evt = (evt) ? evt : event;
var target = (evt.target) ? evt.target : evt.srcElement;
var form = target.form;
var charCode = (evt.charCode) ? evt.charCode :
((evt.which) ? evt.which : evt.keyCode);
if (charCode =  = 13 || charCode =  = 3) {
if (validateForm(form)) {
form.submit( );
return false;
}
}
return true;
} </pre>
<pre>NN4和IE有所不同所以先要判断evt是evt还是event</pre>
<pre>NN4中的目标元素为target，而IE4+中的目标元素为srcElement</pre>
<pre>这样写可以无论是IE还是NN，都可以接受。</pre>
<img src ="http://www.blogjava.net/liuzheng/aggbug/137814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-08-18 14:54 <a href="http://www.blogjava.net/liuzheng/articles/137814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ShowModelDialog的返回值的问题</title><link>http://www.blogjava.net/liuzheng/articles/135862.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Fri, 10 Aug 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/135862.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/135862.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/135862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/135862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/135862.html</trackback:ping><description><![CDATA[<p><em>window</em>.<strong>returnValue</strong> [ <strong>=</strong>&nbsp;<span class=clsRange>vValue</span> ]<br>Sets or retrieves the value returned from the modal dialog window<br><em><br>vReturnValue</em> = <em>window</em><strong>.showModalDialog(</strong><em>sURL</em><strong> [</strong><strong>, </strong><em>vArguments</em><strong>]</strong><strong> [</strong><strong>, </strong><em>sFeatures</em><strong>])<br><br>
<table class=clsStd>
    <tbody>
        <tr>
            <td><em>sURL</em></td>
            <td>Required. <strong>String</strong>&nbsp;that specifies the URL of the document to load and display.</td>
        </tr>
    </tbody>
</table>
<br></strong>Return Value</p>
<pre class=clsSyntax>
<p><strong>Variant. Returns the value of the </strong><a href="mk:@MSITStore:F:\学习内容\HTML学习\DHTML%20手册.chm::/DHTMLref/properties/returnvalue_0.html"><strong>returnValue</strong></a><strong> property as set by the window of the document specified in <em>sURL </em>.<br></strong></p>
也就是说window.returnValue可以设置模态对话框的返回值。 </pre>
<img src ="http://www.blogjava.net/liuzheng/aggbug/135862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-08-10 16:36 <a href="http://www.blogjava.net/liuzheng/articles/135862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>document.all[]的意思</title><link>http://www.blogjava.net/liuzheng/articles/135033.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 07 Aug 2007 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/135033.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/135033.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/135033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/135033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/135033.html</trackback:ping><description><![CDATA[<p>从IE4开始IE的object model才增加了document.all[],来看看document.all[]的Description:<br>Array of all HTML tags in the document.Collection of all elements contained by the object. <br>　　也就是说document.all[]是文档中所有标签组成的一个数组变量，包括了文档对象中所有元素（见例1）。</p>
<p>IE&#8217;s document.all collection exposes all document elements.This array provides access to every element in the document.</p>
<p>　　document.all[]这个数组可以访问文档中所有元素。</p>
<p>例1（这个可以让你理解文档中哪些是对象）</p>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"<br>"<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><u><font color=#0000ff>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</font></u></a>"&gt;<br>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml"><u><font color=#0000ff>http://www.w3.org/1999/xhtml</font></u></a>"&gt;<br>&lt;head&gt;<br>&lt;title&gt;Document.All Example&lt;/title&gt;<br>&lt;meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;h1&gt;Example Heading&lt;/h1&gt;<br>&lt;hr /&gt;<br>&lt;p&gt;This is a &lt;em&gt;paragraph&lt;/em&gt;. It is only a &lt;em&gt;paragraph.&lt;/em&gt;&lt;/p&gt;<br>&lt;p&gt;Yet another &lt;em&gt;paragraph.&lt;/em&gt;&lt;/p&gt;<br>&lt;p&gt;This final &lt;em&gt;paragraph&lt;/em&gt; has &lt;em id="special"&gt;special emphasis.&lt;/em&gt;&lt;/p&gt;<br>&lt;hr /&gt;<br>&lt;script type="text/javascript"&gt;<br>&lt;!--<br>var i,origLength;<br>origLength = document.all.length;<br>document.write('document.all.length='+origLength+"&lt;br /&gt;");<br>for (i = 0; i &lt; origLength; i++)<br>{<br>document.write("document.all["+i+"]="+document.all[i].tagName+"&lt;br /&gt;");<br>}<br>//--&gt;<br>&lt;/script&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p>
<p>　　它的执行结果是:</p>
<p>Example Heading</p>
<p>--------------------------------------------------------------------------------</p>
<p>This is a paragraph. It is only a paragraph.</p>
<p>Yet another paragraph.</p>
<p>This final paragraph has special emphasis.</p>
<p><br>--------------------------------------------------------------------------------<br>document.all.length=18<br>document.all[0]=!<br>document.all[1]=HTML<br>document.all[2]=HEAD<br>document.all[3]=TITLE<br>document.all[4]=META<br>document.all[5]=BODY<br>document.all[6]=H1<br>document.all[7]=HR<br>document.all[8]=P<br>document.all[9]=EM<br>document.all[10]=EM<br>document.all[11]=P<br>document.all[12]=EM<br>document.all[13]=P<br>document.all[14]=EM<br>document.all[15]=EM<br>document.all[16]=HR<br>document.all[17]=SCRIPT<br>(注意它只可以在IE上运行) <br>　　例2（访问一个特定元素）</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br>"<a href="http://www.w3.org/TR/html4/loose.dtd"><u><font color=#0000ff>http://www.w3.org/TR/html4/loose.dtd</font></u></a>"&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br>&lt;title&gt;单击DIV变色&lt;/title&gt;<br>&lt;style type="text/css"&gt;<br>&lt;!--<br>#docid{<br>height:400px;<br>width:400px;<br>background-color:#999;}<br>--&gt;<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;&lt;div id="docid" name="docname" onClick="bgcolor()"&gt;&lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>&lt;script language="javascript" type="text/javascript"&gt;<br>&lt;!--<br>function bgcolor(){<br>document.all[7].style.backgroundColor="#000"<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p>　　上面的这个例子让你了解怎么访问文档中的一个特定元素，比如文档中有一个DIV<br>&lt;div id="docid" name="docname"&gt;&lt;/div&gt;，你可以通过这个DIV的ID，NAME或INDEX属性访问这个DIV： </p>
<p>document.all["docid"]<br>document.all["docname"]<br>document.all.item("docid")<br>document.all.item("docname")<br>document.all[7]<br>document.all.tags("div")则返回文档中所有DIV数组，本例中只有一个DIV，所以用document.all.tags("div")[0]就可以访问了。</p>
<p>　　3、使用document.all[]</p>
<p>例3</p>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"<br>"<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><u><font color=#0000ff>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</font></u></a>"&gt;<br>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml"><u><font color=#0000ff>http://www.w3.org/1999/xhtml</font></u></a>"&gt;<br>&lt;head&gt;<br>&lt;title&gt;Document.All Example #2&lt;/title&gt;<br>&lt;meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;!-- Works in Internet Explorer and compatible --&gt;<br>&lt;h1 id="heading1" align="center" style="font-size: larger;"&gt;DHTML Fun!!!&lt;/h1&gt;<br>&lt;form name="testform" id="testform" action="#" method="get"&gt;<br>&lt;br /&gt;&lt;br /&gt;<br>&lt;input type="button" value="Align Left" <br>onclick="document.all['heading1'].align='left';" /&gt;//改变&lt;h1&gt;&lt;/h1&gt;标签对中的align属性的值,下面的代码作用相同<br>&lt;input type="button" value="Align Center"<br>onclick="document.all['heading1'].align='center';" /&gt;<br>&lt;input type="button" value="Align Right"<br>onclick="document.all['heading1'].align='right';" /&gt;<br>&lt;br /&gt;&lt;br /&gt;<br>&lt;input type="button" value="Bigger"<br>onclick="document.all['heading1'].style.fontSize='xx-large';" /&gt;<br>&lt;input type="button" value="Smaller"<br>onclick="document.all['heading1'].style.fontSize='xx-small';" /&gt;<br>&lt;br /&gt;&lt;br /&gt;<br>&lt;input type="button" value="Red"<br>onclick="document.all['heading1'].style.color='red';" /&gt;<br>&lt;input type="button" value="Blue"<br>onclick="document.all['heading1'].style.color='blue';" /&gt;<br>&lt;input type="button" value="Black"<br>onclick="document.all['heading1'].style.color='black';" /&gt;<br>&lt;br /&gt;&lt;br /&gt;<br>&lt;input type="text" name="userText" id="userText" size="30" /&gt;<br>&lt;input type="button" value="Change Text"<br>onclick="document.all['heading1'].innerText=document.testform.userText.value;" /&gt;//改变&lt;h1&gt;&lt;/h1&gt;标签对中的文本内容<br>&lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p>
<p>4、标准DOM中的访问方法 </p>
<p>　　开头就说过document.all[]不符合WEB标准，那用什么来替代它呢？document.getElementById</p>
<p><br>Most third-party browsers are &#8220;strict standards&#8221; implementations, meaning that they implement W3C and ECMA standards and ignore most of the proprietary object models of Internet Explorer and Netscape.If the demographic for your Web site includes users likely to use less common browsers, such as Linux aficionados, it might be a good idea to avoid IE-specific features and use the W3C DOM instead. by Internet Explorer 6, we see that IE implements significant portions of the W3C DOM.</p>
<p>　　这段话的意思是大多数第三方浏览器只支持W3C的DOM，如果你的网站用户使用其他的浏览器，那么你最好避免使用IE的私有属性。而且IE6也开始支持W3C　DOM。</p>
<p>毕竟大多数人还不了解标准，在使用标准前，你还可以在你的网页中用document.all[]访问文档对象前面写到WEB标准，今天继续WEB标准下 可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问DOCUMENT中的任一个标签：</p>
<p>　　1、getElementById()</p>
<p>　　getElementById()可以访问DOCUMENT中的某一特定元素，顾名思义，就是通过ID来取得元素，所以只能访问设置了ID的元素。</p>
<p>　　比如说有一个DIV的ID为docid：</p>
<p>&lt;div id="docid"&gt;&lt;/div&gt;</p>
<p>　　那么就可以用getElementById("docid")来获得这个元素。</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br>"<a href="http://www.w3.org/TR/html4/loose.dtd"><u><font color=#0000ff>http://www.w3.org/TR/html4/loose.dtd</font></u></a>"&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br>&lt;title&gt;ById&lt;/title&gt;<br>&lt;style type="text/css"&gt;<br>&lt;!--<br>#docid{<br>height:400px;<br>width:400px;<br>background-color:#999;}<br>--&gt;<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;&lt;div id="docid" name="docname" onClick="bgcolor()"&gt;&lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>&lt;script language="javascript" type="text/javascript"&gt;<br>&lt;!--<br>function bgcolor(){<br>document.getElementById("docid").style.backgroundColor="#000"<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p>　　2、getElementsByName()</p>
<p>　　这个是通过NAME来获得元素，但不知大家注意没有，这个是GET　ELEMENTS，复数ELEMENTS代表获得的不是一个元素，为什么呢？</p>
<p>　　因为DOCUMENT中每一个元素的ID是唯一的，但NAME却可以重复。打个比喻就像人的身份证号是唯一的（理论上，虽然现实中有重复），但 名字重复的却很多。如果一个文档中有两个以上的标签NAME相同，那么getElementsByName()就可以取得这些元素组成一个数组。</p>
<p>　　比如有两个DIV：</p>
<p>　　&lt;div name="docname" id="docid1"&gt;&lt;/div&gt;<br>　　&lt;div name="docname" id="docid2"&gt;&lt;/div&gt;</p>
<p>　　那么可以用getElementsByName("docname")获得这两个DIV，用getElementsByName("docname")[0]访问第一个DIV，用getElementsByName("docname")[1]访问第二个DIV。</p>
<p>　　下面这段话有错，请看forfor的回复，但是很可惜，IE没有支持这个方法，大家有兴趣可以在FIREFOX或NETSCAPE中调试下面这个例子。（我在NETSCAPE7.2英文版和FIREFOX1.0中调试成功。）</p>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><u><font color=#0000ff>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</font></u></a>"&gt;<br>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml"><u><font color=#0000ff>http://www.w3.org/1999/xhtml</font></u></a>"&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br>&lt;title&gt;Byname,tag&lt;/title&gt;<br>&lt;style type="text/css"&gt;<br>&lt;!--<br>#docid1,#docid2{<br>margin:10px;<br>height:400px;<br>width:400px;<br>background-color:#999;}<br>--&gt;<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;div name="docname" id="docid1" onClick="bgcolor()"&gt;&lt;/div&gt;<br>&lt;div name="docname" id="docid2" onClick="bgcolor()"&gt;&lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>&lt;script language="javascript" type="text/javascript"&gt;<br>&lt;!--<br>function bgcolor(){<br>var docnObj=document.getElementsByName("docname");<br>docnObj[0].style.backgroundColor = "black";<br>docnObj[1].style.backgroundColor = "black";<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p>　　3、getElementsByTagName() </p>
<p>　　这个呢就是通过TAGNAME（标签名称）来获得元素，一个DOCUMENT中当然会有相同的标签，所以这个方法也是取得一个数组。</p>
<p>　　下面这个例子有两个DIV，可以用getElementsByTagName("div")来访问它们，用getElementsByTagName("div")[0]访问第一个DIV，用</p>
<p>getElementsByTagName("div")[1]访问第二个DIV。</p>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><u><font color=#0000ff>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</font></u></a>"&gt;<br>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml"><u><font color=#0000ff>http://www.w3.org/1999/xhtml</font></u></a>"&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br>&lt;title&gt;Byname,tag&lt;/title&gt;<br>&lt;style type="text/css"&gt;<br>&lt;!--<br>#docid1,#docid2{<br>margin:10px;<br>height:400px;<br>width:400px;<br>background-color:#999;}<br>--&gt;<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;div name="docname" id="docid1" onClick="bgcolor()"&gt;&lt;/div&gt;<br>&lt;div name="docname" id="docid2" onClick="bgcolor()"&gt;&lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>&lt;script language="javascript" type="text/javascript"&gt;<br>&lt;!--<br>function bgcolor(){<br>var docnObj=document.getElementsByTagName("div");<br>docnObj[0].style.backgroundColor = "black";<br>docnObj[1].style.backgroundColor = "black";<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/135033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-08-07 19:08 <a href="http://www.blogjava.net/liuzheng/articles/135033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS的日期输入判断</title><link>http://www.blogjava.net/liuzheng/articles/135031.html</link><dc:creator>刘铮 </dc:creator><author>刘铮 </author><pubDate>Tue, 07 Aug 2007 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/liuzheng/articles/135031.html</guid><wfw:comment>http://www.blogjava.net/liuzheng/comments/135031.html</wfw:comment><comments>http://www.blogjava.net/liuzheng/articles/135031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuzheng/comments/commentRss/135031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuzheng/services/trackbacks/135031.html</trackback:ping><description><![CDATA[<p>var checkdate_rtn=false;//全局变量，日期检查不合法则不允许保存<br>function checkdate()<br>&nbsp; {<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;var datetime=document.all["signaltime"].value;<br>&nbsp; &nbsp;<br>&nbsp; &nbsp;var date=datetime.substring(0,8);<br>&nbsp; &nbsp;var time=datetime.substring(8,14);<br>&nbsp;&nbsp;&nbsp; var year=parseInt(datetime.substring(0,4));<br>&nbsp; &nbsp;var month=(datetime.substring(4,6));<br>&nbsp; &nbsp;var day=(datetime.substring(6,8));<br>&nbsp; &nbsp;var hour=(datetime.substring(8,10));<br>&nbsp; &nbsp;var min=(datetime.substring(10,12));<br>&nbsp; &nbsp;var sec=(datetime.substring(12,14));<br>&nbsp;if(datetime.length==14)//表示输入的日期长度要为14<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if(year&gt;1900&amp;&amp;year&lt;2099)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if(month&lt;13)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(hour&lt;24 &amp;&amp; min&lt;60 &amp;&amp; sec&lt;60)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(month==01||month==03||month==05||month==07||month==08||month==10||month==12)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(day&lt;32)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkdate_rtn=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(month==02&amp;&amp;(day&lt;30&amp;&amp;year%4==0)||(day&lt;29&amp;&amp;year%4!=0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkdate_rtn=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(month==04||month==06||month==09||month==11)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkdate_rtn=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp; }&nbsp;</p>
<img src ="http://www.blogjava.net/liuzheng/aggbug/135031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuzheng/" target="_blank">刘铮 </a> 2007-08-07 18:36 <a href="http://www.blogjava.net/liuzheng/articles/135031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>