2012-02-11 6 views
4

Кто-нибудь знает, что я делаю неправильно? Я пытаюсь изменить порядок отображения некоторых изображений, я хочу, чтобы изображения менялись вправо/влево на одно место каждый раз, когда я нажимал кнопку. Это то, что я пробовал, но не повезло.Использование JQuery для изменения порядка элементов

Любая помощь или понимание будет по-настоящему оценили

$("#rightShift").click(function(){ 
    $("img").hide(); 
    var count = $("img").size(); 
    $("img").each(function(i) { 
     var indexImg = count - i; 
     $("img:eq(indexImg)").show(); 
    }); 
}); 
$("#leftShift").click(function(){ 
    $("img").hide(); 
    $("img:last").prependTo("img"); 
    $("img").show(); 
}); 
+0

Совет: Блок кода должен быть префикс новой строки. Каждая строка кода в блоке кода должна иметь префикс четырьмя пробелами. Backticks следует использовать только для встроенного кода. –

+0

Предоставьте свой html также – Sotiris

+0

Можете ли вы разместить html, относящийся к этой части? – elclanrs

ответ

16

Предполагая, что вы хотите, чтобы это работало как карусель, которая идет вокруг (последнее изображение станет первым, когда вы смещаются вправо), то это, как я хотел бы сделать это:

$("#rightShift").click(function(){ 
    $("img:last").detach().insertBefore("img:first"); 
}); 

$("#leftShift").click(function(){ 
    $("img:first").detach().insertAfter("img:last"); 
}); 
+3

Это именно то, что я хочу! Большое спасибо. Я только что отредактировал функцию RightShift так, чтобы она вставлялась перед первым элементом, так, как вы его вставляли после первого элемента, и что он не менялся. Но еще раз спасибо за то, что указал мне в правильном направлении! – user1204301

+0

О, ты прав.Я только что обновил свой ответ. Благодаря! – Diego

4

Вы пытаетесь ссылаться на переменную внутри строки. Это бессмысленно.
Вы на самом деле имел в виду:

$("img:eq(" + indexImg + ")").show(); 

Но более эффективная реализация:

$(this).prev().show(); 

Наиболее эффективная реализация без побочных эффектов:

$("#rightShift").click(function(){ 
    var $images = $("img"); // <-- Reference to all images 
    $images.hide(); 
    //var count = $images.length; //<-- Unused variable, delete it? 
    $images.each(function(i) { 
     $(this).prev().show(); 
    }); 
}); 
$("#leftShift").click(function() { 
    var $images = $("img"); 
    $images.hide(); 
    $images.last().prependTo("img"); // OR: $images.before($images.last()); 
    $images.show(); 
}); 
+0

В случае, если вам интересно, почему я заменил '$ (" img ")' на '$ images':' $ ("img") 'является относительно дорогой функцией. Предполагается, что коллекция является постоянной во всей функции, поэтому вы должны кэшировать коллекцию в переменной. Анология: Когда вы строите дом, вы будете держать гвозди вместе с вами, а не бросать их и ходить в магазин, чтобы покупать новые, когда они вам понадобятся. –

+0

Реализация может работать, но не самая эффективная ... Вы объявляете 'var $ images = $ (" img ");' дважды без причины, просто объявляйте ее снаружи. И вы должны связать все эти вызовы '$ images', например'. Images.hide(). Each(); 'и' $ images.hide(). Last(). PrependTo ('img'). End(). show(); ' – elclanrs

+0

@elclanrs Ваша реализация имеет побочные эффекты. Вы предполагаете, что количество изображений постоянно является постоянным, в то время как также возможно, что изображения добавляются/удаляются между загрузкой страницы и событием клика. Хранение коллекции в переменной дешевле, чем вызов функции ('.end()'). –

1

Это:

$("img:eq(indexImg)").show(); 

Должно быть так:

$("img:eq(" + indexImg + ")").show(); 

Не уверен, что, если другие вещи неправильно, хотя.

Смежные вопросы