Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.11.2009, 12:24
Новичок на форуме
Отправить личное сообщение для Arseo Посмотреть профиль Найти все сообщения от Arseo
 
Регистрация: 20.11.2009
Сообщений: 3

Прелоуд картинок не работает в Опере
Помогите, пожалуйста, все перепробовал, не могу докопаться в чем дело!

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

Проблема в том, что скрипт работает в FF и IE, но не работает в Опере. В Опере загружаются только 2 первые картинки и все.

Код скрипта (я в js новичок, наверное, скрипт написан через ж.. но - работает):
<script language="javascript" type="text/javascript">
// images preload

function def_img_src (npreload)
{
img_html_name = eval ("img_html" + npreload);
var src_array = new Array();
src_array = img_html_name.split('src="');
src_array = src_array[1].split('"');
var img_src = src_array[0];
return img_src;
};

function hitr_preload(npreload)
{
     nnn = npreload+1;
     var img_html_name = new Array();
     var hiddenImgNumber = new Array();
     img_html_name[npreload] = eval ("img_html" + nnn);
     hiddenImgNumber[npreload] = new Image();
     hiddenImgNumber[npreload].src= def_img_src (npreload+1);
     hiddenImgNumber[npreload].onload = function() {document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];}
     // 	возвращает контент второго td внутри (npreload+1)-го li в документе.

};

var npreload=1;

</script>


На странице следующая картина (там еще код для jCarousel - частично убрал для простоты восприятия):

<div onClick="npreload++; hitr_preload(npreload);"><a href="javascript:void(0)">Вниз</a></div>

      <ul class="jcarousel-list">
<li class="jcarousel-item-1">
<table style="text-align: right; width: 708px; height: 491px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="354">
<table style="height: 491px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><img title="Ornella." src="/img/gallery/2.jpg" alt="Ornella." width="354" height="489" name="img1" onLoad="hitr_preload(npreload)" /></td>
</tr>

</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</li>


<li class="jcarousel-item-2">

<table style="text-align: right; width: 708px; height: 491px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="354">
<table style="height: 491px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>

<td><script language="javascript" type="text/javascript">var img_html2 = '<img style="width: 354px; height: 491px;" title="Iside." src="/img/gallery/1.jpg" alt="Iside." width="354" height="491" />';</script></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</li>

<li class="jcarousel-item-3">
...
</li>
...
</ul>
Ответить с цитированием
  #2 (permalink)  
Старый 20.11.2009, 12:26
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

События onload у картинки устанавливайте до установки src.
Ответить с цитированием
  #3 (permalink)  
Старый 20.11.2009, 14:13
Новичок на форуме
Отправить личное сообщение для Arseo Посмотреть профиль Найти все сообщения от Arseo
 
Регистрация: 20.11.2009
Сообщений: 3

Kolyaj, спасибо за ответ.
Переписал так, но, к сожалению, не помогло:
<script language="javascript" type="text/javascript">
// images preload
 
function def_img_src (npreload)
{
img_html_name = eval ("img_html" + npreload);
var src_array = new Array();
src_array = img_html_name.split('src="');
src_array = src_array[1].split('"');
var img_src = src_array[0];
return img_src;
};
 
function hitr_preload(npreload)
{
     nnn = npreload+1;
     var img_html_name = new Array();
     var hiddenImgNumber = new Array();
     img_html_name[npreload] = eval ("img_html" + nnn);
     hiddenImgNumber[npreload] = new Image();
     hiddenImgNumber[npreload].onload = function() {document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];}
     //     возвращает контент второго td внутри (npreload+1)-го li в документе.
     hiddenImgNumber[npreload].src= def_img_src (npreload+1);
 
};
 
var npreload=1;
 
</script>

Последний раз редактировалось Arseo, 20.11.2009 в 19:46.
Ответить с цитированием
  #4 (permalink)  
Старый 20.11.2009, 19:45
Новичок на форуме
Отправить личное сообщение для Arseo Посмотреть профиль Найти все сообщения от Arseo
 
Регистрация: 20.11.2009
Сообщений: 3

Уф, разгребся, вроде. Перепробовал кучу способов, так и не понял, правда, почему некоторые работают, а некоторые - нет (хотя в похожих случаях у других работало).

Заработало, когда поменял
hiddenImgNumber[npreload].onload = function() {document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];}


на

if (hiddenImgNumber[npreload].complete) {document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];};


При этом заработало в Опере, но перестало работать в IE. Поэтому порылся в инете и добавил еще

// IE:
   hiddenImgNumber[npreload].onreadystatechange = function() {
      if(this.readyState == "loaded"  || this.readyState == "complete") 
      {
      document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];
      }
   };


В итоге получился такой скрипт, который работает в FF, IE и Opera:
<script language="javascript" type="text/javascript">
// images preload

function def_img_src (npreload)
{
img_html_name = eval ("img_html" + npreload);
var src_array = new Array();
src_array = img_html_name.split('src="');
src_array = src_array[1].split('"');
var img_src = src_array[0];
return img_src;
};

function hitr_preload(npreload)
{
     nnn = npreload+1;
     var img_html_name = new Array();
     var hiddenImgNumber = new Array();
     img_html_name[npreload] = eval ("img_html" + nnn);
     hiddenImgNumber[npreload] = new Image();

// FF and Opera:
if (hiddenImgNumber[npreload].complete) {document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];};
     // 	возвращает контент второго td внутри (npreload+1)-го li в документе.

// IE:
   hiddenImgNumber[npreload].onreadystatechange = function() {
      if(this.readyState == "loaded"  || this.readyState == "complete") 
      {
      document.getElementsByTagName('li')[npreload].getElementsByTagName('td')[1].innerHTML = img_html_name[npreload];
      }
   };

     hiddenImgNumber[npreload].src= def_img_src (npreload+1);

};

var npreload=1;

</script>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скрипт multibox для joomla - не работает в опере lamanzh Opera, Safari и др. 17 26.06.2009 12:35
roktabs не работает в Опере greatilya Opera, Safari и др. 15 21.05.2009 18:02
Скрипт не работает в опере, работает в IE XpycTuk Общие вопросы Javascript 9 06.03.2009 15:50
Не работает скрипт в Опере stosen Элементы интерфейса 34 03.11.2008 20:38
insertBefore выдаёт ошибку и не работает на опере и фоксе SunnyDay Общие вопросы Javascript 3 19.09.2008 12:08