2014-05-17 18 views
-1

所以我有這樣的代碼在我script標籤:jQuery的不執行

$(function(){ 
    $("#news-link-1").click(runAccordion(1)); 
    $("#news-link-2").click(runAccordion(2)); 
    $("#news-link-3").click(runAccordion(3)); 
    $("#news-link-4").click(runAccordion(4)); 
    $("#news-link-5").click(runAccordion(5)); 
    $("#news-link-6").click(runAccordion(6)); 
    $("#news-link-7").click(runAccordion(7)); 
    $("#news-link-8").click(runAccordion(8)); 
    $("#news-link-9").click(runAccordion(9)); 
    $("#news-link-10").click(runAccordion(10)); 
    $("#news-link-11").click(runAccordion(11)); 
    $("#news-link-12").click(runAccordion(12)); 
}) 

但對於一些奇怪的原因,我可以在裏面有隻有一個行(條件)僅執行此功能。

我該如何執行這個函數裏面的所有行?或者我可能需要一個if()聲明?

編輯: 如果我在一個函數中使用的if()語句,每一個語句將覆蓋前一個:

$(function(){ 
    if ($("#news-link-1").click){ 
     runAccordion(1) 
    } 
    if ($("#news-link-2").click){ 
     runAccordion(2) 
    } 
}); 
+2

聽過[DRY(http://en.wikipedia.org/wiki/Don't_repeat_yourself)? – plalx

+0

對不起,我在jQuery上很小氣。那好吧,我該怎麼辦?好吧,爲什麼downvoting?我剛剛問了一個可能對你很簡單的問題@downvoter,但我需要時間學習jQuery。 – PowerUser

+0

你認爲這個問題的標題是好的嗎?你應該學習基本而不是jQuery。 – hawk

回答

0

這裏的問題是,你的功能都被在頁面加載時執行,而不是點擊元素時。

$("#news-link-1").click(runAccordion(1)); 

相反,這些行應該看起來更像是這樣的:

$("#news-link-1").click(function(){ 
    runAccordion(1); 
}); 

請注意,在第二匿名函數包裝,這使得是讓你連接的功能是執行runAccordion一個。第一種方式在運行時執行runAccordion,所以例如如果您runAccordion方法返回「假」,你將基本上是寫:

$("#news-link-1").click(false); 

編輯:

作爲一個更好的建議的解決方案,也許你可以試試這樣的事情,這是一個多一點枯燥上述意見建議:

HTML:

<a href="#" class="news-link" data-news-id="1">Some news link</a> 

JS:

$(function(){ 
    $(".news-link").each(function(){ 
     $(this).click(function(){ 
      runAccordion($(this).data("news-id")); 
     }); 
    }); 
}); 
1

您正在調用頁面加載功能。您應該使用()(即$("#news-link-1").on('click', func))而不調用函數來傳遞函數,否則函數的返回值將設置爲事件處理函數。因爲這裏要一個參數傳遞給函數,你應該使用其他功能:

$("#news-link-1").click(function() { 
    runAccordion(1); 
}); 

不過,我會建議增加類的元素,並使用index方法:

var $links = $(".news-links").on('click', function() { 
    var i = $links.index(this) + 1; 
    runAccordion(i); 
}); 

現在的選擇在runAccordion功能匹配的目標元素可以使用.eq()方法:

var $accordions = $('.accordions'); 
// ... 
var $target = $accordions.eq(i); 

請注意,這兩個indexeq方法是從零開始的!

+0

我不知道爲什麼,但它不適合我。 – PowerUser

+0

編輯的問題。我想我無論如何都有同樣的問題...... – PowerUser

0

在您的代碼中,由於runAccordion(1)立即調用runAccordion函數,因此您沒有正確傳遞函數引用作爲click處理函數。

沒有任何標記的變化,你可以做以下留DRY

$(function(){ 
    $('[id^="news-link-"]').click(function() { 
     runAccordion(+this.id.split('-').pop()); 
    }); 
});