Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос по JavaScript
 
 автор: Mn_Specter   (07.02.2008 в 18:38)   письмо автору
 
 

Господа, возникла коя-какая проблема.
Вообщем ситуация такая: На сайте есть фотогалерея. Картинки в ней открываются хитрым образом без полной перезагрузки страницы. Выглядит примерно так:
<div id="foto" style="width: 500px; height: 500px; background: url('.$this->foto['foto'].') center no-repeat;">С помощью JavaScript меняется параметр ...style.background = '...' соответственно для каждой вновь открываемой картинки. То есть картинка отображается как фон, заданный в style тэга <div>.
Проблема в том, что во всех браузерах все нормально, а в Опере возникает следующий косяк - например, у нас сейчас отображается горизонтальная картинка 500х200, а после нее мы загружаем вертикальную картинку 200х500. Так вот новый фон (в нашем случае - фото из галереи) почему-то обрежется по высоте предыдущей (то есть отобразится только 200х200, а по 150 пикселей снизу и сверху отрежутся). Причем при повторном нажатии на на ссылку отображения новой картинки появится и ее остальная часть. Кроме того, при повторном переходе с первой картинки на вторую все сразу отображается нормально (то есть размер второй картинки уже прокешировался и она сразу выводится в полном размере).
Я понимаю, что это уже скорее косяк Оперы, а не скрипта. Вообщем вопрос такой: можно ли этот глюк как-то обойти - например, сделать чтобы для Оперы нажатие на ссылку отображения фотки делалось принудительно двойным (то есть тыкаешь 1 раз, а нажимается как бы 2) - ведь при повторном нажатии на ссылку отрезанная часть догружается. Или еще как-то обмануть Оперу. Я просто в JavaScript не силен (больше по части PHP), а менять полностью структуру вполне рабочей галереи из-за глюков Оперы как-то не хочется...[/b]

   
 
 автор: вялый   (07.02.2008 в 20:03)   письмо автору
 
   для: Mn_Specter   (07.02.2008 в 18:38)
 

Ммм попробуйте поиграться со свойствами "position" и "display"

   
 
 автор: Dimon_K   (07.02.2008 в 20:27)   письмо автору
 
   для: Mn_Specter   (07.02.2008 в 18:38)
 

Я не уверен что поможет, но если после того как размеры картинок прокешировались они выводятся нормально, можно создать предзагрузчик для картинок. Он прокеширует все картики, т. е. после загрузки страници все картинки уже будут в кеше браузера. Предзагрузчик выглядет так:
function preloadImages() {
    if(!document.images) return;
    arg=preloadImages.arguments;
    upImages=new Array();
    for(var i=0;i<arg.length;i++) {
        upImages[i]=new Image();
        upImages[i].src=arg[i];
    }
}
window.onload=function() {
    preloadImages(img1,img2,...,imgN);
}

Может поможет

   
 
 автор: вялый   (07.02.2008 в 21:05)   письмо автору
 
   для: Mn_Specter   (07.02.2008 в 18:38)
 

Попробуйте ещё такой финт, хз поможет или нет

with(document.getElementById("foto").style)
          {width="";
                           height="";
                          backgroundImage="url('...............')";
                            width="500px";
                            height="500px";  
                          }

код не тестировался, так что возможны ошибки

   
 
 автор: Mn_Specter   (08.02.2008 в 14:50)   письмо автору
 
   для: вялый   (07.02.2008 в 21:05)
 

Что-то ни тот, ни другой способ результата не дает :(
Хотя, вполне вероятно, что я просто не правильно делаю что-то (говорю же, в JavaScript не силен).
Вообщем если подробнее, то ситуация там такая:
Сама картинка, как я уже говорил, выводится вот таким кодом:

<div id="foto_conteiner" style="width: 500px; height: 500px; background: url('.$this->foto['foto'].') center no-repeat;">'.$sale.'</div>

Меню с превьюшками, щелчок по которым выводит это самое изображение задается так:

<div class="foto_sub">
                            <a href="#" onclick="Foto_ch(\''.$foto['foto'].'\','.$foto['id'].');">
                            <img src="./galery/'.$foto['foto_mini'].'" width="'.$size1[0].'" height="'.$size1[1].'" alt="'.$foto['name'].'" title="'.$foto['name'].'"  class="'.$class.'" id="foto_'.$foto['id'].'" />

                </a>
                          </div>

Все JavaScript-ы хранятся в отдельном файле:

function _get(a){ return document.getElementById?document.getElementById(a):null}

galery_engine = function() {

    if (_get('sub') == null) return;

    li = _get('sub').childNodes;



for (i = 0; i < li.length; i++) {


    if(li[i].tagName == 'LI')
    {
            li[i].onmouseover = function() {

                this.className += 'here';

            }

            li[i].onmouseout = function() {

                this.className = this.className.replace('here', '');

            }
            li[i].onclick = function() {

                window.location = this.id;

            }

    }else if(li[i].tagName == 'DIV'){
        var div = li[i].childNodes;
        for(j = 0;j<div.length;j++) {

            if(div[j].tagName == 'DIV') {

                img = div[j].childNodes;

                for(m = 0;m<img.length;m++) {

                    if(img[m].tagName == 'A') {

                        link = img[m].childNodes;

                            for(k = 0;k<link.length;k++) {

                                if(link[k].tagName == 'IMG') {

                                    link[k].onmouseover = function() {

                                        if(this.className != 'im_foto_sel') {
                                            this.className = 'im_foto_hov';
                                        }

                                    }
                                    link[k].onmouseout = function() {
                                        if(this.className != 'im_foto_sel') {
                                            this.className = 'im_foto';
                                        }

                                    }

                                }

                            }

                    }

                }

            }

        }

    }

}
}

window.onload = galery_engine;


function Foto_ch(id,id1) {

   var foto = _get('foto_conteiner');
   var par = _get('picture');
   var foto_mini = _get('foto_'+id1);
   var sub = _get('sub');
   var refreshCC;

  foto.style.background =  'url(galery/'+id+') center no-repeat';


  var fotos =  sub.getElementsByTagName('IMG');


 for (i = 0; i < fotos.length; i++) {

        if(fotos[i].tagName == 'IMG') {

            fotos[i].className = 'im_foto';

        }

 }

if(_get('frame')) {
_get('frame').innerHTML =_get('frame').innerHTML;
}

}

Объясните пожалуйста дураку на пальцах, куда что дописать нужно :)

   
 
 автор: Mn_Specter   (09.02.2008 в 18:09)   письмо автору
 
   для: Mn_Specter   (08.02.2008 в 14:50)
 

Всем спасибо за помощь! Проблема решилась.
Если в двух словах, то основная суть была в том, что менять скриптом нужно весь div, а не только его style.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования