2012-05-23 58 views
1

我有一個非常奇怪和混亂的錯誤。Javascript - 找不到功能?!從onClick調用,功能是在同一頁

這裏是我的代碼:

{if="$pjax === false"}{include="header"}{/if} 
<script type="text/javascript"> 
    $(document).ready(function() { 
     function clickclear(thisfield, defaulttext) { 
      if (thisfield.value == defaulttext) { 
       thisfield.value = ""; 
      } 
     } 
     function clickrecall(thisfield, defaulttext) { 
      if (thisfield.value == "") { 
       thisfield.value = defaulttext; 
      } 
     } 
    }); 
</script> 
<form action='./login' method='post' name='form'> 
<ul class="form"> 
    <li><input type="text" name="username" value="Username" id="username" onclick="clickclear(this, 'Username')" onblur="clickrecall(this,'Username')" /></li> 
    <li><input type="password" name="password" value="Password" id="password" onclick="clickclear(this, 'Password')" onblur="clickrecall(this,'Password')" /></li> 
    <li><span style='display:block;height:27px;float:left;line-height:27px;'>Remember Me</span> <div id='itoggle' style='float:right;'><input type="checkbox" id="remember" class='itoggle' /></div><div class='clearfix'></div></li> 
</ul> 
</form> 
<a href="javascript: form.submit()" class="button white">Login</a> 
{if="$pjax === false"}{include="footer"}{/if} 

你可以看到有兩個功能,clickclearclickrecall。這些從onClickonBlur的表格輸入中被調用。然而,當我運行它們,我得到這些javascript錯誤:

Uncaught ReferenceError: clickclear is not defined

Uncaught ReferenceError: clickrecall is not defined

任何想法?我知道這可能很簡單,但我看不到它。

+2

毫無理由將你的函數包裝在document.ready中。 –

+0

這是因爲函數只能在.ready()函數中使用:它們是該函數的私有函數。 – frenchie

+0

它仍然給了同樣的錯誤,當我沒有使用document.ready –

回答

3

這是因爲你的函數在.ready()回調中。這些在全球範圍內是不可見的(這很好)。

所以最好使用像.on() jQuery的事件連接方法:

$(document).ready(function(){ 

    //your code 
    function clickclear(){...} 
    function clickrecall(){...} 

    //the handlers 
    $('#username').on('click',function(){ //bind click handler 
     clickclear(this,'Username');  //things to do on click 
    }).on('blur',function(){    //chain blur handler 
     clickrecall(this,'Username');  //things to do on blur 
    }); 

    $('#password').on('click',function(){ //bind click handler 
     clickclear(this,'Password');  //things to do on click 
    }).on('blur',function(){    //chain blur handler 
     clickrecall(this,'Password');  //things to do on blur 
    }); 

    ...other handlers... 

}); 

而且一個側面說明,有一個placeholder屬性爲Chrome,它的作用就像佔位符文本:

<input type="text" placeholder="username" /> 
<input type="password" placeholder="password" /> 
+1

謝謝!這工作。但是對於這樣一個小功能來說,它似乎有相當大的代碼量,這是針對移動網站的,所以我想限制儘可能多的代碼。我想我可以將這個想法暗示爲所有輸入的較小代碼。非常感謝你! :D –

+0

是的,我知道佔位符:P,但雖然它是一個移動網站,我喜歡保持代碼類似於在IE和 –

+2

@DanSpiteri工作,你可以縮小你的代碼生產,最好這樣做,因爲的「關注點分離」(將HTML,CSS和JS彼此分開),以獲得乾淨的代碼。 – Joseph