2012-09-21 80 views
1

如何防止此功能再次自稱:禁用jQuery的功能,它被稱爲後

$(document).ready(function() { 
    login(); 
}); 

function login() { 
    $('#login').hide(); 
    $('#pre-login button').on('click',function(event) { 
     $('#pre-login').hide(); 
     $('#login').show(); 
     $('#login :text').focus(); 
     return false; 
    }); 
} 

我有這兩種形式:當頁面已經顯示

<form id="pre-login"><p>Already have an account?</p><button type="submit">Login</button></form> 
<form id="login"> 
    <input type="text" placeholder="Email Address" class="login"> 
    <input type="password" placeholder="Password" class="login"><h4><a href="#">Forgot?</a></h4> 
    <button type="submit" class="action">Login</button> 
</form> 

第一種形式被加載,而第二種形式被設置爲隱藏。在第一張表格上點擊登錄按鈕後,會顯示第二張表格,首先隱藏。但是,單擊第二個表單上的登錄按鈕會導致相反的效果,即使我告訴jQuery僅在單擊#登錄前表單的按鈕時調用該函數。

我不能讓頭或尾巴發生什麼事情,所以我想也許這是最好的一旦它被調用一次就禁用該功能。

回答

4

您可以使用one方法:

附加的處理程序爲元素的事件。處理程序每​​個元素最多執行一次。

function login() { 
    $('#login').hide(); 
    $('#pre-login button').one('click',function(event) { 
     $('#pre-login').hide(); 
     $('#login').show(); 
     $('#login :text').focus(); 
     return false; 
    }); 
} 
+0

剛纔試了這一點,並沒有成功,但它似乎它應該工作。它必須是我調用函數的方式。 – Rich

+0

@rick動態生成'button'元素嗎? – undefined

+0

不,它們是硬編碼的。 – Rich

3

你確定它的JavaScript造成你看到了什麼?我把它設置在一個基本的jsFiddle,看起來第二個登錄按鈕只是重新加載頁面(並提交登錄表單數據),從而將其重置爲初始狀態。這將使它看起來像Javascript重新隱藏自己,但實際上它只會做你告訴它的內容 - 即開始隱藏。

如果您打算使用Javascript,請務必在Firefox中使用Firebug或Chrome的開發人員工具 - 他們非常適合逐步瀏覽Javascript和監視請求以瞭解發生了什麼。

我的猜測是,當您在用戶登錄時接受登錄並顯示「登錄」消息時,所有內容都將按預期工作。

+0

你是對的 - 看起來這實際上是發生了什麼事情。我的本地主機很快重新加載,我甚至沒有注意到該頁面實際上令人耳目一新。尷尬...謝謝! – Rich

1

您可以使用.one()。這可以確保只執行一次事件..

$(document).ready(function() { 
    login(); 
}); 

function login() { 
    $('#login').hide(); 
    $('#pre-login button').one('click',function(event) { 
     $('#pre-login').hide(); 
     $('#login').show(); 
     $('#login :text').focus(); 
     return false; 
    }); 
} 

//你也可以在執行click事件取消綁定呢..

function login() { 
     $('#login').hide(); 
     $('#pre-login button').one('click',function(event) { 
      $('#pre-login').hide(); 
      $('#login').show(); 
      $('#login :text').focus(); 
      $(this).unbind(); 
      return false; 
     }); 
    }