2011-01-06 166 views
0

我正在試圖弄清楚爲什麼我的代碼無法工作。JQuery選擇器 -

我設置與活動類,其工作的李元素..

的話,我想選擇具有一流「活動」李元素 - 並給它滑入另一個DIV眼簾點擊功能,這也是由類「主動」

確定這裏是我的代碼:

$(".contentPanel").click(function() { 
    $(this).siblings().animate({height: minHeight,},500).removeClass("active"); 
    $(this).animate({height: maxHeight,},500).addClass("active"); 
    $('li').removeClass("active"); 
    $(this).children('ul').children('li').addClass("active"); 
    $('.infoPanelSlider').removeClass("active"); 
    $(this).children('.infoPanelWindow').children('.infoPanelSlider').addClass("active"); 
}); 

上述工作,主動「contentPanelSlider」裏面的li元素被賦予類活躍。

接下來一位是我的「M卡:

我想寫這樣:

$( 'li.active')點擊(函數()......做點什麼

但'積極的部分似乎沒有工作 - 它的工作原理,如果我只是針對'李',沒有活動類選擇器...

我想知道這是否與事實有關活動類是由JQuery即時添加的,而不是在樣式表中進行硬編碼 - 但這是完整的Ë想..

請如果你能幫助,我不介意火燒......

+0

一個側面說明,在你的對象尾隨逗號:'{高度了minHeight,}'會在IE中打破了語法錯誤。刪除它... – gnarf

+1

另外 - 而不是調用jQuery 4次來解析'$(this)'你更喜歡'var $ this = $(this)'''然後使用'$ this'進一步操縱 – gnarf

回答

2

您可以在處理程序附加到所有li,並檢查他們是否有active類:

$('li').click(function() { 
    if($(this).is('.active')) { 
     // do more 
    } 
}); 

即使更好(如果你有很多li)是delegate事件。這隻會添加一個事件處理程序(而以前的解決方案將添加一個事件處理程序到每個 li元素,從而消耗更多的內存)。你只需要擁有一個共同的祖先:

ancestor.delegate('li.active', 'click', function() { 
     // do more 
}); 

$('li.active')只會如果li■找這個類的時刻,當你在處理器執行時分配處理器無法正常工作。因此:如果沒有li元素與此類尚未

$(".contentPanel").click(function(){}); 
$("li.active").click(function(){}); 

將無法​​正常工作,但這

$(".contentPanel").click(function() { 
    // add class to li 
    $('li.active').click(function(){}); 
}); 

會工作。但它也會每次添加事件處理程序,因此分配一次並且測試更好。

2

是的,你的懷疑是正確的。 jQuery選擇器在執行時解析。如果您在起始網站期間正在尋找li.active,則無法匹配。 jQuery提供了live()delegate(),它可以通過檢查更高級別的每個點擊事件來解決此問題。

// will match any click event on any li with the class active when it is clicked: 
$('li.active').live('click', function() { 
    alert('Active Clicked'); 
}); 
2

是的。它的發生是因爲該課程是在飛行中添加的。 $('li.active')。live('click',function(){ // Do something。 });使用jquery的實時函數將點擊事件綁定到li。

0

如果活不工作,你可以嘗試綁定:

$('li.active').bind('click',function(){ 
//do something 
});