Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2010, 02:08
Интересующийся
Отправить личное сообщение для korzhik Посмотреть профиль Найти все сообщения от korzhik
 
Регистрация: 14.07.2008
Сообщений: 25

Слайдшоу странно работает
Доброй ночи

Столкнулся с проблемой при написании простого слайдшоу для сайта.

Вот код

(function(el){
                var img = ['a1', 'a2', 'a3'], l = img.length, eff = ['fadeIn', 'fadeOut'], k = 1, i = Math.round(Math.random() * (l - 1));
                el[1].css('background', 'url(/img/' + img[0] + '.jpg) center bottom no-repeat');
                (function(){                    
                    el[(m = (i = ++i % l) % 2)].css('background', 'url(/img/' + img[i] + '.jpg) center bottom no-repeat')[eff[k ^= 1]](2000);                    
                    el[m ^= 1][eff[k ^= 1]](2000);
                    setTimeout(arguments.callee, 3000);
                })();
            })([$("#auto1"), $("#auto2")]);


Фигня в том, что при нечетном количестве элементов в массиве, на последнем элементе получается не плавная смена картинок а "перетык" такой. При четном количестве - все работает как надо. Может конечно поспать надо, но очень хочеться сегодня закончить =)

Демо страничка - http://awcentr.ru/new_file.html

Заранее спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2010, 03:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

может так ?
(function (el) {
    var img = ["a1", "a2", "a3"],
        l = img.length,
        eff = ["fadeIn", "fadeOut"],
        i = Math.round(Math.random() * (l - 1)),
        m = 0;
    el[1].css("background", "url(./img/" + img[i] + ".jpg) center bottom no-repeat");
    (function () {
        i++;
        if (i > l - 1) i = 0;
        el[m].css("background", "url(./img/" + img[i] + ".jpg) center bottom no-repeat")[eff[0]](2E3);
        m = m == 1 ? 0 : 1;el[m][eff[1]](2E3);setTimeout(arguments.callee, 3E3)
    })()
})([$("#auto1"), $("#auto2")]);

Последний раз редактировалось рони, 20.07.2010 в 03:48.
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2010, 04:08
Интересующийся
Отправить личное сообщение для korzhik Посмотреть профиль Найти все сообщения от korzhik
 
Регистрация: 14.07.2008
Сообщений: 25

рони, спасибо, без вас пришлось бы завтра с утра ковыряться...

правда я так и не понял, что изменилось, кроме удаления переменной К и сокращения тысяч

Ладно, с утра разберусь) Еще раз спасибо

итоговый вариант
(function(el){
    var img = ["a1", "a2", "a3"], l = img.length, eff = ["fadeIn", "fadeOut"], i = Math.round(Math.random() * (l - 1)), m = 0;
    (function(){
        el[m].css("backgroundImage", "url(./img/" + img[(i = ++i % l)] + ".jpg)")[eff[0]](2E3);
        el[m ^= 1][eff[1]](2E3);
        setTimeout(arguments.callee, 3E3)
    })()
})([$("#auto1"), $("#auto2")]);
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2010, 04:25
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

ты сам понял, что написал? Не работает, потому что не фиг так выпендриваться с function(){}, выражениями с побочными эффектами и просто писать мозговыносящий код... какие-то оптимизации, которые скорее всего никто не заметит... неужели по-человечески писать нельзя? Например, как-нибудь так:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Untitled Document</title>
        <style>
            .photo {
                position: absolute;
                width: 550px;
                height: 200px;
                top: 40px;
                left: 50px;
                background-position: center bottom;
                background-repeat: no-repeat;
            }
            
        </style>
    </head>
    <body>
        <div id="photo" class="photo" style="background-image: url(http://awcentr.ru/img/a1.jpg);"></div>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js"></script>
        <script type="text/javascript">
            var SlideShow = new Class({
            
                initialize: function( el, imgs ){
                    this._imgs = imgs;
                    this._firstDiv = $(el);
                    this._secondDiv = new Element('div', {'class': 'photo'})
                        .inject(el, 'after');
                    this._i = 0;
                },
                
                start: function(){
                    this.next.of(this).runPeriodically( 3000 );
                },
                
                next: function(){
                    this._firstDiv.fade('out');
                    var src = 'http://awcentr.ru/img/'+this._imgs[this._i];
                    this._secondDiv.setStyle('background-image', 'url('+src+')');
                    this._secondDiv.fade('in');
                    this._swapDivs();
                    this._i = (this._i+1) % this._imgs.length;
                },
                
                    _swapDivs: function(){
                        var t = this._firstDiv;
                        this._firstDiv = this._secondDiv;
                        this._secondDiv = t;
                    }
            });
            
            Function.implement({
				
                of: function( o ){
                    var f = this;
                    return function(){
                        return f.apply( o, arguments );
                    };
                },
                
                runPeriodically: function( interval ){
                    var f = this;
                    setTimeout( function(){
                        f();
                        setTimeout( arguments.callee, interval );
                    }, interval );
                }
            });
        </script>
        <script type="text/javascript">
            new SlideShow( 'photo', [
                'a1.jpg', 'a2.jpg', 'a3.jpg'
            ]).start();
        </script>
    </body>
</html>

Последний раз редактировалось x-yuri, 20.07.2010 в 05:34.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2010, 04:32
Интересующийся
Отправить личное сообщение для korzhik Посмотреть профиль Найти все сообщения от korzhik
 
Регистрация: 14.07.2008
Сообщений: 25

x-yuri,
Конечно понял, я же писал

А что такое выражения с побочными эффектами?

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

По оптимизации. Мой код, как минимум, в 5 раз короче получился.

Последний раз редактировалось korzhik, 20.07.2010 в 04:38.
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2010, 05:13
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от korzhik
Конечно понял, я же писал
если бы ты понял, не обращался бы на форум. Знаешь, была такая шутка: "Однажды И.И. Кашин, разговоривая с самим собой, сказал себе такое, что больше с собой не разговоривает"... Т.е. мало того, что ты пишешь в таком стиле, ты к тому же не можешь найти ошибку в своем коде. И при таком стиле количество ошибок будет всегда больше и написать кусок без ошибок практически нереально, если не что-то простое. Мой скрипт заработал с первого раза. В общем твой код - яркий пример проблем такого стиля

Сообщение от korzhik
А что такое выражения с побочными эффектами?
когда в процессе вычисления выражения изменяются переменные. Например, это
el[m ^= 1][eff[k ^= 1]](2000);

без побочных эффектов будет выглядеть так
m ^= 1;
k ^= 1;
el[m][eff[k]](2000);


Сообщение от korzhik
Не в выпендреже дело, просто пишу так и все. По крайней мере, когда знаю, что этот код кроме меня трогать не будет.
ну а ради чего это все?

Сообщение от korzhik
По оптимизации. Мой код, как минимум, в 5 раз короче получился.
короче не значит лучше. Если речь о производительности, что ты выиграл? Кроме того, твой код, как минимум, в 5 раз запутаннее. И, кстати, мой код - это только класс SlideShow, потому что Function.implement({...}) - это общий код, который может пригодится в других местах, т.е. я его мог уже написать или он мог быть частью фреймворка

Последний раз редактировалось x-yuri, 20.07.2010 в 05:16.
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2010, 07:59
Интересующийся
Отправить личное сообщение для korzhik Посмотреть профиль Найти все сообщения от korzhik
 
Регистрация: 14.07.2008
Сообщений: 25

x-yuri,
Шутка хорошая

Про код. Все зависит от задач. Для реально простых вещей, для меня такой стиль кода предпочтительнее. В своем фреймворке - пишу по-другому.

По поводу того, что я в нем запутался, ну блин, бывает, долго не спал, устал, да еще до сих пор бессонница долбит.

В прочем ладно, уже офтоп пошел
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работает в Mozilla и не работает в IE Maxidrom Events/DOM/Window 4 27.02.2010 16:37
ява-скрипт выборочно работает-не работает zeta777 Internet Explorer 0 20.01.2010 11:41
Динамическая HTML форма (FireFox - работает, IE - не работает) dm1tr1y Общие вопросы Javascript 10 11.12.2009 15:59
Не работает eval в IE ..::Silence::.. Общие вопросы Javascript 8 25.03.2009 13:16
Скрипт меню-гармошки работает выборочно Extern Элементы интерфейса 2 23.02.2009 15:32