2012-09-26 163 views
1

我正在创建一个if语句来激发不同的功能。有没有更好的方法可以完成此功能?JavaScript if语句

$("#slide01-bttn").click(function() { 

    if ($("#slide-1").is('#featured_ul li:nth-child(1)')) 
    { 
    alert("First Child"); 
    moveSlideFirstChild(); 
    } 

    if ($("#slide-1").is('#featured_ul li:nth-child(2)')) 
    { 
    alert("Second Child"); 
    moveSlideSecondChild(); 
    } 

    if ($("#slide-1").is('#featured_ul li:nth-child(3)')) 
    { 
    alert("Third Child"); 
    moveSlideThirdChild(); 
    } 

    if ($("#slide-1").is('#featured_ul li:nth-child(4)')) 
    { 
    alert("Fourth Child"); 
    moveSlideFourthChild(); 
    } 
}); 
+0

如果'#slide-1'将永远是那些li元素之一,那么您可以使用['.index()'方法](http://api.jquery.com/索引/)来查看它是哪个li,并将moveX()函数与作为参数传递的索引一起使用的更通用的函数组合在一起... – nnnnnn

+2

您能向我们展示'moveSlide ... Child'功能?我想这个论点会更容易。 – Bergi

+0

可能,任何你可以发布html&moveSlide [number] Child()代码的机会,以便我们可以更好地了解发生了什么? – MLeFevre

回答

1

你当然可以简化你的代码,这

var pos = $("#slide-1").prevAll().length; 
switch (pos) 
{ 
    case 0: 
     ... 
     break; 
    case 1: 
     ... 
     break; 
    ... 
    default: 
     ... 
     break; 
} 

但似乎你应该优化你的方法是移动的子元素到只有一个功能,而不是ň所以你可以做一个简单的电话:

var elem = $("#slide-1"); 

// pass position AND element because you'll likely use it inside 
moveSlideChild(elem.prevAll().length, elem); 

你当然可以只通过在元素和获取位置内。并保存一些元素选择,因为你正在做许多jQuery元素选择器调用。这将使您的代码显着加快并优化。

+1

你比我快一点lol –

+0

@RobAngelier:正如阿甘正口如是说:*发生了什么*;) –

+0

Kortinik我猜是的! –

1

我认为你可以做的是最好的事情,以paramatize您moveSlide功能

function moveSlide(childNumber) { 

    //Grab the child element you are looking for 
    //Move it code 
} 

真的,你应该能够做到与李娜IDS的东西简化它甚至更多。我不确定HTML是如何布局的。如果你能提供小提琴,我们可能会取得更多进展。

+1

pedant“parameterize”/ pedant – jbabey

1
$("#slide01-bttn").click(function() { 
    var slide = $("#slide-1"); 
    var index = $('#featured_ul li').index(slide); 
    var position = ["First", "Second", "Third", "Fourth"][index]; 
    if (position) { 
     alert(position+" Child"); 
     // assuming they are global functions: 
     window["moveSlide"+position+"Child"](); 
    } 
}); 

如果你的职责是局部变量,你仍然可以做

var fn = [moveSlideFirstChild, moveSlideSecondChild, moveSlideThirdChild, moveSlideFourthChild][index]; 
    if (fn) fn(); 

但我真的建议paramatize你moveSlide功能,让你只需要一个需要移动作为元素参数:

moveSlide(slide); 
+0

好主意,但**全球范围**? –

+0

全局方法附加到窗口对象,并可以执行此操作:window.moveSlide(slidenum); –

+0

我没有说我喜欢它:-)它[对于局部变量不可能](http://stackoverflow.com/q/39960/1048572) - 如果真的需要你应该使用一个对象来存储函数不同 – Bergi

1

你可以使用一个开关来完成这项工作:

$("#slide01-bttn").click(function() { 
var pos = $("#slide-1").prevAll().length; 
switch(pos) 
{ 
case 0: 
case 1: 
    moveSlide(pos); 
    break; 
default: 
    //code to be executed if pos is different from case 0 and 1 
} 
} 

function moveSlide(childNumber) { 

    //Grab the child element you are looking for 
    //Move it code 
} 
+0

错字,我的错,对不起 –

0

如果moveSlideNChild()都做类似的事情,这将是最好的应用一些抽象减少代码量。您可以致电

var $list = $('#featured_ul li');    // set here for cacheing 
var $slide = $("#slide-1");     // set here for cacheing 

$("#slide01-bttn").click(function() { 
    var position = $list.index($slide); 
    if(position >= 1 && position <= 4) {  // only want 1 through 4 
     alert('Child ' + position); 
     moveSlideChild(position); 
    } 
}