2012-08-22 25 views
0

我的目標很簡單。在我的webapp中,我有兩個頁面,我想從另一個頁面調用每個頁面。結束多個調用(由於循環引用) - jQuery

但我用JavaScript實現函數調用的方式似乎有缺陷。我已閱讀closure,bubbling,recursionevent.stopPropagation(),但仍不確定實現此目標的正確方法。

這裏,我可以重現我的問題最小的代碼。

 
    function init(){ 
    var $div1 = 'Click to Load page 2'; 
    $("#main").append($div1); 

    var $div2 = 'Click to go back to page 1'; 
    $("#main").append($div2);  
    displayFirstPage(); 
} 


    function displayFirstPage() { 
    var $div1 = $("#div1"); 
    var $div2 = $("#div2");  

    $div2.hide(); 
    $div1.show(); 

    alert("first called"); 

    $div1.click(function(){ 
    displaySecondPage(); 
    }); 
} 


    function displaySecondPage() { 
    var $div1 = $("#div1"); 
    var $div2 = $("#div2");  

    alert("second called"); 
    $div1.hide(); 
    $div2.show(); 

    $div2.click(function(){ 
    displayFirstPage(); 
    }); 
} 

點擊的div了幾次之後,我結束了衆多警告的彈出。我只想讓每個調用都執行一次。顯然,我錯過了終止函數調用的方式。

任何幫助表示讚賞。

回答

4

$div1.click(function(){ 
    displaySecondPage(); 
}); 

$div2.click(function(){ 
    displayFirstPage(); 
}); 

應該是你init()函數中。每次你打電話給那些你正在添加另一個點擊處理程序的div。你只想添加一次,所以把它們放在init()

0

我認爲你每次調用時添加一個新的單擊處理

$ div2.click(功能)

1

我認爲這個問題是因爲你綁定一個新的匿名功能,每次點擊事件顯示功能被調用。

移動點擊綁定代碼到您的init()函數:

function init(){ 
    var $div1 = 'Click to Load page 2'; 
    $("#main").append($div1); 

    var $div2 = 'Click to go back to page 1'; 
    $("#main").append($div2); 

    var $div1 = $("#div1"); 

    $div1.click(function(){ 
    displaySecondPage(); 
    }); 

    var $div2 = $("#div2"); 

    $div2.click(function(){ 
    displayFirstPage(); 
    });  



    displayFirstPage(); 
} 
+0

謝謝您的解釋和代碼,@Greg Ross。我+1了你,並接受高爾夫的答案,因爲他是第一個迴應。問候,拉姆 –

1

如果出於某種原因你不想把.click()功能,在您的init()功能(如golf介紹),你可以將每個.click()行更改爲.unbind().click()