2014-05-17 17 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()); 
    }); 
});