Сжатие повторяющегося кода JQuery - PullRequest
1 голос
/ 03 апреля 2010

У меня есть страница с большим изображением и множеством миниатюр. Когда вы наводите курсор мыши на миниатюру, основное изображение меняется на изображение, на которое вы только что навели курсор мыши. Проблема в том, что чем больше у меня миниатюр, тем больше повторяется код. Как я мог уменьшить это?

Код Jquery выглядит следующим образом.

<script type="text/javascript">  
    $('#thumb1')
.mouseover(function(){  
$('#big_img').fadeOut('slow', function(){  
$('#big_img').attr('src', '0001.jpg');  
$('#big_img').fadeIn('slow');  
            });  
        });  
    $('#thumb2')  
        .mouseover(function(){  
            $('#big_img').fadeOut('slow', function(){  
                $('#big_img').attr('src', 'p_0002.jpg');  
                $('#big_img').fadeIn('slow');  
            });  
        });  
     $('#thumb3')  
        .mouseover(function(){  
    $('#big_img').fadeOut('slow', function(){  
                $('#big_img').attr('src', '_img/p_0003.jpg');  
                $('#big_img').fadeIn('slow');  
            });  
        });  
     $('#thumb4')  
        .mouseover(function(){  
            $('#big_img').fadeOut('slow', function(){  
                $('#big_img').attr('src', '0004.jpg');  
                $('#big_img').fadeIn('slow');  
            });  
        });  
</script>

#big_img = идентификатор полноразмерного изображения

#thumb1, #thumb2, #thumb3, #thumb4 = идентификаторы миниатюр

Основной код страницы - PHP, если это помогает.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2010

$(this) твой друг. Вам также необходимо разработать какую-то номенклатуру, которую вы можете использовать для сопоставления имен файлов и идентификаторов. Обычно я использую PHP для генерации HTML, но добавляю специальные атрибуты, которые обрабатывают имена файлов:

// PHP GeneratedContent

<?php

while(/* some range */) {
    $i = 1;
    $output .= '<element class="thumb" rel="p_' . $i . '.jpg">';
    $i++;
}

echo $output;
?>

Тогда я пойду на следующий шаг:

$('.thumb').mouseover( function() {
    var link = $(this).attr('rel');

    /* Now that you have the link, just put it into whatever function you need to */
});

Метод Fehays определенно работает, но в этом случае у вас не будет тонны ненужных идентификаторов, и вам не придется делать ненужную передачу параметров. Он будет автоматически распространяться на каждый экземпляр в DOM с классом thumb.

2 голосов
/ 03 апреля 2010

Прежде всего, вы должны изменить свой код так, чтобы на каждом миниатюре был легко найти «класс».

Если у вас есть

<img id="thumb1" scr=""/>
<img id="thumb2" scr=""/>
..

Ваш HTML должен выглядеть как

<img id="thumb1" class='thumb' scr=""/>
<img id="thumb2" class='thumb' scr=""/>
..

Во-вторых, вы должны убедиться, что у вас есть идентифицируемый шаблон между всеми вашими миниатюрами и их большими аналогами. В вашем коде у нас есть

0001.jpg
p_0002.jpg
_img/p_0003.jpg
0004.jpg

какова ваша организация для ваших файлов?

Давайте пока представим, что миниатюры имеют тот же src, что и изображения ошибок

Код jQuery будет сокращен до:

$('.thumb').mouseover(function(){

    var thumb_src = $(this).attr('src');

    // ==> add code here to transform thumb_src into the big_img src

    $('#big_img').fadeOut('slow', function(){
        $('#big_img').attr('src', thumb_src);
        $('#big_img').fadeIn('slow');
    });
});

Этот код должен работать и просто ждет алгоритм, который преобразует палец большого пальца в источник большого изображения

Я надеюсь, что это поможет вам Джером Вагнер

2 голосов
/ 03 апреля 2010

Думаю, вы могли бы написать функцию.

applyImageFade('#thumb1','0001.jpg');
applyImageFade('#thumb2','p_0002.jpg');
//etc...

function applyImageFade(thumbId, image) {
    $(thumbId).mouseover(function(){
        $('#big_img').fadeOut('slow', function(){
            $('#big_img').attr('src', image);
            $('#big_img').fadeIn('slow');
        });
    });
}
0 голосов
/ 03 апреля 2010

Я думаю, что самое чистое, что вы могли бы сделать, это расширить jQuery, включив в него нужные вам функции:

//random images pulled off of Google Image Search
src1 = "http://www.o3mobi.com/jquery.jpg";
src2 = "http://www.bioneural.net/wp-content/uploads/2008/02/jquery.jpg";

$.fn.fadeToSrc = function(src, speedOut, speedIn, callback) {
    return this.fadeOut(speedOut, function() {
        $(this).attr('src', src).fadeIn(speedIn, callback);
    });
};

$("#image").click(function () {
    $(this).fadeToSrc(src2, 1000, 4000);
});

Вы можете проверить это здесь! http://jsfiddle.net/jPYyZ/

====== Обновление =======

Если вы хотите создать систему миниатюр и предварительного просмотра при наведении курсора, это все, что нужно:

//HTML
<img class="thumbnail" src="http://www.o3mobi.com/jquery.jpg">
<img class="thumbnail" src="http://www.bioneural.net/wp-content/uploads/2008/02/jquery.jpg">
<img id="fullsized">


//CSS
​.thumbnail {
    width: 5em;
    height: 5em;
}

#fullsized {
    width: 10em;
    height: 10em;
    border: 2px solid red;
}​


//JAVASCRIPT
$.fn.fadeToSrc = function(src, speedOut, speedIn, callback) {
    return this.fadeOut(speedOut, function() {
        $(this).attr('src', src).fadeIn(speedIn, callback);
    });
};

$(".thumbnail").mouseover(function () {
    var newsrc = $(this).attr("src");
    $("#fullsized").fadeToSrc(newsrc, 1000, 1000);
});

Вы можете проверить / повозиться с этим здесь: http://jsfiddle.net/AhwH7/

...