- 浏览: 464678 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (135)
- javascript (43)
- struts (3)
- webWork (0)
- hibernate (2)
- EJB (0)
- Spring (2)
- XML (2)
- Oracle (4)
- Mysql (0)
- C (0)
- C++ (0)
- 网络 (0)
- linux (4)
- java (28)
- 设计模式 (0)
- java 代理模式 (2)
- jsp&Servlet (2)
- Tomcat (5)
- 算法设计 (2)
- 操作技巧 (1)
- HTML (5)
- Ajax (2)
- JScript Deviations from ES3 (14)
- Eclipse (1)
- log4J (2)
- ant (1)
- HTTP (4)
- project (1)
- SqlServer (4)
- 数据仓库 (0)
最新评论
-
u012526168:
header的域名是大小写敏感的.http://stackov ...
HTTP 请求报头详解 -
junes_yu:
这样的方法有问题哦正确方法如下:document.onkeyd ...
javascript 屏蔽F5,BackSpace,IE的刷新,右键功能 -
xunke515:
第二个,如果要带顺序的话,new个treeset也可以吧.
两种方法删除ArrayList里重复元素 -
bangyulin:
java 潜拷贝和深拷贝 -
hecongqi:
谢谢,写得很好,学到知识了
浅谈Java代理机制
以下是JavaScript容易犯错的几个"陷阱".由本人google+体验+搜集而来.虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些.
1. 最后一个逗号
如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此)。IE会报语法错误,但语义不详,你只能用人眼从几千行代码中扫描。
Js代码
2. this的引用会改变
如这段代码:
并不如你所愿,答案并不是”JavaScript rules”。在执行MyObject.ClickHandler时,在行1中,this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决:
3. 标识盗贼
在JavaScript中不要直接使用跟HTML的id一样的变量名。如下代码:
IE会报对象未定义的错误。我只能说:IE 真烂.
若在TheButton之前加上var 声明,或者将TheButton改为其它名称,则不会报错.如:
4. 字符串只替换第一个匹配
如下代码:
而实际上,fileName结果是"This_is a title". 在JavaScript中,String.replace的第一个参数应该是正则表达式。所以,正确的做法是这样:
Js代码
5. mouseout意味着mousein
事实上,这是由于事件冒泡导致的。IE中有mouseenter和mouseleave,但不是标准的。作者在此建议大家使用js库来解决问题。
6. parseInt是基于进制体系的
这个是常识,可是很多人给忽略了parseInt还有第二个参数,用以指明进制。比如,parseInt("09"),如果你认为答案是9,那就错了。因为,在此,字符串以0开头,parseInt以八进制来处理它,在八进制中,09是非法,返回false,布尔值false转化成数值就是0. 因此,正确的做法是
7. for...in...会遍历所有的东西
有一段这样的代码:
运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype,这样,我们的arr平白无过多出了一个属性(方法),而for...in...会把它给遍历出来。
其实,就算没有引进库.它的结果也并不是数组所有元素的乘积,因为for...in...会遍历到数组的length属性.
所以这样做才是比较安全的:
其实,这也是污染基本类的prototype会带来危害的一个例证。
8. 事件处理器的陷阱
这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick = MyOnClickMethod这样的代码,这会复写掉之前的window.onclick事件,还可能导致IE的内容泄露(sucks again)。在IE还没有支持DOM 2的事件注册之前,作者建议使用库来解决问题,比如使用YUI:
这应该也属于常识问题,但新手可能容易犯错。
9. focus() 出错
新建一个input文本元素,然后把焦点挪到它上面,按理说,这样的代码应该很自然:
10.document.write()完全替换之前页面内容
有这样一段代码:
上面代码块中的"开始"和"结束"两块不会输出.
当onload事件结束之后,如果再一次调用document.write()方法写进一段HTML,这段HTML会完全替换掉之前页面的内容.整个页面的源代码就变为了document.write()所写的内容.把上面的改为:
"开始"和"结束"就会正常输出.
11.注意你name的值.
有这样一段代码:
可输出结果不是我们想要的"aa.htm",而是一个"[object]"字符串.因为它得到的是myForm中的name为"action"的input标签的值.更详细的内容请参考
12.后台数据传输不会影响到前台
也许你会说这是一非常低级的错误.但我还是想说下:
页面login.htm代码
页面check.htm代码
很多人习惯用这种方法来进行登录失败的提示.但是要注意:xmlHttp发送数据的时候是进行的后台发送,它所关心的,仅仅是send之后,得到所请求URL的响应.而check.htm页面所执行的一切,都是只在后台完成.不管它怎么跳转,或者alert(),或者close().都不会在界面中有任何显示.
-----------------------------------------------------------------------------------------
在实践中,JavaScript的陷阱还有很多很多,大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现,只能靠开发者之间的经验分享。希望大家有更好的分享。
如发现其它的"陷阱",我会继续增加内容.谢谢关注.
1. 最后一个逗号
如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此)。IE会报语法错误,但语义不详,你只能用人眼从几千行代码中扫描。
Js代码
<script> var theObj = { city : "ShenZhen", state : "ok", } </script>
2. this的引用会改变
如这段代码:
<input type="button" value="Gotcha!" id="MyButton" > <script> var MyObject = function () { this.alertMessage = "Javascript rules"; this.ClickHandler = function() { alert(this.alertMessage ); //行1 } }(); document.getElementById("theText").onclick = MyObject.ClickHandler; </script>
并不如你所愿,答案并不是”JavaScript rules”。在执行MyObject.ClickHandler时,在行1中,this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决:
<input type="button" value="Gotcha!" id="theText" > <script> var MyObject = function () { var self = this; this.alertMessage = “Javascript rules”; this.OnClick = function() { alert(self.value); } }(); document.getElementById(”theText”).onclick = MyObject.OnClick </script>实质上,这就是JavaScript作用域的问题。如果你看过,你会发现解决方案不止一种。
3. 标识盗贼
在JavaScript中不要直接使用跟HTML的id一样的变量名。如下代码:
<input type="button" id="TheButton"> <script> TheButton = document.getElementById("TheButton"); </script>
IE会报对象未定义的错误。我只能说:IE 真烂.
若在TheButton之前加上var 声明,或者将TheButton改为其它名称,则不会报错.如:
<input type="button" id="TheButton"> <script> var TheButton = document.getElementById("TheButton"); //或 TestButton = document.getElementById("TheButton"); </script>
4. 字符串只替换第一个匹配
如下代码:
<script> var fileName = "This is a title"; fileName=fileName.replace(" ","_"); </script>
而实际上,fileName结果是"This_is a title". 在JavaScript中,String.replace的第一个参数应该是正则表达式。所以,正确的做法是这样:
Js代码
var fileName = "This is a title".replace(/ /g,"_");
5. mouseout意味着mousein
事实上,这是由于事件冒泡导致的。IE中有mouseenter和mouseleave,但不是标准的。作者在此建议大家使用js库来解决问题。
6. parseInt是基于进制体系的
这个是常识,可是很多人给忽略了parseInt还有第二个参数,用以指明进制。比如,parseInt("09"),如果你认为答案是9,那就错了。因为,在此,字符串以0开头,parseInt以八进制来处理它,在八进制中,09是非法,返回false,布尔值false转化成数值就是0. 因此,正确的做法是
parseInt("09", 10).
7. for...in...会遍历所有的东西
有一段这样的代码:
var arr = [5,10,15] var total = 1; for ( var x in arr) { total = total * arr[x]; }
运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype,这样,我们的arr平白无过多出了一个属性(方法),而for...in...会把它给遍历出来。
其实,就算没有引进库.它的结果也并不是数组所有元素的乘积,因为for...in...会遍历到数组的length属性.
所以这样做才是比较安全的:
for ( var x = 0; x < arr.length; x++) { total = total * arr[x]; }
其实,这也是污染基本类的prototype会带来危害的一个例证。
8. 事件处理器的陷阱
这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick = MyOnClickMethod这样的代码,这会复写掉之前的window.onclick事件,还可能导致IE的内容泄露(sucks again)。在IE还没有支持DOM 2的事件注册之前,作者建议使用库来解决问题,比如使用YUI:
YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);
这应该也属于常识问题,但新手可能容易犯错。
9. focus() 出错
新建一个input文本元素,然后把焦点挪到它上面,按理说,这样的代码应该很自然:
var newInput = document.createElement("input"); document.body.appendChild(newInput); newInput.focus(); newInput.select();但是IE会报错。这是因为当你执行fouce()的时候,元素尚未可用。因此,我们可以延迟执行:
var newInput = document.createElement("input"); newInput.id = "TheNewInput"; document.body.appendChild(newInput); //在0.01秒之后调用匿名函数获取焦点 setTimeout(function(){ document.getElementById('TheNewInput').focus(); document.getElementById('TheNewInput').select();}, 10); 更详细的资料参见:http://realazy.org/blog/category/javascript-dom/
10.document.write()完全替换之前页面内容
有这样一段代码:
<h3>开始</h3> <script type="text/jscript"> function init() { document.write("现在时间是:" + Date() ); } window.onload = init; </script> <h3>结束</h3>
上面代码块中的"开始"和"结束"两块不会输出.
当onload事件结束之后,如果再一次调用document.write()方法写进一段HTML,这段HTML会完全替换掉之前页面的内容.整个页面的源代码就变为了document.write()所写的内容.把上面的改为:
<h3>开始</h3> <script type="text/jscript"> function init() { document.write("现在时间是:" + new Date() ); } init() </script> <h3>结束</h3>
"开始"和"结束"就会正常输出.
11.注意你name的值.
有这样一段代码:
<form name="myForm" action="aa.htm"> <input type="text" name="action" /> </form> <script> //获取form的id alert(document.forms[0].action); </script>
可输出结果不是我们想要的"aa.htm",而是一个"[object]"字符串.因为它得到的是myForm中的name为"action"的input标签的值.更详细的内容请参考
[url]https://bugzilla.mozilla.org/show_bug.cgi?id=322488 [/url]
12.后台数据传输不会影响到前台
也许你会说这是一非常低级的错误.但我还是想说下:
页面login.htm代码
... xmlHttp.open("GET","check.htm",false); xmlHttp.send(); alert(xmlHttp.responseText); ...
页面check.htm代码
window.onload=checkLogin; function checkLogin(){ ... //如果验证失败,弹出错误 alert("登录失败"); ... }
很多人习惯用这种方法来进行登录失败的提示.但是要注意:xmlHttp发送数据的时候是进行的后台发送,它所关心的,仅仅是send之后,得到所请求URL的响应.而check.htm页面所执行的一切,都是只在后台完成.不管它怎么跳转,或者alert(),或者close().都不会在界面中有任何显示.
-----------------------------------------------------------------------------------------
在实践中,JavaScript的陷阱还有很多很多,大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现,只能靠开发者之间的经验分享。希望大家有更好的分享。
如发现其它的"陷阱",我会继续增加内容.谢谢关注.
发表评论
-
java script 知识
2008-11-24 08:59 1536在IE地址栏中输入以下回车: 第一组: javascri ... -
javascript: window.close() 不弹确认框
2008-10-14 10:40 39381.solution window.opener ... -
document.execCommand()函数可用参数
2008-10-07 09:01 4518<HTML> <HEAD&g ... -
checkbox 隐藏的特殊性
2008-08-11 10:32 2297/*checkbox 的hidden=true属性不能使其隐藏 ... -
javascript 字符串链接效率解决办法
2008-08-01 16:39 1729<html> <head> ... -
事件设计模式
2008-07-11 16:24 18361. 事件设计概述 事件机制可以是程序逻辑更加清晰 ... -
js 去掉前后的空格
2008-07-10 18:09 3141function trim(s) { try ... -
JavaScript Object Notation 学习1 (转贴)
2008-07-02 21:01 1608JSON (JavaScript Objec ... -
javascript---类的构建
2008-07-01 21:30 11401.构造方式定义类,优点:多个实例对象不共享类的属性值,缺点: ... -
javascript---类的继承
2008-07-01 21:22 10271.第一种方式,冒充对象的方式.(利用js里的每一个方法名都是 ... -
java script 小技巧(转贴)
2008-07-01 15:38 2051因为这两篇太安逸了,东西很多,很实用,所以转到我格子里! 总 ... -
javascript 类定义4种方法
2008-07-01 13:49 4800/* 工厂方式--- 创建并返回特定类型的对象的 ... -
体会javascript
2008-06-29 17:51 1279没有类 object就是对象的类型。在JavaScr ... -
java script 刷新页面(转贴alert(平淡中搜询我的快乐)永久域名 http://al)
2008-06-29 17:07 3252用iframe、弹出子页面刷新父页面iframe <s ... -
JavaScript日志框架(转贴)
2008-06-29 16:55 1768log4javascript是一个基于log4j的JavaSc ... -
java script 读取xml (转贴)
2008-06-29 16:37 2094首先:xml文件(tree.xml)内容如下: <?x ... -
用js 调用EXE
2008-06-25 20:37 4887<SCRIPT language="Java ... -
ECMA JavaScript introduction
2008-06-24 17:27 1244Numbers in JavaScript are " ... -
Wscript.Shell 对象详细介绍
2008-06-24 17:08 3693WshShell 对象 ProgID Wscript.Shel ... -
Java实现与IE的交互
2008-06-24 12:43 2458需求 遍历当前打开的IE实例,分别获取IE浏览器中打开文档的 ...
相关推荐
一个用JAVA SCRIPT编写的日期控件 非常好看
Java script脚本常用代码,比较全,供JS初学者参考。
html与Java Script、html与Java Script、html与Java Script
java script 学习笔记 个人摘录笔记 笔记全,实用
java陷阱常见面试题,包含java基础陷阱 java客户端陷阱 java服务器陷阱 等的讲解 和java常见面试题
一些用于网页的很好用的Java script特效代码
Java Script精彩实例教程 Java Script精彩实例教程
java script
关于 java script的参考书,是java script的培训教程的ppt,很不错
Java Script 经典教程(二)——JavaScript圣经第5版
Java Script开发指南
Java Script精彩实例教程下载 Java Script精彩实例教程下载
java script 完全解析 美国 可以供大家参考
java script教学范本,比较详细的介绍js这门语言
java script learn java script learnjava script learn java script learn java script learn java script learn
Java Script 特效之树型菜单 Java Script 特效之树型菜单 Java Script 特效之树型菜单 Java Script 特效之树型菜单
JAVA SCRIPT 函数 完整 版
java script参考教程,只限初学者用
java script精彩实例教程
这是一个简单的java script例子,入门的可以下来看看