jQuery как да правите нещата едновременно

Изглежда не мога да разбера как да направя следното по добър начин.

Трябва да избледнявам изображение. Променете източника на изображението. След това го затъмнете отново.

Но проблемът е, че fadeOut и fadeIn трябва да са едновременно. Разбира се, начинът, по който го правя сега (прочетете няколко реда надолу), ще промени източника по време на fadeOut, което е много забележимо.

$('#lightboxImage').fadeOut('slow');
$('#lightboxImage').attr('src', 'an imagesource');
$('#lightboxImage').fadeIn('fast');

Когато просто стартирам това. променя изображението преди fadeOut.

Когато поставя двата втори реда във функцията за обратно извикване fadeOut. Има малък период от бял екран, преди новото изображение да избледнее.

Надявам се някой да ми помогне да разбера това. :)


person Weszzz7    schedule 25.10.2012    source източник


Отговори (4)


Трябва да използвате функцията за обратно извикване fadeOut. Виж отдолу,

$('#lightboxImage').fadeOut('slow', function () {
   // Callback function that will be called after fadeOut
   $('#lightboxImage').attr('src', 'an imagesource').fadeIn('fast');
});

По-долу е от документацията на jQuery,

.fadeOut( [duration] [, easing] [, callback] )

  • durationA низ или число, определящо колко дълго ще се изпълнява анимацията.
  • easingA низ, указващ коя функция за облекчаване да се използва за прехода.
  • callbackФункция за извикване след завършване на анимацията.
person Selvakumar Arumugam    schedule 25.10.2012
comment

За да направите нещо подобно, ще ви трябва функция, която връща функция за декоратор. Така че в този случай (ако приемем, че искате да приемете произволни атрибути), вие ще пишете

def format_attribs(kwargs):
    """Properly formats HTML attributes from a dictionary"""
    return ' '.join('{}="{}"'.format(key, val) for key,val in kwargs.iteritems())

def makeBold(**kwargs):
    attribs = format_attribs(kwargs)
    def _makeBold(fn):
        def wrapped():
            return '<b ' + attribs + '>' + fn() + '</b>'
        return wrapped
    return _makeBold

За да направите тази makeBold функция малко по-обща, искате да предадете аргументи към fn и да запазите друга информация, като име на функция, като използвате functools.wraps:

import functools
def makeBold(**kwargs):
    attribs = format_attribs(kwargs)
    def _makeBold(fn):
        @wraps(fn)
        def wrapped(*args, **kwargs):
            return '<b ' + attribs + '>' + fn(*args, **kwargs) + '</b>'
        return wrapped
    return _makeBold
- person Per Salbark; 25.10.2012
comment
@PerSalbark Това създава свой собствен набор от проблеми, тъй като jQuery не открива правилно зареждането на кеширани изображения без някакво бъркотия от страна на разработчика. По-добре просто предварително да заредите изображението с документа. - person Blazemonger; 25.10.2012
comment
Не става? Никога не съм имал проблеми с него. Можете ли да направите връзка към някой, който има? - person Per Salbark; 25.10.2012
comment
@PerSalbark Разбира се. - person Blazemonger; 25.10.2012
comment
@Blazemonger: Добре, това е, когато src вече съм задал. В този случай той го задава като част от функцията, така че мисля, че ще се оправи. - person Per Salbark; 25.10.2012

Използвайте функции за обратно извикване.

$('#lightboxImage').fadeOut('fast', function() {
    $('#lightboxImage').attr('src', 'an imagesource').fadeIn('fast');
});

страницата в wikipedia обяснява добре функциите за обратно извикване.

В компютърното програмиране обратното извикване е препратка към изпълним код или част от изпълним код, който се предава като аргумент на друг код. Това позволява на софтуерен слой от по-ниско ниво да извика подпрограма (или функция), дефинирана в слой от по-високо ниво.

person abhshkdz    schedule 25.10.2012
comment
Въпреки че е по някакъв начин, по който искам да вървя, все още има малък момент, в който екранът е празен. Това, което трябва да направя, е почти точно като на тази страница: fabriq.nl /moon-thinsulate-jas-navy-pf-12106.html Ако щракнете върху основното изображение, изскача лайтбокс. След това натиснете следващия бутон. Преходът, който виждате тук, е това, което търся. - person Weszzz7; 25.10.2012
comment
Опитайте да промените времето за затихване от slow на fast и вижте дали това е, което търсите. :) - person abhshkdz; 25.10.2012

Не знам дали отговорите, които хората дават, са това, което искате.

Мисля, че искате първото изображение да "избледнее" във второто изображение.

В този случай ще трябва да имате две изображения, едно зад друго.

Този зад ще трябва да бъде display: none в css.

След това можете да направите:

$('img#image1').fadeOut();
$('img#image2').fadeIn();

И първото изображение трябва да избледнее във второто.

Ще трябва да позиционирате двете изображения абсолютно така, че това на преден план да покрива фона преди избледняването.

напр. http://jsfiddle.net/vre4M/

Това също ви позволява да се връщате назад и напред: http://jsfiddle.net/vre4M/1/

person Thomas Clayson    schedule 25.10.2012
comment
А, да, точно това трябва да направя. Проблемът е, че кодът е доста сложен (донякъде съм нов както в jQuery, така и в magento.) Благодаря за примера ви, ще видя докъде ще стигна с това :) - person Weszzz7; 25.10.2012

Поставянето им на опашка ще свърши работа:

$('#lightboxImage').fadeOut('slow', function () {
  $(this).attr('src', 'an imagesource').fadeIn('fast');
  });
});

Използвайте $(this), за да не го намирате отново и отново.

РЕДАКТИРАНЕ: Актуализирах отговора си, тъй като функцията attr няма обратно извикване. Благодаря момчета.

person Pulkit Mittal    schedule 25.10.2012
comment
Добре е да знаете какво нередно се случи тук, поради което отговорът ми беше отхвърлен. Помага на хората. - person Pulkit Mittal; 25.10.2012
comment
Мисля, че вероятно сте гласували против, защото току-що сте копирали другите отговори и току-що сте променили $('#lightboxImage') на $(this). Наистина трябваше да е коментар за другите отговори, а не отделен отговор - който не предоставя нищо различно от който и да е от другите отговори. Просто е загубено място. - person Thomas Clayson; 25.10.2012
comment
@ThomasClayson той наистина не е копирал никакъв отговор, но погрешно се е опитал да дефинира обратно извикване за attr, което не мисля, че е позволено. Така че @pulkit, мисля, че сте гласували против за грешен отговор, attr няма обратно извикване. - person bool.dev; 25.10.2012