To: yixianggao() 你说的肯定不对<body> <input type="button" id="btnT" value="Click"> </body> <script language="JavaScript"> <!-- var b = document.getElementById("btnT"); alert(b==btnT) function btnT.onclick(){alert("See Me!");} //function b.onclick(){alert("See Me!");}//这句就出错 </script> 另外Class.prototype.function()都可以,变量.function()都不行 可能是浏览器的容错问题吧
回:fosjos(无聊的菜鸟程序员) 实践是检验真理的唯一标准! 我那段代码执行起来没有任何错误。兄弟却说肯定不对,可是错在哪里呢?请明示!<body> <input type="button" id="btnT" value="Click"> </body><script language="JavaScript"> <!-- function btnT.onclick(){alert("See Me!");} alert(btnT.onclick); //--> </script>居然显示“function btnT.onclick(){alert("See Me!");}”确实很有意思,事件函数(btnT.onclick())定义以及为事件(onclick)指定函数句柄居然一气呵成,当然通常的做法是分两步。至于 fosjos 所讲的错误,个人感觉与引用类型有关系,btnT 的类型是 object,而 b 是对 btnT 的引用;同时 btnT 又可以看成对象名(类名)。如果此种猜想成立,那么就可以解释 fosjos 所讲的错误了。 function btnT.onclick(){alert("See Me!");}——是对类上事件重定义的特殊写法(至少IE中成立) function b.onclick(){alert("See Me!");}——b 仅仅是对 btnT 实例的引用,因此这么写当然就不对了。有兴趣的朋友请继续发表看法!
你们说的不对,因为 function开头的语句,即定义函数,这个解释优先级很高的,对同一块代码而言(即在同一对scritp里),不论function语句写在哪里,都会优先解释的,即在运行所有代码前会先解释function语句,(注意:var x = function(){}这种写法,function是一个表达式,不算语句。)所以,你的btnT在解释funtion语句本身时并不存在该对象,当然更不可能对 不存在的对象 的属性进行赋值。两种写法其实都是可以的,但如果要用function btnT.onclick()这种写法的话,就要注意一下 var btnT = document.getElementById("Button2");这一句一定不要跟上面那句放在同一个script标签内,而要放在function所在标签之前。这样大家应该都明白了吧,问题的关键是在于JS对语句解释的优先级上面。========= 楼主可以结帖了,我这个是标准答案。
To: Amwpfiqvy(布衣神相)请解释一下IE的这种情况: var b = document.getElementById("btnT"); alert(b==btnT) //true //function btnT.onclick(){alert("See Me!");}//用这句可以 //function b.onclick(){alert("See Me!");}//用这句就出错
To: yixianggao说你错是: “写法确实没错,应该是位置错了,JS在网页中是顺序执行的, 如果 function btnT.onclick(){alert("See Me!");} 写在 head 里肯定报错, 可是写在 body 后肯定没错”楼主说的是“var btnT = document.getElementById("Button2"); function btnT.onclick(){alert("ASDFF");}”至于你后来说的,可能有道理
TO fosjos(无聊的菜鸟程序员): var b = document.getElementById("btnT"); alert(b==btnT) //true //function btnT.onclick(){alert("See Me!");}//用这句可以//---这里的btnT其实是页面中<input id="btnT">从这里找到的,这是个对象,已经存在,故不错 //function b.onclick(){alert("See Me!");}//用这句就出错//---这个语句在整个块中首先被解释,此时b尚不存在,即var b = document.getElementById("btnT");这句尚未运行。故出错。==== 解释优先级是针对语句的,表达式是语句的组成部分。语句是有解释优先级的,表达式是计算优先级,这两个优先级不是同一概念。funtion语句 的解释优先级最高,同一块的代码必定优先解释,顺序是从头到尾。[这个很少人知道],其它语句为一般语句,一般语句在function语句之后从头顺次解释。 表达式的计算优先级主要就是运算符的优先级。这个基本都知道。重申一次:var x = function(){}这种写法中function只算表达式,不作语句,这就是特别些。
做了四年的程序员了,最近才发现一些心得:
在做页面的时候尽量不要把onclick诸如此类的东西放在标签中,例如<input type="button" onclick="check()">,因为这样不知不觉的就把代码和HTML搅合到一起去了,同时也不利于美工人员的编辑,而是采用
var btnT = document.getElementById("Button2");
btnT.onclick = function(){alert(this);}
这样的手法,这样看起来还是更加专业的
这是又想到
function window.onload(){alert("ASDFF");}的用法,难免有点比较,所以产生了上述的问题,希望和专家们深入的讨论一下这些问题
.on{background:#0000FF;}
.out{background:#FFFFFF;}
</style>
<div id="tt" style="border:dashed">2121</div>
<script language="javascript" type="text/javascript">
function sfHover(){
document.getElementById("tt").onmouseover=function(){this.className="on";}
document.getElementById("tt").onmouseout=function(){this.className="out";}
document.getElementById("tt").onclick=function(){alert("hello");}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);
</script>
如果 function btnT.onclick(){alert("See Me!");} 写在 head 里肯定报错,
可是写在 body 后肯定没错,不过俺看不管这种写法,因为代码的重用性不好,哈哈说的够清楚吧,快加分呀~~~示例如下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script language="JavaScript">
<!--
function window.onload(){alert("See You!");}
//-->
</script>
</head><body>
<input type="button" id="btnT" value="Click">
</body>
<script language="JavaScript">
<!--
function btnT.onclick(){alert("See Me!");}
//-->
</script>
</html>
来自bennolan的behaviour让你的HTML代码变干净
http://www.bjcan.com/hengxing/readlou.asp?id=1368
http://www.bjcan.com/hengxing/readlou.asp?id=1365
楼主看下这个东东吧,完全符合你的意思~
你说的肯定不对<body>
<input type="button" id="btnT" value="Click">
</body>
<script language="JavaScript">
<!--
var b = document.getElementById("btnT");
alert(b==btnT)
function btnT.onclick(){alert("See Me!");}
//function b.onclick(){alert("See Me!");}//这句就出错
</script>
另外Class.prototype.function()都可以,变量.function()都不行
可能是浏览器的容错问题吧
实践是检验真理的唯一标准!
我那段代码执行起来没有任何错误。兄弟却说肯定不对,可是错在哪里呢?请明示!<body>
<input type="button" id="btnT" value="Click">
</body><script language="JavaScript">
<!--
function btnT.onclick(){alert("See Me!");}
alert(btnT.onclick);
//-->
</script>居然显示“function btnT.onclick(){alert("See Me!");}”确实很有意思,事件函数(btnT.onclick())定义以及为事件(onclick)指定函数句柄居然一气呵成,当然通常的做法是分两步。至于 fosjos 所讲的错误,个人感觉与引用类型有关系,btnT 的类型是 object,而 b 是对 btnT 的引用;同时 btnT 又可以看成对象名(类名)。如果此种猜想成立,那么就可以解释 fosjos 所讲的错误了。
function btnT.onclick(){alert("See Me!");}——是对类上事件重定义的特殊写法(至少IE中成立)
function b.onclick(){alert("See Me!");}——b 仅仅是对 btnT 实例的引用,因此这么写当然就不对了。有兴趣的朋友请继续发表看法!
var btnT = document.getElementById("Button2");这一句一定不要跟上面那句放在同一个script标签内,而要放在function所在标签之前。这样大家应该都明白了吧,问题的关键是在于JS对语句解释的优先级上面。=========
楼主可以结帖了,我这个是标准答案。
var b = document.getElementById("btnT");
alert(b==btnT) //true
//function btnT.onclick(){alert("See Me!");}//用这句可以
//function b.onclick(){alert("See Me!");}//用这句就出错
“写法确实没错,应该是位置错了,JS在网页中是顺序执行的,
如果 function btnT.onclick(){alert("See Me!");} 写在 head 里肯定报错,
可是写在 body 后肯定没错”楼主说的是“var btnT = document.getElementById("Button2");
function btnT.onclick(){alert("ASDFF");}”至于你后来说的,可能有道理
var b = document.getElementById("btnT");
alert(b==btnT) //true
//function btnT.onclick(){alert("See Me!");}//用这句可以//---这里的btnT其实是页面中<input id="btnT">从这里找到的,这是个对象,已经存在,故不错
//function b.onclick(){alert("See Me!");}//用这句就出错//---这个语句在整个块中首先被解释,此时b尚不存在,即var b = document.getElementById("btnT");这句尚未运行。故出错。====
解释优先级是针对语句的,表达式是语句的组成部分。语句是有解释优先级的,表达式是计算优先级,这两个优先级不是同一概念。funtion语句 的解释优先级最高,同一块的代码必定优先解释,顺序是从头到尾。[这个很少人知道],其它语句为一般语句,一般语句在function语句之后从头顺次解释。
表达式的计算优先级主要就是运算符的优先级。这个基本都知道。重申一次:var x = function(){}这种写法中function只算表达式,不作语句,这就是特别些。
<body>
<input type="button" id="Button1" name="Button1" value="点我试试" />
</body><script>
var btn = document.getElementById("Button1");
//以下两行,注释掉就不对,不注释就正常运行,可以说明问题了吧?
</script>
<script>
function btn.onclick()
{
alert("我正常了,嘻嘻!");
}
void(0);
</script>
不注释掉,那么相当于从下到下,顺次解释JS,此时,定义btn在定义function之前已存在,故正常
注释掉以后,优先解释function语句,些时btn尚未定义,故出错。
俺也很惭愧,最近很忙一直没有回帖,我学习喜欢研究个为什么,Amwpfiqvy(布衣神相) 确实把问题说得到根了,加分是肯定的,但我还想知道这种优先级到底是何不适合firefox
谢谢
Opea有一个JAVA版本,大家要是能够研究下这个东西,也是不错的说