﻿<?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-Tom-随笔-随笔分类-JavaScript</title><link>http://www.blogjava.net/43880800/category/18725.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 27 Jul 2007 20:10:08 GMT</lastBuildDate><pubDate>Fri, 27 Jul 2007 20:10:08 GMT</pubDate><ttl>60</ttl><item><title>JSP 中 AJAX 的表单提交中文问题的简单解决方案 - GBK 版本(引用) </title><link>http://www.blogjava.net/43880800/archive/2007/07/25/132313.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Wed, 25 Jul 2007 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/43880800/archive/2007/07/25/132313.html</guid><wfw:comment>http://www.blogjava.net/43880800/comments/132313.html</wfw:comment><comments>http://www.blogjava.net/43880800/archive/2007/07/25/132313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/43880800/comments/commentRss/132313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/43880800/services/trackbacks/132313.html</trackback:ping><description><![CDATA[<div style="FONT-SIZE: 10pt"><a id=viewpost1_TitleUrl href="http://www.blogjava.net/beansoft/archive/2006/12/31/91144.html">JSP 中 AJAX 的表单提交中文问题的简单解决方案 - GBK 版本(引用)</a> </div>
<p style="FONT-SIZE: 10pt">作者: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#101;&#97;&#110;&#115;&#111;&#102;&#116;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">beansoft@126.com</a> 2007.01.03</p>
<p style="FONT-SIZE: 10pt">下载本文源码: <a href="http://www.blogjava.net/Files/beansoft/ajaxform_gbk.zip">ajaxform_gbk.zip</a> 6KB<br></p>
转载请注明原创作者, 尊重他人劳动成果.
<p style="FONT-SIZE: 10pt">更新:<br>2007-01-03<br>修复了 AJAXFormer 中第二个参数 resultDiv 处理不当的问题;<br>增加了从服务器端返回脚本并加以执行的功能;<br>增加了表单提交后网络出错的错误显示功能.<br>这些新功能都已经放在示例页面中了.</p>
<p style="FONT-SIZE: 10pt">测试通过: Resin 3.0.18, Tomcat 5.0.30, 5.5.20; 浏览器: IE 6/Firefox 2.0.<br></p>
<p style="FONT-SIZE: 10pt">上一篇文章 <a href="http://www.blogjava.net/beansoft/archive/2006/12/25/89835.html">JSP 中 AJAX 的表单提交中文问题的简单解决方案</a> 主要是针对 UTF-8 版本的进行处理的, 鉴于中国大陆地区大部分还是用 GBK 编码写 JSP, 因此本文就针对 GBK 的实践结果进行介绍.</p>
<p style="FONT-SIZE: 10pt">有朋友提到 <a href="http://www.blogjava.net/errorfun/archive/2006/12/30/91000.html">当AJAX遭遇GBK的尴尬</a> 里说当 AJAX 使用 GBK 编码后, 表单提交将出现乱码. 如前文所述, 只要全部采用 UTF-8 编码, 是没有任何问题的. 那么都用 GBK 呢?</p>
<p style="FONT-SIZE: 10pt">首先要讲的是我们的文章还是一样的原则: 尽可能少的改动原来的代码来解决中文乱码问题. 所以本文的示例没有用过滤器等方法.</p>
<p style="FONT-SIZE: 10pt">那么使用 GBK 编码到底有没有乱码问题呢?</p>
<p style="FONT-SIZE: 10pt">第一个关键点就是 AJAX 的表单提交代码必须正确的按照 HTTP 规范实现, 即要保持原来的 GET/POST 方式不变, 也要保持里面的内容和浏览器提交的内容一摸一样. 以下内容摘自我编写的内部培训教材:</p>
<p style="FONT-SIZE: 10pt">----------------- 引用开始 -----------------</p>
<p style="FONT-SIZE: 10pt">首先必须要介绍一下 HTTP 协议和 GET, POST 的工作方式.</p>
<p style="FONT-SIZE: 10pt">当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.<br>随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:</p>
<table>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt">6KB<br></td>
        </tr>
    </tbody>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" width="100%">&lt; Method &gt; &lt; URL &gt; &lt; HTTP Version &gt; &lt;\n&gt;<br>{ &lt;Header&gt;:&lt;Value&gt; &lt;\n&gt;}*<br>&lt;\n&gt;<br>{ Entity Body }</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等.<br>在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行. 常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.<br>在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个\n之后是请求消息的消息实体(Entity Body).<br>Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:</p>
<table borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" width="100%">&lt; HTTP Version&gt; &lt;Status Code&gt; [&lt;Message&gt;]&lt;\n&gt;<br>{ &lt;Header&gt;:&lt;Value&gt; &lt;\n&gt; } *<br>&lt;\n&gt;<br>{ Entity Body }</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:<br></p>
<ul>
    <li>1XX 保留
    <li>2XX 表示成功
    <li>3XX 表示URL已经被移走
    <li>4XX 表示客户错误
    <li>5XX 表示服务器错误</li>
</ul>
<p style="FONT-SIZE: 10pt">例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.<br>在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.<br>下面是一个应答消息的例子:</p>
<table borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" width="100%">HTTP/1.0 200 OK<br>Date: Moday,07-Apr-97 21:13:02 GMT<br>Server:NCSA/1.1<br>MIME_Version:1.0<br>Content_Type:text/html<br>Last_Modified:Thu Dec 5 09:28:01 1996<br>Coentent_Length:3107<br><br>&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;...&lt;/HTML&gt;</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">那么 GET 和 POST 有什么区别? 区别就是一个在 URL 请求里面附带了表单参数和值, 一个是在 HTTP 请求的消息实体中. 用下面的例子可以很容易的看到同样的数据通过GET和POST来发送的区别, 发送的数据是 username=张三 :</p>
<p style="FONT-SIZE: 10pt">　GET 方式, 浏览器键入 http://localhost?username=张三<br></p>
<table borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" width="100%">GET /?username=%E5%BC%A0%E4%B8%89 HTTP/1.1<br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*<br>Accept-Language: zh-cn<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)<br>Host: localhost<br>Connection: Keep-Alive</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">POST 方式:</p>
<table borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt" width="100%">POST / HTTP/1.1<br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*<br>Accept-Language: zh-cn<br>Content-Type: application/x-www-form-urlencoded<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)<br>Host: localhost<br>Content-Length: 28<br>Connection: Keep-Alive<br><br>username=%E5%BC%A0%E4%B8%89</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">比较一下上面的两段文字, 您会发现 GET 方式把表单内容放在前面的请求头中, 而 POST 则把这些内容放在请求的主体中了, 同时 POST 中把请求的 Content-Type 头设置为 application/x-www-form-urlencoded. 而发送的正文都是一样的, 可以这样来构造一个表单提交正文:</p>
<p style="FONT-SIZE: 10pt">encodeURIComponent(arg1)=encodeURIComponent(value1)&amp;encodeURIComponent(arg2)=encodeURIComponent(value2)&amp;.....</p>
<p style="FONT-SIZE: 10pt">注: encodeURIComponent 返回一个包含了 charstring 内容的新的 String 对象（Unicode 格式）， 所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替，其中 xx 等于表示该字符的十六进制数。 例如，空格返回的是 "%20" 。 字符的值大于 255 的用 %uxxxx 格式存储。参见 JavaScript 的 encodeURIComponent() 方法.</p>
<p style="FONT-SIZE: 10pt">下面就讨论一下如何在 JavaScript 中执行一个 GET 或者 POST 请求. 如果您用过 Java, 那么您可能熟悉下列的用 java.net.URLConnection 类进行 POST 操作的代码(参考 <a href="http://www.javaworld.com/javatips/jw-javatip34.html">Java Tip 34: POSTing via Java</a> ):<br>　</p>
<table id=table1 borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt">URL url;<br>URLConnection urlConn;<br>DataOutputStream printout;<br>// URL of CGI-Bin or jsp, asp script.<br>url = new URL ("somepage");<br>// URL connection channel.<br>urlConn = url.openConnection();<br>// ......<br>// No caching, we want the real thing.<br>urlConn.setUseCaches (false);<br>// Specify the content type.<br>urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");<br>// Send POST output.<br>printout = new DataOutputStream (urlConn.getOutputStream ());<br>String content = "name=" + URLEncoder.encode ("Buford Early") + "&amp;email=" + URLEncoder.encode ("buford@known-space.com");<br>printout.writeBytes (content);<br>printout.flush ();<br>printout.close ();</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">以上的代码向 somepage 发送了一次 POST 请求, 数据为 name = Buford Early, email = buford@known-space.com.<br>用JavaScript 来执行 POST/GET 请求是同样的原理, 下面的代码展示了分别用 XMLHttpRequest 对象向 somepage 用 GET 和 POST 两种方式发送和上例相同的数据的具体过程:<br>GET 方式</p>
<table id=table2 borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt">var postContent =<br>"name=" + encodeURIComponent("Buford Early") + "&amp;email=" + encodeURIComponent("buford@known-space.com");<br>xmlhttp.open("GET", "somepage" + "?" + postContent, true);<br>xmlhttp.send(null);</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">POST 方式</p>
<table id=table3 borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt">var postContent =<br>"name=" + encodeURIComponent("Buford Early") + "&amp;email=" + encodeURIComponent("buford@known-space.com");<br>xmlhttp.open("POST", "somepage", true);<br>xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br>xmlhttp.send(postContent);</td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">至此希望你已经能够理解如何用 JavaScript 中的 XMLHttpRequest 对象来执行 GET/POST 操作, 剩下的工作就是您如何来构造这些提交的参数了, 最后我给出一个将现有的 form 提交代码修改为异步的 AJAX 提交的代码(注意目前作者还不知道如何让 file 上传表单域也能异步上传文件). 首先请看两个 JavaScript 函数:</p>
<table id=table4 borderColor=#000000 cellPadding=0 width="100%" bgColor=#ebe9ed border=1>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt">
            <pre xml:space="preserve">// form - the form to submit<br>// resultDivId - the division of which to display result text in, in null, then<br>// create an element and add it to the end of the body<br>function ajaxSubmitForm(form, resultDivId) {<br>var elements = form.elements;// Enumeration the form elements<br>var element;<br>var i;<br><br>var postContent = "";// Form contents need to submit<br><br>for(i=0;i&lt;elements.length;++i) {<br>var element=elements[i];<br><br>if(element.type=="text" || element.type=="textarea" || element.type=="hidden") {<br>postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&amp;";<br>}<br>else if(element.type=="select-one"||element.type=="select-multiple") {<br>var options=element.options,j,item;<br>for(j=0;j&lt;options.length;++j){<br>item=options[j];<br>if(item.selected) {<br>postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(item.value) + "&amp;";<br>}<br>}<br>} else if(element.type=="checkbox"||element.type=="radio") {<br>if(element.checked) {<br>postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&amp;";<br>}<br>} else if(element.type=="file") {<br>if(element.value != "") {<br>postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&amp;";<br>}<br>} else {<br>postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&amp;";<br>}<br>}<br><br>alert(postContent);<br><br>ajaxSubmit(form.action, form.method, postContent);<br>}<br><br>// url - the url to do submit<br>// method - "get" or "post"<br>// postContent - the string with values to be submited<br>// resultDivId - the division of which to display result text in, in null, then<br>// create an element and add it to the end of the body<br>function ajaxSubmit(url, method, postContent, resultDivId)<br>{<br>var loadingDiv = document.getElementById('loading');<br>// call in new thread to allow ui to update<br>window.setTimeout(function () {<br>loadingDiv.innerText = "Loading....";<br>loadingDiv.style.display = "";<br>}, 1);<br><br>// code for Mozilla, etc.<br>if (window.XMLHttpRequest)<br>{<br>xmlhttp=new XMLHttpRequest();<br>}<br>// code for IE<br>else if (window.ActiveXObject)<br>{<br>xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");<br>}<br><br>if(xmlhttp) {<br>xmlhttp.onreadystatechange = function() {<br>// if xmlhttp shows "loaded"<br>if (xmlhttp.readyState==4)<br>{<br>if(resultDivId) {<br>document.getElementByID(resultDivId).innerHTML = xmlhttp.responseText;<br>} else {<br>var result = document.createElement("DIV");<br>result.style.border="1px solid #363636";<br>result.innerHTML = xmlhttp.responseText;<br>document.body.appendChild(result);<br>}<br><br>loadingDiv.innerHTML =<br>"Submit finnished!";<br>}<br><br>};<br><br>if(method.toLowerCase() == "get") {<br>xmlhttp.open("GET", url + "?" + postContent, true);<br>xmlhttp.send(null);<br>} else if(method.toLowerCase() == "post") {<br>xmlhttp.open("POST", url, true);<br>xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");<br>xmlhttp.send(postContent);<br>}<br>} else {<br>loadingDiv.innerHTML =<br>"Can't create XMLHttpRequest object, please check your web browser.";<br>}<br><br>}</pre>
            </td>
        </tr>
    </tbody>
</table>
<p style="FONT-SIZE: 10pt">函数 ajaxSubmitForm 将表单要提交的内容进行封装, 然后调用 ajaxSubmit 函数来执行真正的异步提交, 表单提交后所返回的结果则显示在给定的 DIV 容器中或者没有指定参数时用 DOM 对象动态生成一个 DIV 容器来显示结果并添加到页面末尾. 这样, 对原来的表单只需要改动一个地方就可以将原来的表单提交改为异步模式, 即在 form 标签里加入: onSubmit="ajaxSubmitForm(this);return false;" 即可, return false 确保表单不会被浏览器同步提交. 完整的例子请看<a href="http://www.myjavaserver.com/%7Ebeansoft/ajax/ajax_form_submit.htm">这里</a>.</p>
<br>
<p style="FONT-SIZE: 10pt">----------------- 引用结束 -----------------</p>
<p style="FONT-SIZE: 10pt">OK, 希望至此为止您已经理解了如何用 AJAX 来正确的执行 GET/POST. 如果这个问题您解决了, 可是说后台的乱码问题就和你直接通过表单提交几乎没有区别了. 这个方法的具体封装已经在附件的 ajax_common.js 中了.</p>
<p style="FONT-SIZE: 10pt">至此也该贴出来我们的 GBK 编码的客户端页面的内容了:</p>
<br>
<div style="FONT-SIZE: 10pt">
<p style="FONT-SIZE: 10pt">&lt;html&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=gbk"&gt;<br>&lt;title&gt;AJAX Form Submit Test&lt;/title&gt;<br>&lt;script src='ajax_common.js'&gt;&lt;/script&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;/head&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;body&gt;<br>本页面的编码是中文.&lt;br/&gt;<br>&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=gbk"&amp;gt;&lt;br/&gt;<br>&lt;b&gt;测试过的服务器:&lt;/b&gt;&lt;br/&gt;<br>Resin 3.0.18&lt;br/&gt;<br>Tomcat 5.5.20&lt;br/&gt;<br>Tomcat 5.0.30&lt;br/&gt;<br>&lt;h3&gt;AJAX Form Submit Test&lt;/h3&gt;<br>Fill the form and then click submit&lt;br&gt;<br>提交方式: POST&lt;br&gt;<br>&lt;form method="POST" id="form1" name="form1"<br>action="form_action.jsp"<br>onSubmit="former.ajaxSubmitForm();return false;"&gt;<br>&lt;p&gt;&lt;input type="hidden" name="hidden1" value="hiddenValue"&gt;<br>text:&lt;input type="text" name="textf&amp;1" size="20" value="text文本&amp;amp;1"&gt;<br>checkbox:&lt;input type="checkbox" name="checkbox1" value="ON" checked&gt;<br>radio:&lt;input type="radio" value="V1" checked name="radio1"&gt;<br>select:&lt;select size="1" name="select1"&gt;<br>&lt;option selected value="option1"&gt;D1&lt;/option&gt;<br>&lt;/select&gt;<br>&lt;br&gt;<br>&lt;br&gt;<br>&lt;input type="submit" name="B1" value="submit"&gt;<br>&lt;input type="reset" name="B2" value="reset"&gt;<br>&lt;/p&gt;<br>&lt;/form&gt;</p>
<p style="FONT-SIZE: 10pt">提交方式: GET&lt;br&gt;<br>&lt;form method="GET" id="form2" name="form2"<br>action="form_action.jsp"<br>onSubmit="former2.ajaxSubmitForm();return false;"&gt;<br>&lt;p&gt;&lt;input type="hidden" name="hidden1" value="hiddenValue"&gt;<br>text:&lt;input type="text" name="text文本&amp;amp;2" size="20" value="text文本&amp;amp;2"&gt;<br>checkbox:&lt;input type="checkbox" name="checkbox1" value="ON" checked&gt;<br>radio:&lt;input type="radio" value="V1" checked name="radio1"&gt;<br>select:&lt;select size="1" name="select1"&gt;<br>&lt;option selected value="option1"&gt;D1&lt;/option&gt;<br>&lt;/select&gt;<br>&lt;br&gt;<br>&lt;br&gt;<br>&lt;input type="submit" name="B1" value="submit"&gt;<br>&lt;input type="reset" name="B2" value="reset"&gt;<br>&lt;/p&gt;<br>&lt;/form&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;div id="loading" style="display:none; position:absolute;<br>border:1px solid orange; height:20px; width:600; left: 93px; top: 112px;<br>background-color: #FFFFCC; cursor:pointer;" title="Click to hide" onClick="this.style.display='none';"&gt;&lt;/div&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;div id="resultDiv" style="border:1px solid orange; background-color: #FFFFCC; cursor:pointer;" title="Click to hide" onClick="this.style.display='none';"&gt;<br>Form 1 的提交结果将会显示在这里.<br>&lt;/div&gt;</p>
<p style="FONT-SIZE: 10pt"><br>&lt;script type="text/javascript"&gt;<br>var former = new AjaxFormer($('form1'), 'resultDiv');<br>var former2 = new AjaxFormer($('form2'));<br>&lt;/script&gt;<br>&lt;/body&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;/html&gt;</p>
</div>
可以看到我们的确使用的是 GBK 编码, 浏览器打开的时候自动选择的编码也是简体中文.<br>
<p style="FONT-SIZE: 10pt">那么第二个关键点就是服务器端的表单数据读取了.这个问题跟具体的服务器有很大关系. 对于 Resin 服务器来说, 问题很少, 基本上不论是 POST 和 GET, 出乱码的概率都比较小. 但是 Tomcat 就不敢恭维了, 这大概也是开源产品和商业产品的区别, 缺乏前后一致性和兼容性, 因为开源的不需要提供技术支持. Tomcat 的 GET/POST 的编码处理方式不同的版本都不一样, 就像 Eclipse/Netbeans 新版本从来不需要兼容老版本的插件 API 一样, Hibernate/Struts/Spring 也是一样, 所以学 Java 的很累. 当然, 这就是免费/开源的代价. 跑题了. 因此我们的服务器端代码大部分都是对 Tomcat 的乱码问题的解决(POST的没有问题, 主要是 GET 方法的).<br></p>
<div style="FONT-SIZE: 10pt">
<p style="FONT-SIZE: 10pt">&lt;%@ page contentType="text/html; charset=gbk" pageEncoding="gbk"%&gt;<br>&lt;html&gt;<br>&lt;%<br>//Send some headers to keep the user's browser from caching the response.<br>response.addHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT" );<br>response.addHeader("Last-Modified", new java.util.Date().toGMTString());<br>response.addHeader("Cache-Control", "no-cache, must-revalidate" );<br>response.addHeader("Pragma", "no-cache" );<br>// This will emulate a network delay, for 2 sec.<br>//Thread.currentThread().sleep(2000);</p>
<p style="FONT-SIZE: 10pt">request.setCharacterEncoding("utf-8");<br>%&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;%!</p>
<p style="FONT-SIZE: 10pt">/**<br>* 转换字符串的内码.<br>*<br>* @param input<br>* 输入的字符串<br>* @param sourceEncoding<br>* 源字符集名称<br>* @param targetEncoding<br>* 目标字符集名称<br>* @return 转换结果, 如果有错误发生, 则返回原来的值<br>*/<br>public static String changeEncoding(String input, String sourceEncoding,<br>String targetEncoding) {<br>if (input == null || input.equals("")) {<br>return input;<br>}</p>
<p style="FONT-SIZE: 10pt">try {<br>byte[] bytes = input.getBytes(sourceEncoding);<br>return new String(bytes, targetEncoding);<br>} catch (Exception ex) {<br>}<br>return input;<br>}</p>
<p style="FONT-SIZE: 10pt">/**<br>* 一个类似于 JavaScript 的 escape 函数的功能, 确保乱码可以正确传输.<br>*/<br>public static String escape(String src) {<br>int i;<br>char j;<br>StringBuffer tmp = new StringBuffer();<br>tmp.ensureCapacity(src.length() * 6);<br>for (i = 0; i &lt; src.length(); i++) {<br>j = src.charAt(i);<br>if (Character.isDigit(j) || Character.isLowerCase(j)<br>|| Character.isUpperCase(j))<br>tmp.append(j);<br>else if (j &lt; 256) {<br>tmp.append("%");<br>if (j &lt; 16)<br>tmp.append("0");<br>tmp.append(Integer.toString(j, 16));<br>} else {<br>tmp.append("%u");<br>tmp.append(Integer.toString(j, 16));<br>}<br>}<br>return tmp.toString();<br>}<br>%&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;head&gt;<br>&lt;title&gt;Test form action page&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>这是 GBK 编码版本的后台表单提交页面.&lt;br/&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;%<br>boolean isTomcat = application.getServerInfo().toLowerCase().indexOf("tomcat") != -1;<br>%&gt;</p>
<p style="FONT-SIZE: 10pt">Form submit method:&lt;%=request.getMethod()%&gt;&lt;br/&gt;<br>The form content u send is:&lt;br/&gt;<br>&lt;%<br>java.util.Enumeration e = request.getParameterNames();</p>
<p style="FONT-SIZE: 10pt">while (e.hasMoreElements()) {<br>String name = (String)e.nextElement();<br>String value = request.getParameter(name);</p>
<p style="FONT-SIZE: 10pt">if(isTomcat &amp;&amp; request.getMethod().equalsIgnoreCase("GET")) {<br>name = changeEncoding(name, "ISO8859-1", "UTF-8");<br>value = changeEncoding(value, "ISO8859-1", "UTF-8");<br>}<br>out.println("&lt;b&gt;" + name + "&lt;/b&gt; = " + value + "&lt;br/&gt;");<br>}</p>
<p style="FONT-SIZE: 10pt">// 给前台返回一个可以执行的脚本<br>//response.addHeader("response_script", changeEncoding("alert('提交完成');", "ISO8859-1", "UTF-8"));<br>response.addHeader("response_script", escape("alert('提交完成');"));<br>%&gt;</p>
<p style="FONT-SIZE: 10pt">&lt;/body&gt;<br>&lt;/html&gt;</p>
</div>
<p style="FONT-SIZE: 10pt">booleanisTomcat=application.getServerInfo().toLowerCase().indexOf("tomcat") !=-1; 这一句主要针对 Tomcat 进行处理, 如果是 GET 方法的话, 就需要将表单参数从 ISO8859-1 转换到 UTF-8 (注意不是 GBK, 貌似 Tomcat 很喜欢 UTF-8?). 其它的地方和原来的 UTF-8 版本的没有区别. 当然如果您的站点应该用过滤器来更方便的解决这个问题.<br></p>
<p style="FONT-SIZE: 10pt">小结:<br><br>1. 使用一致的字符集很重要, 要么全是 GBK, 要么全是 UTF-8, 如果有条件, 就全部用 UTF-8, 那样工作量是最小的;<br><br>2. 用 AJAX 提交的时候一定要按照 HTTP 的规范来, 做到和浏览器尽量兼容, 尤其是 POST 的时候不要再往 URL 地址里加参数了, 你那样是违规! 后果就是有的服务器会不搭理你传递的这些参数! 还是如我所讲, 参数提交之前要用 encodeURIComponent() 来转化, 这也是为了符合浏览器的习惯做法.<br><br>3. 后台如果读取参数有乱码, 就尽量多在 ISO8859-1, GBK, UTF-8 中间多转换几次试试, 可以试试偶写的那个 changeEncoding() 方法, 把几个转换后的表单值都列出来, 一定有一个是正确的, 总是可以解决问题的. 这个本来不应该是偶们的任务, 但是写服务器的人是老美, 尤其是 Tomcat 作者, 只熟悉 ISO8859-1.<br><br>4. 鉴于 TOMCAT 读取 POST 参数的时候很少出问题, 因此建议AJAX提交表单的时候多用 POST 方法, 尽量不用 GET.<br><br>运行截屏:</p>
<p style="FONT-SIZE: 10pt"><img alt=http://www.blogjava.net/images/blogjava_net/beansoft/18680/o_AJAX%20Form%20Submit%20GBK.png src="http://www.blogjava.net/images/blogjava_net/beansoft/18680/o_AJAX%20Form%20Submit%20GBK.png"></p>
<p style="FONT-SIZE: 10pt">其它的一些资料可以参考Blogjava上的一篇原创文章: <a href="http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html">[原创]struts,ajax乱码解决方案</a><br></p>
<p style="FONT-SIZE: 10pt">欢迎发表建议和更好的观点. 谢谢! 重申本文无意代替您的 AJAX 框架, 不过在你抓狂的时候可以考虑看看他们表单提交的代码, 改改它!<br><br>本人翻译的 XMLHttpRequest 对象介绍:</p>
<h2>The XMLHttpRequest Object Reference XMLHttpRequest 对象参考</h2>
<h3>Methods 方法</h3>
<table borderColor=#000000 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr vAlign=top>
            <th align=left width="45%">Method 方法</th>
            <th align=left width="55%">Description 描述</th>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">abort()</td>
            <td style="FONT-SIZE: 10pt">Cancels the current request<br>取消当前请求</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">getAllResponseHeaders()</td>
            <td style="FONT-SIZE: 10pt">Returns the complete set of http headers as a string<br>将完整的 HTTP 头部做为一个字符串返回</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">getResponseHeader("headername")</td>
            <td style="FONT-SIZE: 10pt">Returns the value of the specified http header<br>返回给定的 HTTP 头的值</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">open("method","URL",async,"uname","pswd")</td>
            <td style="FONT-SIZE: 10pt">Specifies the method, URL, and other optional attributes of a request
            <p style="FONT-SIZE: 10pt">The method parameter can have a value of "GET", "POST", or "PUT" (use "GET" when requesting data and use "POST" when sending data (especially if the length of the data is greater than 512 bytes.</p>
            <p style="FONT-SIZE: 10pt">The URL parameter may be either a relative or complete URL.</p>
            <p style="FONT-SIZE: 10pt">The async parameter specifies whether the request should be handled asynchronously or not. true means that script processing carries on after the send() method, without waiting for a response. false means that the script waits for a response before continuing script processing<br>指定表单提交方法, URL, 以及请求的可选属性<br><br>method 参数可以是"GET", "POST" 或者 "PUT" 这些值中之一(使用"GET"来请求数据, 特别的, 当发送的数据长度大于512字节时使用 "POST").<br><br>URL 参数可以为相对的和完整的 URL.<br><br>async 参数指定请求是否为异步方式处理. true 意味着调用 send() 方法后脚本继续向下执行, 不需要等待响应. false 意味着脚本将等待响应之后才能继续执行</p>
            </td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">send(content)</td>
            <td style="FONT-SIZE: 10pt">Sends the request<br>发送请求</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">setRequestHeader("label","value")</td>
            <td style="FONT-SIZE: 10pt">Adds a label/value pair to the http header to be sent<br>在要发送的 HTTP 头中添加 标签/取值</td>
        </tr>
    </tbody>
</table>
<h3>Properties 属性</h3>
<table borderColor=#000000 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr vAlign=top>
            <th align=left width="30%">Property 属性</th>
            <th align=left width="70%">Description 描述</th>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">onreadystatechange</td>
            <td style="FONT-SIZE: 10pt">An event handler for an event that fires at every state change<br>每次状态改变时除非的事件处理器</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">readyState</td>
            <td style="FONT-SIZE: 10pt">Returns the state of the object:
            <p style="FONT-SIZE: 10pt">0 = uninitialized<br>1 = loading<br>2 = loaded<br>3 = interactive<br>4 = complete<br>返回对象的状态<br><br>0 = 未初始化<br>1 = 载入中<br>2 = 已载入<br>3 = 交互<br>4 = 完成</p>
            </td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">responseText</td>
            <td style="FONT-SIZE: 10pt">Returns the response as a string<br>将响应做为字符串返回</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">responseXML</td>
            <td style="FONT-SIZE: 10pt">Returns the response as XML. This property returns an XML document object, which can be examined and parsed using W3C DOM node tree methods and properties<br>将响应做为XML返回. 这个属性返回一个 XML 文档对象, 可以用 W3C 的 DOM 节点树方法和属性进行检索分析</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">status</td>
            <td style="FONT-SIZE: 10pt">Returns the status as a number (e.g. 404 for "Not Found" or 200 for "OK")<br>将状态做为数字返回(例如 404 为"Not Found" 或者 200 为 "OK")</td>
        </tr>
        <tr vAlign=top>
            <td style="FONT-SIZE: 10pt">statusText</td>
            <td style="FONT-SIZE: 10pt">Returns the status as a string (e.g. "Not Found" or "OK")<br>将状态做为字符串返回(例如 "Not Found" 或者 "OK")</td>
        </tr>
    </tbody>
</table>
　<br>
<div style="FONT-SIZE: 10pt">posted on 2006-12-31 14:37 <a href="http://www.blogjava.net/beansoft/">BeanSoft</a> 阅读(2650) <a href="http://www.blogjava.net/beansoft/archive/2006/12/31/91144.aspx#Post">评论(6)</a> &nbsp;<a href="http://www.blogjava.net/beansoft/admin/EditPosts.aspx?postid=91144">编辑</a>&nbsp;<a href="http://www.blogjava.net/beansoft/AddToFavorite.aspx?id=91144">收藏</a> <a href="http://www.blogjava.net/beansoft/services/trackbacks/91144.aspx">引用</a> 所属分类: <a href="http://www.blogjava.net/beansoft/category/17587.html">Web</a> </div>
<img src ="http://www.blogjava.net/43880800/aggbug/132313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/43880800/" target="_blank">Tom</a> 2007-07-25 15:01 <a href="http://www.blogjava.net/43880800/archive/2007/07/25/132313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Coding JavaScript like(in) Java!  --DWR</title><link>http://www.blogjava.net/43880800/archive/2007/01/31/96853.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Wed, 31 Jan 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/43880800/archive/2007/01/31/96853.html</guid><wfw:comment>http://www.blogjava.net/43880800/comments/96853.html</wfw:comment><comments>http://www.blogjava.net/43880800/archive/2007/01/31/96853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/43880800/comments/commentRss/96853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/43880800/services/trackbacks/96853.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DWR						是一个开源的工具，她利用						Java						的反射和						AJAX						技术实现了						javascript						与						java						类的通信。官方网站是：														http://getahead.ltd.uk/dwr/																			...&nbsp;&nbsp;<a href='http://www.blogjava.net/43880800/archive/2007/01/31/96853.html'>阅读全文</a><img src ="http://www.blogjava.net/43880800/aggbug/96853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/43880800/" target="_blank">Tom</a> 2007-01-31 10:21 <a href="http://www.blogjava.net/43880800/archive/2007/01/31/96853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不间断滚动图片</title><link>http://www.blogjava.net/43880800/archive/2006/12/28/90501.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Thu, 28 Dec 2006 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/43880800/archive/2006/12/28/90501.html</guid><wfw:comment>http://www.blogjava.net/43880800/comments/90501.html</wfw:comment><comments>http://www.blogjava.net/43880800/archive/2006/12/28/90501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/43880800/comments/commentRss/90501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/43880800/services/trackbacks/90501.html</trackback:ping><description><![CDATA[offsetWidth是指物体可见宽度 <br />scrollLeft是指滚动滑块在滚动条上的位置 <br />&lt;!--对于此例,网页中一般会有三个容器,此处为demo,demo1和demo2;其中demo1和demo2均在demo中 <br />demo的overflow属性一般为hidden,我在这里用auto是为了方便你查看scrollLeft的状态, <br />另外为方便你理解scrollLeft和offsetWidth,我还在后面加了一个viewstatus函数,鼠标经过容器时会看到相关参数值 <br />//--&gt; <br />&lt;div id=demo style="width:200;overflow:auto"&gt; <br />&lt;table&gt;&lt;tr&gt; <br />&lt;td id=demo1&gt; <br />&lt;img src='a.gif' width=100&gt;&lt;img src='b.gif' width=100&gt;&lt;/td&gt; <br />&lt;td id=demo2&gt;&lt;/td&gt; <br />&lt;/tr&gt;&lt;/table&gt; <br />&lt;/div&gt; <br /><br />&lt;script&gt; <br />var speed=30 //定义速度,实指下面滚动函数的执行间隔,值越小滚动越快 <br />demo2.innerHTML=demo1.innerHTML //将demo1中的内容复制到demo2 <br />function Marquee(){ //开始定义滚动函数 <br />if(demo2.offsetWidth-demo.scrollLeft&lt;=0) <br />demo.scrollLeft-=demo1.offsetWidth //如果滑动块的位置大于demo2的宽度,滑动块退回一个demo2的宽度 <br />else{ <br />demo.scrollLeft++ //否则,滑动块向右滚动(图片向左滚) <br />} <br />}//滚动函数定义完 <br />var MyMar=setInterval(Marquee,speed) //设置定时器,使滚动函数每30毫秒运行一次 <br />demo.onmouseover=function() {clearInterval(MyMar);viewstatus();}//鼠标经过时,清除定时器,停止执行滚动函数,弹出信息; <br />demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}// 鼠标离开后,继续滚动 <br /><br />function viewstatus(){//这是我加的函数,很简单,不注释了 <br />mess="demo.scrollLeft:"+demo.scrollLeft+"\ndemo1.offsetWidth:"+demo1.offsetWidth+"\ndemo2.offsetWidth:"+demo2.offsetWidth; <br />alert(mess); <br />} <br />&lt;/script&gt; <img src ="http://www.blogjava.net/43880800/aggbug/90501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/43880800/" target="_blank">Tom</a> 2006-12-28 15:18 <a href="http://www.blogjava.net/43880800/archive/2006/12/28/90501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Window.Open详解</title><link>http://www.blogjava.net/43880800/archive/2006/12/27/90199.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Tue, 26 Dec 2006 19:00:00 GMT</pubDate><guid>http://www.blogjava.net/43880800/archive/2006/12/27/90199.html</guid><wfw:comment>http://www.blogjava.net/43880800/comments/90199.html</wfw:comment><comments>http://www.blogjava.net/43880800/archive/2006/12/27/90199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/43880800/comments/commentRss/90199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/43880800/services/trackbacks/90199.html</trackback:ping><description><![CDATA[
		<p>
				<strong>Window.Open详解</strong>
		</p>
		<div style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word">
				<p>
						<strong>Window.Open详解</strong>
						<br />
				</p>
				<p>一、window.open()支持环境：<br />JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+<br /><br />二、基本语法：<br />window.open(pageURL,name,parameters) <br />其中：<br />pageURL 为子窗口路径 <br />name 为子窗口句柄 <br />parameters 为窗口参数(各参数用逗号分隔) <br /><br />三、示例：<br />&lt;SCRIPT&gt; <br />&lt;!-- <br />window.open ('page.html','newwindow','height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no') <br />//写成一行 <br />--&gt; <br />&lt;/SCRIPT&gt;<br /><br /><br />　　脚本运行后，page.html将在新窗体newwindow中打开，宽为100，高为400，距屏顶0象素，屏左0象素，无工具条，无菜单条，无滚动条，不可调整大小，无地址栏，无状态栏。请对照。<br />　　上例中涉及的为常用的几个参数，除此以外还有很多其他参数，请见四。<br /><br />四、各项参数<br />　　其中yes/no也可使用1/0；pixel value为具体的数值，单位象素。<br /><br />参数 | 取值范围 | 说明 <br /><br />alwaysLowered | yes/no | 指定窗口隐藏在所有窗口之后 <br />alwaysRaised | yes/no | 指定窗口悬浮在所有窗口之上 <br />depended | yes/no | 是否和父窗口同时关闭 <br />directories | yes/no | Nav2和3的目录栏是否可见 <br />height | pixel value | 窗口高度 <br />hotkeys | yes/no | 在没菜单栏的窗口中设安全退出热键 <br />innerHeight | pixel value | 窗口中文档的像素高度 <br />innerWidth | pixel value | 窗口中文档的像素宽度 <br />location | yes/no | 位置栏是否可见 <br />menubar | yes/no | 菜单栏是否可见 <br />outerHeight | pixel value | 设定窗口(包括装饰边框)的像素高度 <br />outerWidth | pixel value | 设定窗口(包括装饰边框)的像素宽度 <br />resizable | yes/no | 窗口大小是否可调整 <br />screenX | pixel value | 窗口距屏幕左边界的像素长度 <br />screenY | pixel value | 窗口距屏幕上边界的像素长度 <br />scrollbars | yes/no | 窗口是否可有滚动栏 <br />titlebar | yes/no | 窗口题目栏是否可见 <br />toolbar | yes/no | 窗口工具栏是否可见 <br />Width | pixel value | 窗口的像素宽度 <br />z-look | yes/no | 窗口被激活后是否浮在其它窗口之上<br /><br />=====================================================<br /><br />【1、最基本的弹出窗口代码】 <br />　　其实代码非常简单： <br />&lt;SCRIPT LANGUAGE="javascript"&gt; <br />&lt;!-- <br />window.open ('page.html') <br />--&gt; <br />&lt;/SCRIPT&gt; <br /><br />　　因为着是一段javascripts代码，所以它们应该放在&lt;SCRIPT LANGUAGE="javascript"&gt;标签和&lt;/script&gt;之间。&lt;!-- 和 --&gt;是对一些版本低的浏览器起作用，在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。 <br />　　Window.open ('page.html') 用于控制弹出新的窗口page.html，如果page.html不与主窗口在同一路径下，前面应写明路径，绝对路径(<a href="http://)/" target="_blank"><font color="#0000ff">http://)</font></a>和相对路径(../)均可。用单引号和双引号都可以，只是不要混用。 <br />　　这一段代码可以加入HTML的任意位置，&lt;head&gt;和&lt;/head&gt;之间可以，&lt;body&gt;间&lt;/body&gt;也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。 <br /><br />【2、经过设置后的弹出窗口】 <br /><br />　　下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。 <br />　　我们来定制这个弹出的窗口的外观，尺寸大小，弹出的位置以适应该页面的具体情况。 <br />&lt;SCRIPT LANGUAGE="javascript"&gt; <br />&lt;!-- <br />window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no') <br />//写成一行 <br />--&gt; <br />&lt;/SCRIPT&gt; <br /><br />参数解释： <br />&lt;SCRIPT LANGUAGE="javascript"&gt; js脚本开始； <br />window.open 弹出新窗口的命令； <br />'page.html' 弹出窗口的文件名； <br />'newwindow' 弹出窗口的名字（不是文件名），非必须，可用空''代替； <br />height=100 窗口高度； <br />width=400 窗口宽度； <br />top=0 窗口距离屏幕上方的象素值； <br />left=0 窗口距离屏幕左侧的象素值； <br />toolbar=no 是否显示工具栏，yes为显示； <br />menubar，scrollbars 表示菜单栏和滚动栏。 <br />Resizable=no 是否允许改变窗口大小，yes为允许； <br />location=no 是否显示地址栏，yes为允许； <br />status=no 是否显示状态栏内的信息（通常是文件已经打开），yes为允许； <br />&lt;/SCRIPT&gt; js脚本结束 <br /><br />【3、用函数控制弹出窗口】 <br /><br />　　下面是一个完整的代码。<br /><br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;script LANGUAGE="JavaScript"&gt; <br />&lt;!-- <br />function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br />//写成一行 <br />} <br />//--&gt; <br />&lt;/script&gt; <br />&lt;/head&gt; <br />&lt;body onload="openwin()"&gt; <br />…任意的页面内容… <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。 <br />怎么调用呢？ <br />方法一：&lt;body onload="openwin()"&gt; 浏览器读页面时弹出窗口； <br />方法二：&lt;body onunload="openwin()"&gt; 浏览器离开页面时弹出窗口； <br />方法三：用一个连接调用： <br />&lt;a href="#" onclick="openwin()"&gt;打开一个窗口&lt;/a&gt; <br />注意：使用的"#"是虚连接。 <br />方法四：用一个按钮调用： <br />&lt;input type="button" onclick="openwin()" value="打开窗口"&gt; <br /><br />【4、同时弹出2个窗口】 <br /><br />　　对源代码稍微改动一下：<br /><br />&lt;script LANGUAGE="JavaScript"&gt; <br />&lt;!-- <br />function openwin() <br />{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br />//写成一行 <br />window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") <br />//写成一行 <br />} <br />//--&gt; <br />&lt;/script&gt; <br /><br />　　为避免弹出的2个窗口覆盖，用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。 <br />注意：2个窗口的name(newwindows和newwindow2)不要相同，或者干脆全部为空。OK？ <br /><br />【5、主窗口打开文件1.htm，同时弹出小窗口page.html】 <br /><br />　　如下代码加入主窗口&lt;head&gt;区：<br /><br />&lt;script language="javascript"&gt; <br />&lt;!-- <br />function openwin() <br />{window.open("page.html","","width=200,height=200") <br />} <br />//--&gt; <br />&lt;/script&gt; <br /><br />　　加入&lt;body&gt;区： <br />&lt;a href="1.htm" onclick="openwin()"&gt;open&lt;/a&gt;即可。 <br /><br />【6、弹出的窗口之定时关闭控制】 <br /><br />　　下面我们再对弹出的窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中，可不是主页面中，否则…)，让它10秒后自动关闭是不是更酷了？ <br />　　首先，将如下代码加入page.html文件的&lt;head&gt;区：<br /><br />&lt;script language="JavaScript"&gt; <br />function closeit() <br />{setTimeout("self.close()",10000) //毫秒} <br />&lt;/script&gt; <br /><br />　　然后，再用&lt;body onload="closeit()"&gt; 这一句话代替page.html中原有的&lt;BODY&gt;这一句就可以了。(这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。) <br /><br />【7、在弹出窗口中加上一个关闭按钮】 <br />&lt;FORM&gt; <br />&lt;INPUT TYPE='BUTTON' VALUE='关闭' onClick='window.close()'&gt; <br />&lt;/FORM&gt; <br /><br />　　呵呵，现在更加完美了！ <br /><br />【8、内包含的弹出窗口-一个页面两个窗口】 <br /><br />　　上面的例子都包含两个窗口，一个是主窗口，另一个是弹出的小窗口。 <br />　　通过下面的例子，你可以在一个页面内完成上面的效果。 <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;SCRIPT LANGUAGE="JavaScript"&gt; <br />function openwin() <br />{OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no"); <br />//写成一行 <br />OpenWindow.document.write("&lt;TITLE&gt;例子&lt;/TITLE&gt;") <br />OpenWindow.document.write("&lt;BODY BGCOLOR=#ffffff&gt;") <br />OpenWindow.document.write("&lt;h1&gt;Hello!&lt;/h1&gt;") <br />OpenWindow.document.write("New window opened!") <br />OpenWindow.document.write("&lt;/BODY&gt;") <br />OpenWindow.document.write("&lt;/HTML&gt;") <br />OpenWindow.document.close()} <br />&lt;/SCRIPT&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;a href="#" onclick="openwin()"&gt;打开一个窗口&lt;/a&gt; <br />&lt;input type="button" onclick="openwin()" value="打开窗口"&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />　　看看 OpenWindow.document.write()里面的代码不就是标准的HTML吗？只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。 <br /><br />【9、终极应用--弹出的窗口之Cookie控制】 <br /><br />　　回想一下，上面的弹出窗口虽然酷，但是有一点小毛病(沉浸在喜悦之中，一定没有发现吧？)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页)，那么每次刷新这个页面，窗口都会弹出一次，是不是非常烦人？:-(有解决的办法吗？Yes! ;-) Follow me. <br />　　我们使用cookie来控制一下就可以了。<br />　　首先，将如下代码加入主页面HTML的&lt;HEAD&gt;区： <br />&lt;script&gt; <br />function openwin() <br />{window.open("page.html","","width=200,height=200")} <br />function get_cookie(Name) <br />{var search = Name + "=" <br />var returnvalue = ""; <br />if (document.cookie.length &gt; 0) { <br />offset = document.cookie.indexOf(search) <br />if (offset != -1) { <br />offset += search.length <br />end = document.cookie.indexOf(";", offset); <br />if (end == -1) <br />end = document.cookie.length; <br />returnvalue=unescape(document.cookie.substring(offset,end)) <br />} <br />} <br />return returnvalue; <br />} <br />function loadpopup(){ <br />if (get_cookie('popped')==''){ <br />openwin() <br />document.cookie="popped=yes" <br />} <br />} <br />&lt;/script&gt; <br /><br />　　然后，用&lt;body onload="loadpopup()"&gt;（注意不是openwin而是loadpop啊！）替换主页面中原有的&lt;BODY&gt;这一句即可。你可以试着刷新一下这个页面或重新进入该页面，窗口再也不会弹出了。真正的Pop-Only-Once！ <br />　　写到这里弹出窗口的制作和应用技巧基本上算是完成了，需要注意的是，JS脚本中的的大小写最好前后保持一致。</p>
		</div>
<img src ="http://www.blogjava.net/43880800/aggbug/90199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/43880800/" target="_blank">Tom</a> 2006-12-27 03:00 <a href="http://www.blogjava.net/43880800/archive/2006/12/27/90199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>页面自动关闭代码</title><link>http://www.blogjava.net/43880800/archive/2006/12/27/90197.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Tue, 26 Dec 2006 18:47:00 GMT</pubDate><guid>http://www.blogjava.net/43880800/archive/2006/12/27/90197.html</guid><wfw:comment>http://www.blogjava.net/43880800/comments/90197.html</wfw:comment><comments>http://www.blogjava.net/43880800/archive/2006/12/27/90197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/43880800/comments/commentRss/90197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/43880800/services/trackbacks/90197.html</trackback:ping><description><![CDATA[
		<p align="center">
				<strong>
						<font size="4">页面自动关闭代码</font>
				</strong>
		</p>
		<p>&lt;script language="javascript"&gt; </p>
		<p>function closeit() { </p>
		<p>setTimeout("self.close()",5000) //毫秒 </p>
		<p>} </p>
		<p>&lt;/script&gt;</p>
		<p>
				<br />//以上代码放入需要自动关闭的目标网页的&lt;head&gt;&lt;/head&gt;之间</p>
<img src ="http://www.blogjava.net/43880800/aggbug/90197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/43880800/" target="_blank">Tom</a> 2006-12-27 02:47 <a href="http://www.blogjava.net/43880800/archive/2006/12/27/90197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>