простенький скрипт(листалка фоновых изображений) не работает в хроме и сафари
мой первый скриптик. сильно не смейтесь :)
суть - листалка картинок, заданных фоном хедеру. две кнопки - ссылки - вперед и назад.
<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 |
Работает! :D
|
Цитата:
|
Работает.
|
LostSenSS, посмотри как используется бекграунд в объектной модели...
http://htmlbook.ru/css/background Почти в самом низу... |
Цитата:
попробовал писать window вместо document. и вместе с ним. и писать background вместо cssText. так не работает даже в лисе с оперой :/ |
во-первых, пиши так:
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 |
Цитата:
console.log(name, n); и смотришь в консоль "Инструментов разработчика" |
>>>> if(n< 0) n= count; <<<<
|
Цитата:
|
Цитата:
жмешь назад выводится -1 Aetae, Цитата:
если n стал -1 тогда n становится максимальным (т.е. в данном случае 2) и отображается последняя картинка. объясните пожалуйста что не так, замучался уже возиться с этим скриптом :/ |
Цитата:
|
оно совсем не листает?
а console.log поставь перед
document.getElementById('header').style.background = 'url(...)';
такой console.log(n, name, name[n]); и интересует, что оно выведет в момент когда происходит ошибка. Ты просто делаешь, то что тебе говорят, не пытаясь понять? |
Цитата:
вперед выводит 0 "" undefined назад выводит -1 "" undefined получается что сама n считается, но во первых не правильно (в случае нажатии кнопки вперед n должна стать 1, в случае кнопки назад - 0) во вторых n не подставляется видимо в массив name. ибо не определен выходит именно он. странно, что в опере и лисе все отлично работает |
во-первых выложи весь код полностью, и желательно, чтобы его на форуме же можно было и запустить
Цитата:
var a = "";
alert(a);
alert(a[0]);
alert(""[0]);
|
x-yuri вот рабочий пример. оставил самое необходимое только.
сразу с форума вряд ли получится запустить, там же картинки. http://zalil.ru/30375469 300кб |
Цитата:
обнови браузеры в каких не работает. полгода назад он бы и фоксе не запустился или вставляй через document.имя элемента .src=ссылка во всех будет работать. а через ид выделывается |
Цитата:
по поводу document.имя элемента .src=ссылка чет не очень понял ( |
<script> var name = [1, 2, 3]; name[0] = 5; alert(name[0]); </script> |
Цитата:
но от чего так? у меня хром выводит 1цу, а лиса - 5. по логике тут 5. присваиваем элементу массива значение 5 потом выводим этот элемент. от куда чертов хром берет 1цу непонятно |
Цитата:
|
да не при чем тут обращение через 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>
|
уже увидел на что все ему внимание обращали.я имел в виду конкретное свойство src
|
кстати, второй пример - для общего развития. Лучше всегда создавать переменные с помощью var и никогда не удалять их ;) Если нужно удалять, то для этого существуют ассоциативные массивы (объекты, в случае javascript)
|
засунул все объявления внутрь функции и все везде заработало, спасибо
|
Вложений: 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, время: 07:17. |