Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   простенький скрипт(листалка фоновых изображений) не работает в хроме и сафари (https://javascript.ru/forum/misc/14496-prostenkijj-skript-listalka-fonovykh-izobrazhenijj-ne-rabotaet-v-khrome-i-safari.html)

LostSenSS 19.01.2011 11:20

простенький скрипт(листалка фоновых изображений) не работает в хроме и сафари
 
мой первый скриптик. сильно не смейтесь :)
суть - листалка картинок, заданных фоном хедеру.
две кнопки - ссылки - вперед и назад.

<script type="text/javascript">
    	var n=0;
   	 	var name  = new Array();
   		name[0] = 1;
	    name[1] = 2;
	    name[2] = 3;
	    var count = (name.length) - 1;
        window.onload = function() {
            document.getElementById('forward').onclick=function() {       	
            	n++;
            	if(n> count) n=0;
            	if(n< 0) n= count;
                document.getElementById('header').style.cssText='background:url("images/mainphoto'+name[n]+'.jpg")';        
            }
            document.getElementById('backward').onclick=function() {
            	n--;
            	if(n> count) n=0;
            	if(n< 0) n= count;
                    document.getElementById('header').style.cssText='background:url("images/mainphoto'+name[n]+'.jpg")';                
            }	  
        }
</script>
все работает в лисе и опере, но в хроме и сафари - нет.
В чем может быть дело?
Как я понимаю дело именно в строчке изменения css, потому что хром пытается вывести картинку с названием mainphotoundefined.jpg
т.е. не определяется переменная n

ksa 19.01.2011 11:31

Работает! :D

LostSenSS 19.01.2011 11:38

Цитата:

Сообщение от ksa (Сообщение 88626)
Работает! :D

Где работает? В хроме и сафари?

ksa 19.01.2011 16:24

Работает.

ksa 19.01.2011 16:25

LostSenSS, посмотри как используется бекграунд в объектной модели...
http://htmlbook.ru/css/background
Почти в самом низу...

LostSenSS 19.01.2011 16:50

Цитата:

Сообщение от ksa (Сообщение 88671)
LostSenSS, посмотри как используется бекграунд в объектной модели...
http://htmlbook.ru/css/background
Почти в самом низу...

[window.]document.getElementById("elementID").style.backgro und

попробовал писать window вместо document. и вместе с ним.
и писать background вместо cssText.

так не работает даже в лисе с оперой :/

x-yuri 19.01.2011 17:10

во-первых, пиши так:
document.getElementById('header').style.background = 'url(...)';
во-вторых, учись отлаживать, пишешь в какой-нибудь строчке скрипта слово debugger и браузер остановит выполнение в этом месте, если ты перед этим откроешь "Инструменты разработчика"

LostSenSS 19.01.2011 17:25

Цитата:

Сообщение от x-yuri (Сообщение 88685)
во-первых, пиши так:
document.getElementById('header').style.background = 'url(...)';
во-вторых, учись отлаживать, пишешь в какой-нибудь строчке скрипта слово debugger и браузер остановит выполнение в этом месте, если ты перед этим откроешь "Инструменты разработчика"

переписал на
document.getElementById('header').style.background ='url("images/mainphoto'+name[n]+'.jpg")'; debugger
такой вариант работает в опере и лисе но по прежднему не работает в сафари и хроме.
ошибка следующая -
Failed to load resource: the server responded with a status of 404 (Not Found)
оно и понятно, вместо значения переменной в имя файла подставляется undefined

x-yuri 19.01.2011 18:20

Цитата:

Сообщение от LostSenSS
оно и понятно, вместо значения переменной в имя файла подставляется undefined

отлично
console.log(name, n);

и смотришь в консоль "Инструментов разработчика"

Aetae 19.01.2011 18:21

>>>> if(n< 0) n= count; <<<<

x-yuri 19.01.2011 18:32

Цитата:

Сообщение от http://phpfaq.ru/humor
Как отвечают на форумах:
Идет заседание ЦК.
Министр сельского хозяйства зачитывает доклад о том, что в колхозах болеют коровы. Никто не знает, как лечить.
Брежнев: нарисуйте перед каждой коровой зеленый ромбик.
Ну, издали постановление, во всех коровниках кампания по рисованию.
Следующее заседание. Все равно коровы болеют.
Брежнев: нарисуйте перед каждой коровой фиолетовый треугольник.
Ну, опять кампания, доярки в художниц переквалифицируются...
Опять заседание.
Министр докладывает, что все коровы подохли.
Брежнев: жаль. У меня ещё много идей было...

:)

LostSenSS 20.01.2011 09:15

Цитата:

Сообщение от x-yuri (Сообщение 88698)
отлично
console.log(name, n);

и смотришь в консоль "Инструментов разработчика"

жмешь вперед выводится 0
жмешь назад выводится -1

Aetae,
Цитата:

>>>> if(n< 0) n= count; <<<<
тут где-то ошибка?
если n стал -1 тогда n становится максимальным (т.е. в данном случае 2) и отображается последняя картинка.

объясните пожалуйста что не так, замучался уже возиться с этим скриптом :/

ksa 20.01.2011 09:38

Цитата:

Сообщение от LostSenSS
вместо значения переменной в имя файла подставляется undefined

Тогда ищи где и почему пропадает твоя переменная...

x-yuri 20.01.2011 12:07

оно совсем не листает?

а console.log поставь перед
document.getElementById('header').style.background = 'url(...)';

такой
console.log(n, name, name[n]);

и интересует, что оно выведет в момент когда происходит ошибка. Ты просто делаешь, то что тебе говорят, не пытаясь понять?

LostSenSS 20.01.2011 13:59

Цитата:

Сообщение от x-yuri (Сообщение 88823)
оно совсем не листает?

а console.log поставь перед
document.getElementById('header').style.background = 'url(...)';

такой
console.log(n, name, name[n]);

и интересует, что оно выведет в момент когда происходит ошибка. Ты просто делаешь, то что тебе говорят, не пытаясь понять?

совсем не листает. при нажатии любой кнопки стартовая картинка исчезает и выводится простой белый фон.

вперед выводит
0 "" undefined
назад выводит
-1 "" undefined

получается что сама n считается, но во первых не правильно (в случае нажатии кнопки вперед n должна стать 1, в случае кнопки назад - 0) во вторых n не подставляется видимо в массив name. ибо не определен выходит именно он.

странно, что в опере и лисе все отлично работает

x-yuri 20.01.2011 17:27

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

Цитата:

Сообщение от LostSenSS
во вторых n не подставляется видимо в массив name. ибо не определен выходит именно он.

ты, видно, хотел сказать, что массив по какой-то причине undefined? А то, что console.log вывело для него пустую строку тебя не смутило?
var a = "";
alert(a);
alert(a[0]);
alert(""[0]);

LostSenSS 21.01.2011 09:48

x-yuri вот рабочий пример. оставил самое необходимое только.
сразу с форума вряд ли получится запустить, там же картинки.
http://zalil.ru/30375469
300кб

dmitriymar 21.01.2011 10:12

Цитата:

Сообщение от LostSenSS
но в хроме и сафари - нет.

ошибок вроде нет...
обнови браузеры в каких не работает. полгода назад он бы и фоксе не запустился
или вставляй через
document.имя элемента .src=ссылка
во всех будет работать. а через ид выделывается

LostSenSS 21.01.2011 10:29

Цитата:

Сообщение от dmitriymar (Сообщение 88990)
ошибок вроде нет...
обнови браузеры в каких не работает. полгода назад он бы и фоксе не запустился
или вставляй через
document.имя элемента .src=ссылка
во всех будет работать. а через ид выделывается

браузеры все последние версии, правда под макосью, но не думаю, что это существенно.
по поводу document.имя элемента .src=ссылка чет не очень понял (

x-yuri 21.01.2011 11:07

<script>
var name = [1, 2, 3];
name[0] = 5;
alert(name[0]);
</script>

LostSenSS 21.01.2011 11:24

Цитата:

Сообщение от x-yuri (Сообщение 88994)
<script>
var name = [1, 2, 3];
name[0] = 5;
alert(name[0]);
</script>

афигеть! ))
но от чего так?
у меня хром выводит 1цу, а лиса - 5.
по логике тут 5.
присваиваем элементу массива значение 5 потом выводим этот элемент.
от куда чертов хром берет 1цу непонятно

dmitriymar 21.01.2011 12:29

Цитата:

Сообщение от LostSenSS
браузеры все последние версии, правда под макосью, но не думаю, что это существенно.
по поводу document.имя элемента .src=ссылка чет не очень понял (

обращение к свойству src элемента не через id а через его свойство name

x-yuri 21.01.2011 13:13

да не при чем тут обращение через document.<имя элемента>, к тому же оно работает не для всех элементов

а причина в том, что глобальные переменные - свойства глобального объекта (упрощенно, см. ниже)
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <script type="text/javascript">
        for( var k in window ){
            var v =   k == 'name'   ? eval(k)   : '';
            document.write(k+': '+v+'<br>');
            // document.write(k+': '+window[k]+'<br>');
        }
    </script>
</body>
</html>


ну и в дополнение объявление переменной через var и создание переменной без var - это не то же самое
<script>
var a = 1;   // создаем глобальную переменную
b = 2;   // создаем свойство в глобальном объекте (window)
alert( a );
alert( b );
alert( delete a );   // нельзя удалить глобальную переменную
alert( delete b );
try {
    alert( a );
} catch( e ){ alert(e); }
try {
    alert( b );
} catch( e ){ alert(e); }
</script>

dmitriymar 21.01.2011 13:49

уже увидел на что все ему внимание обращали.я имел в виду конкретное свойство src

x-yuri 21.01.2011 14:00

кстати, второй пример - для общего развития. Лучше всегда создавать переменные с помощью var и никогда не удалять их ;) Если нужно удалять, то для этого существуют ассоциативные массивы (объекты, в случае javascript)

LostSenSS 21.01.2011 14:33

засунул все объявления внутрь функции и все везде заработало, спасибо

x-yuri 21.01.2011 16:47

Вложений: 3
вообще это делается как-то так (за исключением того, что я картинки по высоте ограничил, чтобы в окно просмотра поместились). В частности, первая картинка вставляется серверным скриптом, причем не обязательно первая по счету, а в зависимости от параметра в URL. Таким образом, поисковая система увидит все изображения и пользователь, в случае отключенного javascript или ошибок в скрипте, тоже увидит все изображения

p.s. а ты говорил, картинки нельзя вставить...
<!doctype html>
<html>
<head>   
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/mootools/1.3.0/mootools-yui-compressed.js"></script>
    <style type="text/css">
        body {
            font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", Georgia, serif;
        }
        img{
            height: 100px;
        }
        a { 
            color: #36c;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        .throbber {
            position: absolute;
            visibility: hidden;
            background: #000;

            opacity: .3;
            filter: alpha(opacity=30);
            -ms-filter: "alpha(opacity=30)";
            -khtml-opacity: .30;
            -moz-opacity: .30;
        }
        .throbber-gif {
            background: url(http://upload.wikimedia.org/wikipedia/commons/d/d2/Spinning_wheel_throbber.gif) no-repeat center;
        }
        .disabled {
            color: #999;
            text-decoration: none;
        }
    </style>
    <script type="text/javascript">
        var prefix = 'http://javascript.ru/forum/attachment.php?';

        function qs( v ){
            return new QueryString(v);
        }

        var QueryString = new Class({
            initialize: function( v ){
                v = v || location.search;
                this._assoc =   typeOf(v) == 'string'
                    ? v.substr(1).split('&')
                        .toAssoc(function( v ){
                            var kv = v.split('=');
                            return {
                                'k': decodeURIComponent(kv[0]),
                                'v': decodeURIComponent(kv[1])
                            };
                        })
                    : v;
            },
            
            val: function( n, v ){
                if( arguments.length > 1 )
                    this._assoc[n] = v;
                return this._assoc[n];
            },
            
            unset: function( n ){
                delete this._assoc[n];
            },
            
            toAssoc: function(){
                return this._assoc;
            },
            
            toString: function(){
                return   '?'+
                    this._assoc
                        .map(function( v, k ){
                            return   encodeURIComponent(k)+'='+encodeURIComponent(this._assoc[k]);
                        })
                        .join('&');
            }
        });

        Function.implement({
            'of': function( o ){
                var f = this;
                return function(){
                    return f.apply(o, arguments);
                };
            }
        });

        Array.implement({
            'toAssoc': function( f ){
                var r = {};
                for( var i=0; i<this.length; i++ ){
                    var kv = f(this[i], i, this);
                    r[kv['k']] = kv['v'];
                }
                return r;
            }
        });

        Element.implement({
            'setCoordinates': function( coords ){
                this.setStyles({
                    'left': coords['left'],
                    'top': coords['top'],
                    'width': coords['width'],
                    'height': coords['height']
                });
                return this;
            }
        });

        var Img = new Class({
            initialize: function( images ){
                this._images = images;

                this._i = this._images.indexOf( qs().val('img') );
                if( this._i == -1 )
                    this._i = 0;

                this._throbber = new Element('div', {'class': 'throbber', 'html': '<div class="throbber-gif"></div>'})
                    .inject( document.body );

                this._forward = $('forward');
                this._backward = $('backward');

                this._forward.addEvents({
                    'click': this._next.of(this).pass(true),
                    'mousedown': function(){ return false; }
                });
                this._backward.addEvents({
                    'click': this._next.of(this).pass(false),
                    'mousedown': function(){ return false; }
                });
            },

            _next: function( next ){
                if( ! this._disabled() ){
                    this._disabled( true );
                    this._load( newI.of(this)() );
                }
                return false;

                function newI(){
                    var r = next ? this._i+1 : this._i-1;
                    r %= this._images.length;
                    if( r < 0 )
                        r = this._images.length-1;
                    return r;
                }
            },

            _load: function( i ){
                var img = $('img');
                this._showThrobber( true );
                img.onload = function(){
                    this._i = i;
                    this._disabled( false );
                    this._showThrobber( false );
                }.of(this)
                img.src = prefix+this._images[i];
            },

            _showThrobber: function( show ){
                this._throbberGif = this._throbberGif || $$('.throbber-gif')[0];
                if( show ){
                    var coords = $('img').getCoordinates();
                    this._throbber.setStyles({
                        'left': coords['left'],
                        'top': coords['top']
                    });
                    this._throbberGif.setStyles({
                        'width': coords['width'],
                        'height': coords['height']
                    });
                }
                this._throbber
                    .setStyles({'visibility':   show ? 'visible' : ''});
            },

            _disabled: function( disabled ){
                if( arguments.length ){
                    var f = disabled ? 'addClass' : 'removeClass';
                    this._forward[f]( 'disabled' );
                    this._backward[f]( 'disabled' );
                }
                return this._forward.hasClass('disabled');
            }
        });
    </script>
</head>
<body>   

    <a id="backward" href="http://javascript.ru/forum/attachment.php?attachmentid=664&stc=1&d=1295611491">backward</a>

    <a id="forward" href="http://javascript.ru/forum/attachment.php?attachmentid=663&stc=1&d=1295611491">forward</a>

    <br>

    <img id="img" src="http://javascript.ru/forum/attachment.php?attachmentid=662&stc=1&d=1295611491">


    <script type="text/javascript">
        var images = ['attachmentid=662&stc=1&d=1295614554', 'attachmentid=663&stc=1&d=1295614554', 'attachmentid=664&stc=1&d=1295614554'];
        new Img( images );
    </script>

</body>
</html>


Часовой пояс GMT +3, время: 06:28.