1. 程式人生 > >js函式為什麼不能夠放在window onload中

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(){}這個叫匿名函式

物件         事件       函式            給物件的事件繫結函式