js函式為什麼不能夠放在window onload中
今天在jsp中的form表單利用onclick=”xxx”來監聽js中一個function xxx(){}函式,遇到一個很奇怪的問題就是點選submit按鈕之後竟然沒有響應xxx()函式。在這之前我已經多次在form表單中利用onclick=”xxx”來監聽一個函式,並沒有出現過這種情況。這經過多次嘗試後,和具體分析,與之前的對比,終於找到為何會出現這個問題。為了直表述問題所在我用一個例項的程式碼來說明問題。
<--jsp程式碼:--> <form action="/interviweText/ajaxSort" method="post"> <input type="text" name="number" id="number"/> <input type="submit" id="tijiao" onclick="cphclick();" value="提交"/> </form> js程式碼: <script type="text/javascript"> window.onload=function(){ alert("hahaha"); function cphclick(){ alert("xixixi"); } } </script>
就是這個很簡短的程式碼 ,當執行這個jsp之後自動彈出“hahaha”對話方塊,這個沒有問題,當jsp頁面載入完成之後會自動執行window.onload中的程式碼。但問題就出現在當我點選“提交”按鈕之後並沒有彈出“xixixi”對話方塊。初一看沒有問題啊,我已經onclick=”cphclick();”監聽cphclick()函數了,理應跳出來“xixixi”對話方塊才對。並且這樣之前也用過了,檢視之前的js程式碼發現當把cphclick()函式提到外面點選”提交”就可以彈出“xixixi”對話方塊。js修改如下:
<script type="text/javascript">
window.onload=function(){
alert("hahaha");
}
function cphclick(){
alert("xixixi");//有名字的函式,區別於匿名函式
}
</script>
這時也許有人想到了是作用域的問題。對沒錯就是作用域的問題。加上window.onload後改變了cphclick()函式的作用域,使其成為內部函式,故而onclick=”“無法訪問到這個函式,而放到外面cphclick()是繫結在window上的,所以onclick=”“能夠訪問到。相當於一個函式中定義的區域性變數在函式外面訪問不到一樣。
那麼現在又有一個新的需求,我就是想在頁面載入完成之後再執行函式怎麼辦,其實我們可以改變onload()裡面函式的作用域為繫結在window上的,用的方法就是物件.函式。例項:
<script type="text/javascript">
window.onload=function(){
alert("hahaha");
var tijiao=document.getElementById("tijiao");
tijiao.cphclick=function(){
alert("xixixi");
}
}
</script>
window.onload = function(){}這個叫匿名函式
物件 事件 函式 給物件的事件繫結函式