Проблема с приложением jQuery. Это глюк или неправильная кодировка? - PullRequest
4 голосов
/ 12 апреля 2011

У меня возникла довольно простая, но раздражающая проблема.

Я пытаюсь создать своего рода календарь "выбора даты", но в стиле карусели, точно так же, как эти слайдеры изображений.

Как только пользователь нажимает на дату, <div> должен прокрутиться к центру, и его CSS должен быть изменен, анимирован.

Я нашел этот слайдер изображений, который именно то, что мне нужно: http://opiefoto.com/articles/photoslider ( Демонстрация внизу )

Все, что я хотел сделать, это снять большое изображение и кнопку воспроизведения / паузы и изменить CSS aнемного, пока, мне удалось сделать ЭТО: http://chadascinco.net/photoslider/

Люди с острым взглядом на глюки, вероятно, уже заметили это ... когда вы нажимаете на миниатюру, а затем нажимаете на другую,предыдущий сохраняет свою старую высоту , тем не менее, вы можете видеть, как он «щелкает», как будто что-то заставляет его вернуться на эту высоту.

И это моя проблема.

Если вы проверите с помощью firebug или чего-то подобного, вы заметите, что высота ИДЕТ до 66px, ноСразу после этого вернемся к 121px.

И теперь, для чего-то странного, если я снимаю изменение "верхнего" значения, высота работает отлично.Он растет и возвращается именно так, как мне нужно.Но если я положу его обратно ... Черт, пошли, сбой высоты.

Я пытался связаться с автором по электронной почте, но это было 3 дня, и я не получил ответ.

И здесь я прошу вас поделиться знаниями, я новичок с JavaScript и jQuery, так что это может быть также проблемой в моем коде.Я просто попытался использовать базовую логику программирования.

Ответственный js - "photoslider.js", и если вы выберете "FELIX Note", вы найдете заметки в каждой части, где я внес какие-либо изменения.Любые другие комментарии являются оригинальными от автора.

Строки, где работает переход, - от 265 до 287.

Если что-то, что я сказал, сбивает с толку, я был бы рад быть более точным.

Если вам, ребята, также нужно проверить оригинальный код, вы можете проверить его здесь: http://chadascinco.net/photoslideroriginal

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

Еще раз спасибо всем.

РЕДАКТИРОВАТЬ БРЕНД-НОВОСТИ : Я обнаружил один интересный факт: если вы проверите строки, которые я упомянул,вы заметите 3 анимационных вызова.

Независимо от того, что вы делаете, если вы добавите одно и то же свойство CSS к вызову SECOND как для активных, так и для неактивных элементов div, он будет мигать и вызыватьэтот глюк.Я попытался изменить цвет фона вместо высоты, изменив цвет с черного на белый и обратно.

Вот что произошло: когда я загружаю страницу, только активная черная.Хорошо.Но когда я нажимаю на другую, она становится черной, и ПРЕДЫДУЩАЯ пытается стать белой, но вынуждена снова стать черной.интересно, почему только второй звонок?Если это был первый, или последний, или каждый из них, хорошо, но ... только второй?Weird.

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Эй, у меня проблема.Дело в том, что эта библиотека не ожидает, что вы будете использовать несколько анимаций одновременно.функция SKEL.EFFECTS.Slide.animate, которая инициирует анимацию, создает поле в анимированном объекте с именем skel_animate_id, которое фактически является идентификатором таймера, настроенного для выполнения анимации.

Поскольку эта библиотека не ожидает нескольких анимаций одновременно, когда вы создаете новую анимацию, она просто делает element.skel_animate_id = setInterval(....., и если вы следуете за мной, вы поймете, что все, что было skel_aimate_id before (то есть единственная ссылка библиотеки на таймеры любой предыдущей анимации) теряется после этого назначения.

Теперь есть ступенчатая функция, вызываемая таймерами, которая отвечает за распознавание, когда анимация закончиласьи остановите сам таймер, но он сделает это, вызвав clearInterval(element.skel_animate_id);, что, очевидно, очистит только таймер, связанный с последним анимированным атрибутом.

Короче говоря, когда вы вызываете анимацию второго атрибута (передпервый завершился), вы оставляете открытый таймер, который продолжает «анимировать» первый атрибут (т.е. устанавливает его в конечное значение).

РЕДАКТИРОВАТЬ: Прямая демонстрация исправлений.

ВИННЫЙ ПОКРЫТИЕ

Линии [488-531]

SKEL.EFFECTS.Slide = {
counter: 0,
fps: 50,

//handles the animation from an attribute to an attribute
animate: function(element,cssAttribute,from,to,duration,transition){

    if(element.css('display') != 'block'){
        element.skel_old_display = element.css('display');
    }

    //if there isn't a default transition set one
    if(!transition){
        transition = SKEL.Transitions.quadOut;
    }

    //cancel any current animation

    // FELIX Note: I've commented this because when we had 3 transitions on the same element, this function would make only the first one to work.
    //SKEL.EFFECTS.Slide.stop(element);

    var startTime = new Date().getTime();

    //IE doesn't support arguments, so make a function that explicitly calls with those arguments
    element.skel_animate_id = setInterval(function(){
        SKEL.EFFECTS.Slide.step(element,cssAttribute,from,to,duration,startTime,transition);
    },(1000/SKEL.EFFECTS.Slide.fps));

    return element.skel_animate_id;
},

//cancels any animation event
stop: function(element){
    //console.log(this,element,element.skel_animate_id);
    //console.log(element.skel_animate_id);
    if(element.skel_animate_id){
        clearInterval(element.skel_animate_id);
        element.skel_animate_id = 0;
        if(element.skel_old_display){
            element.css('display',element.skel_old_display);
        }
    }

},

ВОЗМОЖНОЕ РЕШЕНИЕ

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

в SKEL.EFFECTS.Slide.animate

if (!element.skel_animate_ids){
    element.skel_animate_ids = new Object();
}

//IE doesn't support arguments, so make a function that explicitly calls with those arguments
element.skel_animate_ids[cssAttribute] = setInterval(function(){
            SKEL.EFFECTS.Slide.step(element,cssAttribute,from,to,duration,startTime,transition);
        },(1000/SKEL.EFFECTS.Slide.fps));

return element.skel_animate_ids[cssAttribute];

затем в SKEL.EFFECTS.Slide.stop

//cancels any animation event
stop: function(element,attribute){
    if(element.skel_animate_ids[attribute]){
        clearInterval(element.skel_animate_ids[attribute]);
        delete element.skel_animate_ids[attribute];
        if(element.skel_old_display){
            element.css('display',element.skel_old_display);
        }
    }

},

и в SKEL.EFFECTS.Slide.step (строка 575)

if(finished){
    SKEL.EFFECTS.Slide.stop(element,cssAttribute);
}

Я думаю, что это должно сделать, но я не могу проверить это в своем браузере.Если мой код не совсем работает, я, должно быть, что-то упустил, но я все еще уверен, что это проблема, вам просто нужно выяснить, как ее решить (или изменить библиотеки = D).Вы просто попробуйте мое предложение, дайте мне знать, как оно работает.

Приветствия

РЕДАКТИРОВАТЬ: Я не мог ждать, поэтому я взбил JSFiddle для проверки, и даработает с этими изменениями. Проверьте это .

EDIT2: Исправленная опечатка: все еще ссылалась на skel_animate_id вместо skel_animate_ids в первом бите кода.

0 голосов
/ 12 апреля 2011

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

/* var sliderCaption = $(document.createElement('div'));
sliderCaption.addClass('photoslider_caption');

sliderDiv.append(sliderCaption);

var sliderNav = $('#'+key+' .photoslider_nav').get(0);
if(sliderNav != null){
     //remove it
     $(sliderNav).remove();
} */

sliderNav = $(document.createElement('div'));
sliderNav.addClass('photoslider_nav');

Подсветка синтаксиса уже должна сказать вам, что не так. Вы прокомментировали определение критической переменной в дизайне приложения.

Попробуйте, по крайней мере, разрешить все, что связано с переменной sliderNav, там. Это та функция, которую вы пытаетесь имитировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...