??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩一区亚洲二区,精品中国亚洲,亚洲 国产 日韩 综合一区 http://www.aygfsteel.com/43880800/category/18725.htmlzh-cn Fri, 27 Jul 2007 20:10:08 GMT Fri, 27 Jul 2007 20:10:08 GMT 60 JSP ?AJAX 的表单提交中文问题的单解x?- GBK 版本(引用) http://www.aygfsteel.com/43880800/archive/2007/07/25/132313.htmlTom Tom Wed, 25 Jul 2007 07:01:00 GMT http://www.aygfsteel.com/43880800/archive/2007/07/25/132313.html http://www.aygfsteel.com/43880800/comments/132313.html http://www.aygfsteel.com/43880800/archive/2007/07/25/132313.html#Feedback 0 http://www.aygfsteel.com/43880800/comments/commentRss/132313.html http://www.aygfsteel.com/43880800/services/trackbacks/132313.html JSP ?AJAX 的表单提交中文问题的单解x?- GBK 版本(引用)
作? beansoft@126.com 2007.01.03
下蝲本文源码: ajaxform_gbk.zip 6KB
转蝲h明原创作? 重他h力_成果.
更新: 2007-01-03 修复?AJAXFormer 中第二个参数 resultDiv 处理不当的问? 增加了从服务器端q回脚本q加以执行的功能; 增加了表单提交后|络出错的错误显C功? q些新功能都已经攑֜CZ面中了.
试通过: Resin 3.0.18, Tomcat 5.0.30, 5.5.20; 览? IE 6/Firefox 2.0.
上一文?JSP ?AJAX 的表单提交中文问题的单解x?/a> 主要是针?UTF-8 版本的进行处理的, 鉴于中国大陆地区大部分还是用 GBK ~码?JSP, 因此本文针?GBK 的实늻果进行介l?
有朋友提?当AJAX遭遇GBK的尴?/a> 里说?AJAX 使用 GBK ~码? 表单提交出Cؕ? 如前文所q? 只要全部采用 UTF-8 ~码, 是没有Q何问题的. 那么都用 GBK ?
首先要讲的是我们的文章还是一L原则: 可能少的改动原来的代码来解决中文ؕ码问? 所以本文的CZ没有用过滤器{方?
那么使用 GBK ~码到底有没有ؕ码问题呢?
W一个关键点是 AJAX 的表单提交代码必L的按照 HTTP 规范实现, 卌保持原来?GET/POST 方式不变, 也要保持里面的内容和览器提交的内容一怸? 以下内容摘自我编写的内部培训教材:
----------------- 引用开?-----------------
首先必须要介l一?HTTP 协议?GET, POST 的工作方?
当用户在Web览器地址栏中输入一个带有http://前缀的URLq按下Enter?或者在Web面中某个以http://开头的链接上单击鼠标,HTTP事务处理的第一个阶D?-建立q接阶段开始了.HTTP的默认端口是80. 随着q接的徏?HTTPp入了客户向服务器发送请求的阶段.客户向服务器发送的h是一个有特定格式的ASCII消息,其语法规则ؓ:
6KB
< Method > < URL > < HTTP Version > <\n> { <Header>:<Value> <\n>}* <\n> { Entity Body }
h消息的顶端是h?用于指定Ҏ(gu),URL和HTTP协议的版?h行的最后是回R换行.Ҏ(gu)有GET,POST,HEAD,PUT,DELETE{? 在请求行之后是若q个报头(Header)?每个报头行都是由一个报头和一个取值构成的二元?报头和取g间以":"分隔;报头行的最后是回R换行. 常见的报头有Accept(指定MIME媒体cd),Accept_Charset(响应消息的编码方?,Accept_Encoding(响应消息的字W集),User_Agent(用户的浏览器信息){? 在请求消息的报头行之后是一个回车换?表明h消息的报头部分结?在这个\n之后是请求消息的消息实体(Entity Body). Web服务器在收到客户hq作出处理之?要向客户发送应{消?与请求消息一?应答消息的语法规则ؓ:
< HTTP Version> <Status Code> [<Message>]<\n> { <Header>:<Value> <\n> } * <\n> { Entity Body }
应答消息的第一行ؓ状态行,其中包括了HTTP版本?状态码和对状态码q行短解释的消息;状态行的最后是回R换行.状态码?位数字组??c?
1XX 保留
2XX 表示成功
3XX 表示URL已经被移?
4XX 表示客户错误
5XX 表示服务器错?/li>
例如:415,表示不支持改媒体cd;503,表示服务器不能访?最常见的是200,表示成功.常见的报头有:Last_Modified(最后修Ҏ(gu)?,Content_Type(消息内容的MIMEcd),Content_Length(内容长度){? 在报头行之后也是一个回车换?用以表示应答消息的报头部分的l束,以及应答消息实体的开? 下面是一个应{消息的例子:
HTTP/1.0 200 OK Date: Moday,07-Apr-97 21:13:02 GMT Server:NCSA/1.1 MIME_Version:1.0 Content_Type:text/html Last_Modified:Thu Dec 5 09:28:01 1996 Coentent_Length:3107 <HTML><HEAD><TITLE>...</HTML>
那么 GET ?POST 有什么区? 区别是一个在 URL h里面附带了表单参数和? 一个是?HTTP h的消息实体中. 用下面的例子可以很容易的看到同样的数据通过GET和POST来发送的区别, 发送的数据?username=张三 :
GET 方式, 览器键?http://localhost?username=张三
GET /?username=%E5%BC%A0%E4%B8%89 HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) Host: localhost Connection: Keep-Alive
POST 方式:
POST / HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) Host: localhost Content-Length: 28 Connection: Keep-Alive username=%E5%BC%A0%E4%B8%89
比较一下上面的两段文字, (zhn)会发现 GET 方式把表单内Ҏ(gu)在前面的h头中, ?POST 则把q些内容攑֜h的主体中? 同时 POST 中把h?Content-Type 头设|ؓ application/x-www-form-urlencoded. 而发送的正文都是一L, 可以q样来构造一个表单提交正?
encodeURIComponent(arg1)=encodeURIComponent(value1)&encodeURIComponent(arg2)=encodeURIComponent(value2)&.....
? encodeURIComponent q回一个包含了 charstring 内容的新?String 对象QUnicode 格式Q, 所有空根{标炏V重音符号以及其他非 ASCII 字符都用 %xx ~码代替Q其?xx {于表示该字W的十六q制数?例如Q空D回的?"%20" ?字符的值大?255 的用 %uxxxx 格式存储。参?JavaScript ?encodeURIComponent() Ҏ(gu).
下面pZ下如何在 JavaScript 中执行一?GET 或?POST h. 如果(zhn)用q?Java, 那么(zhn)可能熟(zhn)下列的?java.net.URLConnection c进?POST 操作的代?参?Java Tip 34: POSTing via Java ):
URL url; URLConnection urlConn; DataOutputStream printout; // URL of CGI-Bin or jsp, asp script. url = new URL ("somepage"); // URL connection channel. urlConn = url.openConnection(); // ...... // No caching, we want the real thing. urlConn.setUseCaches (false); // Specify the content type. urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // Send POST output. printout = new DataOutputStream (urlConn.getOutputStream ()); String content = "name=" + URLEncoder.encode ("Buford Early") + "&email=" + URLEncoder.encode ("buford@known-space.com"); printout.writeBytes (content); printout.flush (); printout.close ();
以上的代码向 somepage 发送了一?POST h, 数据?name = Buford Early, email = buford@known-space.com. 用JavaScript 来执?POST/GET h是同L原理, 下面的代码展CZ分别?XMLHttpRequest 对象?somepage ?GET ?POST 两种方式发送和上例相同的数据的具体q程: GET 方式
var postContent = "name=" + encodeURIComponent("Buford Early") + "&email=" + encodeURIComponent("buford@known-space.com"); xmlhttp.open("GET", "somepage" + "?" + postContent, true); xmlhttp.send(null);
POST 方式
var postContent = "name=" + encodeURIComponent("Buford Early") + "&email=" + encodeURIComponent("buford@known-space.com"); xmlhttp.open("POST", "somepage", true); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send(postContent);
x希望你已l能够理解如何用 JavaScript 中的 XMLHttpRequest 对象来执?GET/POST 操作, 剩下的工作就是?zhn)如何来构造这些提交的参数? 最后我l出一个将现有?form 提交代码修改为异步的 AJAX 提交的代?注意目前作者还不知道如何让 file 上传表单域也能异步上传文?. 首先L两个 JavaScript 函数:
// form - the form to submit // resultDivId - the division of which to display result text in, in null, then // create an element and add it to the end of the body function ajaxSubmitForm(form, resultDivId) { var elements = form.elements;// Enumeration the form elements var element; var i; var postContent = "";// Form contents need to submit for(i=0;i<elements.length;++i) { var element=elements[i]; if(element.type=="text" || element.type=="textarea" || element.type=="hidden") { postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&"; } else if(element.type=="select-one"||element.type=="select-multiple") { var options=element.options,j,item; for(j=0;j<options.length;++j){ item=options[j]; if(item.selected) { postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(item.value) + "&"; } } } else if(element.type=="checkbox"||element.type=="radio") { if(element.checked) { postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&"; } } else if(element.type=="file") { if(element.value != "") { postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&"; } } else { postContent += encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value) + "&"; } } alert(postContent); ajaxSubmit(form.action, form.method, postContent); } // url - the url to do submit // method - "get" or "post" // postContent - the string with values to be submited // resultDivId - the division of which to display result text in, in null, then // create an element and add it to the end of the body function ajaxSubmit(url, method, postContent, resultDivId) { var loadingDiv = document.getElementById('loading'); // call in new thread to allow ui to update window.setTimeout(function () { loadingDiv.innerText = "Loading...."; loadingDiv.style.display = ""; }, 1); // code for Mozilla, etc. if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } // code for IE else if (window.ActiveXObject) { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if(xmlhttp) { xmlhttp.onreadystatechange = function() { // if xmlhttp shows "loaded" if (xmlhttp.readyState==4) { if(resultDivId) { document.getElementByID(resultDivId).innerHTML = xmlhttp.responseText; } else { var result = document.createElement("DIV"); result.style.border="1px solid #363636"; result.innerHTML = xmlhttp.responseText; document.body.appendChild(result); } loadingDiv.innerHTML = "Submit finnished!"; } }; if(method.toLowerCase() == "get") { xmlhttp.open("GET", url + "?" + postContent, true); xmlhttp.send(null); } else if(method.toLowerCase() == "post") { xmlhttp.open("POST", url, true); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send(postContent); } } else { loadingDiv.innerHTML = "Can't create XMLHttpRequest object, please check your web browser."; } }
函数 ajaxSubmitForm 表单要提交的内容进行封? 然后调用 ajaxSubmit 函数来执行真正的异步提交, 表单提交后所q回的结果则昄在给定的 DIV 容器中或者没有指定参数时?DOM 对象动态生成一?DIV 容器来显C结果ƈd到页面末? q样, 对原来的表单只需要改动一个地方就可以原来的表单提交改ؓ异步模式, 卛_ form 标签里加? onSubmit="ajaxSubmitForm(this);return false;" 卛_, return false 保表单不会被浏览器同步提交. 完整的例子请?a >q里.
----------------- 引用l束 -----------------
OK, 希望x为止(zhn)已l理解了如何?AJAX 来正的执行 GET/POST. 如果q个问题(zhn)解决了, 可是说后台的q问题和你直接通过表单提交几乎没有区别? q个Ҏ(gu)的具体封装已l在附g?ajax_common.js 中了.
x也该贴出来我们的 GBK ~码的客L面的内容了:
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <title>AJAX Form Submit Test</title> <script src='ajax_common.js'></script>
</head>
<body> 本页面的~码是中?<br/> <meta http-equiv="Content-Type" content="text/html; charset=gbk"><br/> <b>试q的服务?</b><br/> Resin 3.0.18<br/> Tomcat 5.5.20<br/> Tomcat 5.0.30<br/> <h3>AJAX Form Submit Test</h3> Fill the form and then click submit<br> 提交方式: POST<br> <form method="POST" id="form1" name="form1" action="form_action.jsp" onSubmit="former.ajaxSubmitForm();return false;"> <p><input type="hidden" name="hidden1" value="hiddenValue"> text:<input type="text" name="textf&1" size="20" value="text文本&1"> checkbox:<input type="checkbox" name="checkbox1" value="ON" checked> radio:<input type="radio" value="V1" checked name="radio1"> select:<select size="1" name="select1"> <option selected value="option1">D1</option> </select> <br> <br> <input type="submit" name="B1" value="submit"> <input type="reset" name="B2" value="reset"> </p> </form>
提交方式: GET<br> <form method="GET" id="form2" name="form2" action="form_action.jsp" onSubmit="former2.ajaxSubmitForm();return false;"> <p><input type="hidden" name="hidden1" value="hiddenValue"> text:<input type="text" name="text文本&2" size="20" value="text文本&2"> checkbox:<input type="checkbox" name="checkbox1" value="ON" checked> radio:<input type="radio" value="V1" checked name="radio1"> select:<select size="1" name="select1"> <option selected value="option1">D1</option> </select> <br> <br> <input type="submit" name="B1" value="submit"> <input type="reset" name="B2" value="reset"> </p> </form>
<div id="loading" style="display:none; position:absolute; border:1px solid orange; height:20px; width:600; left: 93px; top: 112px; background-color: #FFFFCC; cursor:pointer;" title="Click to hide" onClick="this.style.display='none';"></div>
<div id="resultDiv" style="border:1px solid orange; background-color: #FFFFCC; cursor:pointer;" title="Click to hide" onClick="this.style.display='none';"> Form 1 的提交结果将会显C在q里. </div>
<script type="text/javascript"> var former = new AjaxFormer($('form1'), 'resultDiv'); var former2 = new AjaxFormer($('form2')); </script> </body>
</html>
可以看到我们的确使用的是 GBK ~码, 览器打开的时候自动选择的编码也是简体中?
那么W二个关键点是服务器端的表单数据读取了.q个问题跟具体的服务器有很大关系. 对于 Resin 服务器来? 问题很少, 基本上不论是 POST ?GET, Zؕ码的概率都比较小. 但是 Tomcat ׃敢恭l了, q大概也是开源品和商业产品的区? ~Z前后一致性和兼容? 因ؓ开源的不需要提供技术支? Tomcat ?GET/POST 的编码处理方式不同的版本都不一? 像 Eclipse/Netbeans 新版本从来不需要兼容老版本的插g API 一? Hibernate/Struts/Spring 也是一? 所以学 Java 的很? 当然, q就是免?开源的代h(hun). 跑题? 因此我们的服务器端代码大部分都是?Tomcat 的ؕ码问题的解决(POST的没有问? 主要?GET Ҏ(gu)?.
<%@ page contentType="text/html; charset=gbk" pageEncoding="gbk"%> <html> <% //Send some headers to keep the user's browser from caching the response. response.addHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT" ); response.addHeader("Last-Modified", new java.util.Date().toGMTString()); response.addHeader("Cache-Control", "no-cache, must-revalidate" ); response.addHeader("Pragma", "no-cache" ); // This will emulate a network delay, for 2 sec. //Thread.currentThread().sleep(2000);
request.setCharacterEncoding("utf-8"); %>
<%!
/** * 转换字符串的内码. * * @param input * 输入的字W串 * @param sourceEncoding * 源字W集名称 * @param targetEncoding * 目标字符集名U?br>* @return 转换l果, 如果有错误发? 则返回原来的?br>*/ public static String changeEncoding(String input, String sourceEncoding, String targetEncoding) { if (input == null || input.equals("")) { return input; }
try { byte[] bytes = input.getBytes(sourceEncoding); return new String(bytes, targetEncoding); } catch (Exception ex) { } return input; }
/** * 一个类g JavaScript ?escape 函数的功? 保q可以正确传输. */ public static String escape(String src) { int i; char j; StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length() * 6); for (i = 0; i < src.length(); i++) { j = src.charAt(i); if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) tmp.append(j); else if (j < 256) { tmp.append("%"); if (j < 16) tmp.append("0"); tmp.append(Integer.toString(j, 16)); } else { tmp.append("%u"); tmp.append(Integer.toString(j, 16)); } } return tmp.toString(); } %>
<head> <title>Test form action page</title> </head> <body> q是 GBK ~码版本的后台表单提交页?<br/>
<% boolean isTomcat = application.getServerInfo().toLowerCase().indexOf("tomcat") != -1; %>
Form submit method:<%=request.getMethod()%><br/> The form content u send is:<br/> <% java.util.Enumeration e = request.getParameterNames();
while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = request.getParameter(name);
if(isTomcat && request.getMethod().equalsIgnoreCase("GET")) { name = changeEncoding(name, "ISO8859-1", "UTF-8"); value = changeEncoding(value, "ISO8859-1", "UTF-8"); } out.println("<b>" + name + "</b> = " + value + "<br/>"); }
// l前台返回一个可以执行的脚本 //response.addHeader("response_script", changeEncoding("alert('提交完成');", "ISO8859-1", "UTF-8")); response.addHeader("response_script", escape("alert('提交完成');")); %>
</body> </html>
booleanisTomcat=application.getServerInfo().toLowerCase().indexOf("tomcat") !=-1; q一句主要针?Tomcat q行处理, 如果?GET Ҏ(gu)的话, 需要将表单参数?ISO8859-1 转换?UTF-8 (注意不是 GBK, 貌似 Tomcat 很喜?UTF-8?). 其它的地方和原来?UTF-8 版本的没有区? 当然如果(zhn)的站点应该用过滤器来更方便的解册个问?
结: 1. 使用一致的字符集很重要, 要么全是 GBK, 要么全是 UTF-8, 如果有条? 全部用 UTF-8, 那样工作量是最的; 2. ?AJAX 提交的时候一定要按照 HTTP 的规范来, 做到和浏览器量兼容, 其?POST 的时候不要再往 URL 地址里加参数? 你那hq规! 后果是有的服务器会不搭理你传递的q些参数! q是如我所? 参数提交之前要用 encodeURIComponent() 来{? q也是ؓ了符合浏览器的习惯做? 3. 后台如果d参数有ؕ? 尽量多?ISO8859-1, GBK, UTF-8 中间多{换几ơ试? 可以试试偶写的那?changeEncoding() Ҏ(gu), 把几个{换后的表单值都列出? 一定有一个是正确? L可以解决问题? q个本来不应该是偶们的Q? 但是写服务器的h是老美, 其?Tomcat 作? 只熟(zhn)?ISO8859-1. 4. 鉴于 TOMCAT d POST 参数的时候很出问题, 因此AJAX提交表单的时候多?POST Ҏ(gu), 量不用 GET. q行截屏:
其它的一些资料可以参考Blogjava上的一原创文? [原创]struts,ajaxq解决Ҏ(gu)
Ƣ迎发表和更好的观点. 谢谢! 重申本文无意代替(zhn)的 AJAX 框架, 不过在你抓狂的时候可以考虑看看他们表单提交的代? Ҏ(gu)? 本h译?XMLHttpRequest 对象介绍:
The XMLHttpRequest Object Reference XMLHttpRequest 对象参?/h2>
Methods Ҏ(gu)
Method Ҏ(gu)
Description 描述
abort()
Cancels the current request 取消当前h
getAllResponseHeaders()
Returns the complete set of http headers as a string 完整的 HTTP 头部做ؓ一个字W串q回
getResponseHeader("headername")
Returns the value of the specified http header q回l定?HTTP 头的?/td>
open("method","URL",async,"uname","pswd")
Specifies the method, URL, and other optional attributes of a request
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.
The URL parameter may be either a relative or complete URL.
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 指定表单提交Ҏ(gu), URL, 以及h的可选属?br> method 参数可以?GET", "POST" 或?"PUT" q些g之一(使用"GET"来请求数? 特别? 当发送的数据长度大于512字节时?"POST"). URL 参数可以为相对的和完整的 URL. async 参数指定h是否为异步方式处? true 意味着调用 send() Ҏ(gu)后脚本l向下执? 不需要等待响? false 意味着脚本等待响应之后才能l执?/p>
send(content)
Sends the request 发送请?/td>
setRequestHeader("label","value")
Adds a label/value pair to the http header to be sent 在要发送的 HTTP 头中d 标签/取?/td>
Properties 属?/h3>
Property 属?/th>
Description 描述
onreadystatechange
An event handler for an event that fires at every state change 每次状态改变时除非的事件处理器
readyState
Returns the state of the object:
0 = uninitialized 1 = loading 2 = loaded 3 = interactive 4 = complete q回对象的状?br> 0 = 未初始化 1 = 载入?br>2 = 已蝲?br>3 = 交互 4 = 完成
responseText
Returns the response as a string 响应做为字W串q回
responseXML
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 响应做为XMLq回. q个属性返回一?XML 文对象, 可以?W3C ?DOM 节点树方法和属性进行检索分?/td>
status
Returns the status as a number (e.g. 404 for "Not Found" or 200 for "OK") 状态做为数字返?例如 404 ?Not Found" 或?200 ?"OK")
statusText
Returns the status as a string (e.g. "Not Found" or "OK") 状态做为字W串q回(例如 "Not Found" 或?"OK")
]]>Coding JavaScript like(in) Java! --DWR http://www.aygfsteel.com/43880800/archive/2007/01/31/96853.htmlTom Tom Wed, 31 Jan 2007 02:21:00 GMT http://www.aygfsteel.com/43880800/archive/2007/01/31/96853.html http://www.aygfsteel.com/43880800/comments/96853.html http://www.aygfsteel.com/43880800/archive/2007/01/31/96853.html#Feedback 0 http://www.aygfsteel.com/43880800/comments/commentRss/96853.html http://www.aygfsteel.com/43880800/services/trackbacks/96853.html 阅读全文 ]]> 不间断滚动图?/title> http://www.aygfsteel.com/43880800/archive/2006/12/28/90501.htmlTom Tom Thu, 28 Dec 2006 07:18:00 GMT http://www.aygfsteel.com/43880800/archive/2006/12/28/90501.html http://www.aygfsteel.com/43880800/comments/90501.html http://www.aygfsteel.com/43880800/archive/2006/12/28/90501.html#Feedback 0 http://www.aygfsteel.com/43880800/comments/commentRss/90501.html http://www.aygfsteel.com/43880800/services/trackbacks/90501.html scrollLeft是指滚动滑块在滚动条上的位置 <!--对于此例,|页中一般会有三个容?此处为demo,demo1和demo2;其中demo1和demo2均在demo? demo的overflow属性一般ؓhidden,我在q里用auto是ؓ了方便你查看scrollLeft的状? 另外为方便你理解scrollLeft和offsetWidth,我还在后面加了一个viewstatus函数,鼠标l过容器时会看到相关参数? //--> <div id=demo style="width:200;overflow:auto"> <table><tr> <td id=demo1> <img src='a.gif' width=100><img src='b.gif' width=100></td> <td id=demo2></td> </tr></table> </div> <script> var speed=30 //定义速度,实指下面滚动函数的执行间?D滚动越? demo2.innerHTML=demo1.innerHTML //demo1中的内容复制到demo2 function Marquee(){ //开始定义滚动函? if(demo2.offsetWidth-demo.scrollLeft<=0) demo.scrollLeft-=demo1.offsetWidth //如果滑动块的位置大于demo2的宽?滑动块退回一个demo2的宽? else{ demo.scrollLeft++ //否则,滑动块向x?囄向左? } }//滚动函数定义? var MyMar=setInterval(Marquee,speed) //讄定时?使滚动函数每30毫秒q行一? demo.onmouseover=function() {clearInterval(MyMar);viewstatus();}//鼠标l过?清除定时?停止执行滚动函数,弹出信息; demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}// 鼠标d?l箋滚动 function viewstatus(){//q是我加的函?很简?不注释了 mess="demo.scrollLeft:"+demo.scrollLeft+"\ndemo1.offsetWidth:"+demo1.offsetWidth+"\ndemo2.offsetWidth:"+demo2.offsetWidth; alert(mess); } </script> ]]> Window.Open详解 http://www.aygfsteel.com/43880800/archive/2006/12/27/90199.htmlTom Tom Tue, 26 Dec 2006 19:00:00 GMT http://www.aygfsteel.com/43880800/archive/2006/12/27/90199.html http://www.aygfsteel.com/43880800/comments/90199.html http://www.aygfsteel.com/43880800/archive/2006/12/27/90199.html#Feedback 0 http://www.aygfsteel.com/43880800/comments/commentRss/90199.html http://www.aygfsteel.com/43880800/services/trackbacks/90199.html
Window.Open详解
Window.Open详解
一、window.open()支持环境Q?br />JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二、基本语法: window.open(pageURL,name,parameters) 其中Q?br />pageURL 为子H口路径 name 为子H口句柄 parameters 为窗口参?各参数用逗号分隔) 三、示例: <SCRIPT> <!-- 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 />--> </SCRIPT> 脚本q行后,page.html在新窗体newwindow中打开Q宽?00Q高?00Q距屏顶0象素Q屏?象素Q无工具条,无菜单条Q无滚动条,不可调整大小Q无地址栏,无状态栏。请对照?br /> 上例中涉及的为常用的几个参数Q除此以外还有很多其他参敎ͼ误四?br /> 四、各参?br /> 其中yes/no也可使用1/0Qpixel value为具体的数|单位象素?br /> 参数 | 取D图b| 说明 alwaysLowered | yes/no | 指定H口隐藏在所有窗口之后?br />alwaysRaised | yes/no | 指定H口(zhn)Q在所有窗口之上?br />depended | yes/no | 是否和父H口同时关闭 directories | yes/no | Nav2?的目录栏是否可见 height | pixel value | H口高度 hotkeys | yes/no | 在没菜单栏的H口中设安全退出热键?br />innerHeight | pixel value | H口中文档的像素高度 innerWidth | pixel value | H口中文的像素宽度 location | yes/no | 位置栏是否可见?br />menubar | yes/no | 菜单栏是否可见?br />outerHeight | pixel value | 讑֮H口(包括装饰Ҏ(gu))的像素高度?br />outerWidth | pixel value | 讑֮H口(包括装饰Ҏ(gu))的像素宽度?br />resizable | yes/no | H口大小是否可调敾b?br />screenX | pixel value | H口距屏q左边界的像素长度?br />screenY | pixel value | H口距屏q上边界的像素长度?br />scrollbars | yes/no | H口是否可有滚动栏?br />titlebar | yes/no | H口题目栏是否可见?br />toolbar | yes/no | H口工具栏是否可见?br />Width | pixel value | H口的像素宽度?br />z-look | yes/no | H口被激zd是否在其它H口之上 ===================================================== ?、最基本的弹出窗口代码】?br /> 其实代码非常单: <SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.html') --> </SCRIPT> 因ؓ着是一Djavascripts代码Q所以它们应该放?lt;SCRIPT LANGUAGE="javascript">标签?lt;/script>之间?lt;!-- 和?->是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作ؓ文本昄出来。要Lq个好习惯啊。?br /> Window.open ('page.html') 用于控制弹出新的H口page.htmlQ如果page.html不与ȝ口在同一路径下,前面应写明\径,l对路径(http://) 和相对\?../)均可。用单引号和双引号都可以Q只是不要用。?br /> q一D代码可以加入HTML的Q意位|,<head>?lt;/head>之间可以Q?lt;body>?lt;/body>也可以,前早执行Q尤其是面代码长,又想佉K面早点弹出就量往前放。?br /> ?、经q设|后的弹出窗口】?br /> 下面再说一说弹出窗口的讄。只要再往上面的代码中加一点东西就可以了。?br /> 我们来定制这个弹出的H口的外观,寸大小Q弹出的位置以适应该页面的具体情况。?br /><SCRIPT LANGUAGE="javascript"> <!-- 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 />--> </SCRIPT> 参数解释Q?br /><SCRIPT LANGUAGE="javascript"> js脚本开始; window.open 弹出新窗口的命oQ?br />'page.html' 弹出H口的文件名Q?br />'newwindow' 弹出H口的名字(不是文g名)Q非必须Q可用空''代替Q?br />height=100 H口高度Q?br />width=400 H口宽度Q?br />top=0 H口距离屏幕上方的象素| left=0 H口距离屏幕左侧的象素| toolbar=no 是否昄工具栏,yes为显C; menubarQscrollbars 表示菜单栏和滚动栏。?br />Resizable=no 是否允许改变H口大小Qyes为允许; location=no 是否昄地址栏,yes为允许; status=no 是否昄状态栏内的信息Q通常是文件已l打开Q,yes为允许; </SCRIPT> js脚本l束 ?、用函数控制弹出H口】?br /> 下面是一个完整的代码?br /> <html> <head> <script LANGUAGE="JavaScript"> <!-- function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") //写成一行?br />} //--> </script> </head> <body onload="openwin()"> …Q意的面内容…?br /></body> </html> q里定义了一个函数openwin(),函数内容是打开一个窗口。在调用它之前没有Q何用途。?br />怎么调用呢? Ҏ(gu)一Q?lt;body onload="openwin()"> 览器读面时弹出窗口; Ҏ(gu)二:<body onunload="openwin()"> 览器离开面时弹出窗口; Ҏ(gu)三:用一个连接调用: <a href="#" onclick="openwin()">打开一个窗?lt;/a> 注意Q用的"#"是虚q接。?br />Ҏ(gu)四:用一个按钮调用: <input type="button" onclick="openwin()" value="打开H口"> ?、同时弹?个窗口】?br /> Ҏ(gu)代码E微改动一下: <script LANGUAGE="JavaScript"> <!-- function openwin() { 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 />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 />} //--> </script> 为避免弹出的2个窗口覆盖,用top和left控制一下弹出的位置不要怺覆盖卛_。最后用上面说过的四U方法调用即可。?br />注意Q?个窗口的name(newwindows和newwindow2)不要相同Q或者干脆全部ؓI。OKQ?br /> ?、主H口打开文g1.htmQ同时弹出小H口page.html】?br /> 如下代码加入ȝ?lt;head>区: <script language="javascript"> <!-- function openwin() {window.open("page.html","","width=200,height=200") } //--> </script> 加入<body>区: <a href="1.htm" onclick="openwin()">open</a>卛_。?br /> ?、弹出的H口之定时关闭控制】?br /> 下面我们再对弹出的窗口进行一些控Ӟ效果更好了。如果我们再一段代码加入弹出的页?注意是加入到page.html的HTML中,可不是主面中,否则?Q让?0U后自动关闭是不是更酷了Q?br /> 首先Q将如下代码加入page.html文g?lt;head>区: <script language="JavaScript"> function closeit() {setTimeout("self.close()",10000) //毫秒} </script> 然后Q再?lt;body onload="closeit()"> q一句话代替page.html中原有的<BODY>q一句就可以了?q一句话千万不要忘记写啊Q这一句的作用是调用关闭窗口的代码Q?0U钟后就自行关闭该窗口? ?、在弹出H口中加上一个关闭按钮】?br /><FORM> <INPUT TYPE='BUTTON' VALUE='关闭' onClick='window.close()'> </FORM> 呵呵Q现在更加完了Q?br /> ?、内包含的弹出窗?一个页面两个窗口】?br /> 上面的例子都包含两个H口Q一个是ȝ口,另一个是弹出的小H口。?br /> 通过下面的例子,你可以在一个页面内完成上面的效果。?br /><html> <head> <SCRIPT LANGUAGE="JavaScript"> function openwin() {OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no"); //写成一行?br />OpenWindow.document.write("<TITLE>例子</TITLE>") OpenWindow.document.write("<BODY BGCOLOR=#ffffff>") OpenWindow.document.write("<h1>Hello!</h1>") OpenWindow.document.write("New window opened!") OpenWindow.document.write("</BODY>") OpenWindow.document.write("</HTML>") OpenWindow.document.close()} </SCRIPT> </head> <body> <a href="#" onclick="openwin()">打开一个窗?lt;/a> <input type="button" onclick="openwin()" value="打开H口"> </body> </html> 看看 OpenWindow.document.write()里面的代码不是标准的HTML吗?只要按照格式写更多的行即可。千万注意多一个标{或一个标{ְ会出现错误。记得用OpenWindow.document.close()l束啊。?br /> ?、终极应?-弹出的窗口之Cookie控制】?br /> 回想一下,上面的弹出窗口虽焉Q但是有一点小毛病(沉浸在喜(zhn)之中,一定没有发现吧Q?比如你将上面的脚本放在一个需要频J经q的面?例如首页)Q那么每ơ刷新这个页面,H口都会弹出一ơ,是不是非常烦人?:-(有解决的办法吗?Yes! ;-) Follow me. 我们使用cookie来控制一下就可以了?br /> 首先Q将如下代码加入主页面HTML?lt;HEAD>区: <script> function openwin() {window.open("page.html","","width=200,height=200")} function get_cookie(Name) {var search = Name + "=" var returnvalue = ""; if (document.cookie.length > 0) { offset = document.cookie.indexOf(search) if (offset != -1) { offset += search.length end = document.cookie.indexOf(";", offset); if (end == -1) end = document.cookie.length; returnvalue=unescape(document.cookie.substring(offset,end)) } } return returnvalue; } function loadpopup(){ if (get_cookie('popped')==''){ openwin() document.cookie="popped=yes" } } </script> 然后Q用<body onload="loadpopup()">Q注意不是openwin而是loadpop啊!Q替换主面中原有的<BODY>q一句即可。你可以试着h一下这个页面或重新q入该页面,H口再也不会弹出了。真正的Pop-Only-OnceQ?br /> 写到q里弹出H口的制作和应用技巧基本上是完成了,需要注意的是,JS脚本中的的大写最好前后保持一致?/p>
]]>面自动关闭代码 http://www.aygfsteel.com/43880800/archive/2006/12/27/90197.htmlTom Tom Tue, 26 Dec 2006 18:47:00 GMT http://www.aygfsteel.com/43880800/archive/2006/12/27/90197.html http://www.aygfsteel.com/43880800/comments/90197.html http://www.aygfsteel.com/43880800/archive/2006/12/27/90197.html#Feedback 0 http://www.aygfsteel.com/43880800/comments/commentRss/90197.html http://www.aygfsteel.com/43880800/services/trackbacks/90197.html
面自动关闭代码
<script language="javascript">
function closeit() {
setTimeout("self.close()",5000) //毫秒
}
</script>
//以上代码攑օ需要自动关闭的目标|页?lt;head></head>之间
]]>
վ֩ģ壺
ֱ |
ݳ |
|
٤ʦ |
պ |
ũ |
|
|
|
ͭϿ |
˫ |
¦ |
|
|
½ |
|
Ž |
|
״ |
|
|
|
ԭ |
̫ |
Ϻ |
ݶ |
|
|
|
|
|
|
|
ͬ |
|
̫ԭ |
|
¡ |
|
|
|