2012-07-18 35 views
0

對不起,如果這已經發布,但我已經看到其中許多人,並試圖得到使用它們來獲得解決方案,但他們都沒有爲我工作。如何恢復以前的聽衆?

以下是我認爲正確的方法(沒有其他編碼我正在做)。當觸發F1時,應該禁用點擊。當我F2被觸發時,應該啓用:

$('.head2, .head3').click(function(event) { 
    var object = $(this).siblings('.head4'); 
    if (something) F1(); 
if (somethingelse)) F2(); 
    function F1() { 
     object.siblings('.head3').children('.primary').off('click'); 
    } 
    function F2() { 
     object.siblings('.head3').children('.primary').on('click'); 
    } 
}); 

問題:點擊事件偵聽器不會關閉。

2.

$('.head2 li, .head3 li').click(function(event) { 
    var object = $(this).parent().siblings('.head4'); 
    if (something) F1(); 
if (somethingelse)) F2(); 
    function F1() { 
     object.siblings('.head3').children('.primary').off('click'); 
    } 
    function F2() { 
     object.siblings('.head3').children('.primary').on('click'); 
    } 
}); 

問題:.primary不重新分配一個click事件偵聽

3.

func = $('.head2 li, .head3 li').click(function(event) { 
    var object = $(this).parent().siblings('.head4'); 
    if (something) F1(); 
if (somethingelse)) F2(); 
    function F1() { 
     object.siblings('.head3').children('.primary').off('click'); 
    } 
    function F2() { 
     object.siblings('.head3').children('.primary').on('click', func); 
    } 
}); 

問題:ERROR: Uncaught TypeError: Object [object Object] has no method 'apply'

爲了更好地澄清什麼,我我在做,我試圖關閉一組li這是事件處理程序附加到它沒有關閉其他人,只有當它被切換。

例子:

<ul class="head"> 
    <li class="sub1"></div> 
    <li class="sub2"></div> 
    <li class="sub3"></div> 
</div> 

當你點擊任何li的,有事,然後.sub1有其Click事件處理程序中移除。然後,當再次點擊li中的任何一個時,除sub1之外,操作都會顛倒,並且sub1會再次變爲可點擊。

回答

1

事件代表團

$('body').on('click','li',function(){ 
//do the logic for all li elements 
}); 

$('body').on('click','li.active',function(){ 
//do the logic for active buttons here 
}); 

現在切換li元素的類主動啓用/禁用自定義的一部分。

並與單個事件監聽器,你可以這樣做

$('body').on('click','li',function(){ 
    //do common stuff 
    if($(this).hasClass('active')){ 
     //do stuff 
     } 
    else{ 
     //do other stuff 
     } 
    }); 

對於這兩種情況

$(ELEM).toggleClass( '主動');

將切換自定義部分

而且你的情況下運行:

$('.head2, .head3').click(function(event) { 
    var object = $(this).siblings('.head4'); 
    if (something) object.siblings('.head3').children('.primary').addClass('active'); 
    if (somethingelse)object.siblings('.head3').children('.primary').removeClass('active'); 
}); 
0

您在所有三個處理程序中都定義了F1()F2(),但是您沒有調用它們,因此它們從不執行。你需要給他們打電話,如果你想讓他們跑步。 [編輯 - OP已經解決了第一個問題 - 第二個問題仍然存在]。

我也看不出有什麼你實際上是試圖在頭兩例因完成,該F1()函數刪除點擊處理程序,但因爲它沒有事件F2()功能不安裝新的工作處理程序處理程序回調。對於.on(),回調函數不是可選的。


我認爲使用委託事件處理的想法可能是最簡單的。

在安裝.head3對象的事件處理程序時,請勿將它們直接安裝在對象上。相反,將它們安裝在父對象上。然後,你可以添加或刪除,以便啓用或禁用的事件處理程序從目標對象的類:

// the click handlers for .head3 objects 
// these will only fire if the .head3 object does not have the disabled class on it 
$(document.body).on('click', '.head3:not(.disabled) > .primary', function() { 
    // your .head3 click handler code goes here 
}); 

// then, turn an event handler on or off, you just add or remove the disabled class 
// from it 
$('.head2, .head3').click(function(event) { 
    var object = $(this).siblings('.head4'); 
    function F1() { 
     object.siblings('.head3').children('.primary').addClass("disabled"); 
    } 
    function F2() { 
     object.siblings('.head3').children('.primary').removeClass("disabled"); 
    } 
    if (something) F1(); 
    if (somethingelse) F2(); 
}); 

現在,你有沒有表現出任何你的HTML的,也不是完全描述了自己真正要做要做,但這說明了總體思路。

+0

將關閉點擊只是禁用或刪除相應的事件監聽器,如果刪除將做「上」時,它捲土重來? – sabithpocker 2012-07-18 23:23:55

+0

@sabithpocker - '.off()'完全刪除事件處理程序。你必須用'.on()'從頭開始重新安裝,包括事件處理函數。您可以在['.on()'doc](http://api.jquery.com/on/)中看到事件處理程序不是可選參數。 – jfriend00 2012-07-18 23:24:59

+0

我添加了函數調用。 – 2012-07-18 23:25:56

0

謝謝jfriend00和sabithpocker爲你提供持續幫助。

我把變量func放在錯誤的地方。我把它等同於函數,而不是聽者。

$('.head2 li, .head3 li').click(func = function(event) { 
    var object = $(this).parent().siblings('.head4'); 
    if (something) F1(); 
if (somethingelse)) F2(); 
    function F1() { 
     object.siblings('.head3').children('.primary').off('click'); 
    } 
    function F2() { 
     object.siblings('.head3').children('.primary').on('click', func); 
    } 
}); 
+0

你還在做它似乎很難的方式 – sabithpocker 2012-07-18 23:44:01

+0

@sabithpocker哈哈。它會怎樣? – 2012-07-18 23:44:43