Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему onload срабатывает до того как картинка полностью проявится? (https://javascript.ru/forum/misc/39284-pochemu-onload-srabatyvaet-do-togo-kak-kartinka-polnostyu-proyavitsya.html)

koeshiro 24.06.2013 08:58

Почему onload срабатывает до того как картинка полностью проявится?
 
Здрасте. Я тут хотел сделать проверку загрузились ли все картинки на странице(Подобное хотел сделать со скриптами и линками но не знаю как =\) но когда проверял в хроме добавил трёхтонные картинки и счётчик который я сделал досчитал до 15(количество картинок) до того как они все были полностью отображены. Не подскажете почему?
x=0;
for(i=0;i<15;i++){document.getElementsByTagName('img')[x].onload=alert(x);x++;}

vadim5june 24.06.2013 09:11

может так
var x=0;
for(i=0;i<15;i++){document.getElementsByTagName('img')[i].onload=function(){alert(x);x++;}}

скрипты поддерживают onload и onerror
var sc=document.createElement('script');
sc.onload=function(){alert('load')};
sc.onerror=function(){alert('error')};
sc.src='tratata.js';
document.head.appendChild(sc);

koeshiro 24.06.2013 09:18

vadim5june,
такая, казалось бы мелоч, но сработало. Просто поставит [i] в замену [x] и картинки отрисоваились сразу после того как счёт закончился. :victory:

koeshiro 24.06.2013 09:24

Цитата:

Сообщение от vadim5june (Сообщение 258090)
может так
var x=0;
for(i=0;i<15;i++){document.getElementsByTagName('img')[i].onload=function(){alert(x);x++;}}

скрипты поддерживают onload и onerror
var sc=document.createElement('script');
sc.onload=function(){alert('load')};
sc.onerror=function(){alert('error')};
sc.src='tratata.js';
document.head.appendChild(sc);

То есть придётся создавать все скрипты на странице отдельно чтоб узнать готовы ли они или нет?

vadim5june 24.06.2013 09:28

Цитата:

Сообщение от koeshiro
То есть придётся создавать все скрипты на странице отдельно чтоб узнать готовы ли они или нет?

не обязательно можно и к уже созданным применить
можно так писать
<script src='1.js' onload='f(this)' onerror='er(this)'></script>
<script>function f(t){alert(t.src+'-loaded')}</script>

koeshiro 24.06.2013 09:31

Цитата:

Сообщение от vadim5june (Сообщение 258093)
не обязательно можно и к уже созданным применить

И как же это? Разве <script> поддерживает имя или классы? Быть может id?

koeshiro 24.06.2013 09:34

Цитата:

Сообщение от vadim5june (Сообщение 258093)
не обязательно можно и к уже созданным применить
можно так писать
<script src='1.js' onload=f(this) onerror=er(this)></script>

О понятно. А почему это дело без скобок? :blink:

vadim5june 24.06.2013 09:39

Цитата:

Сообщение от koeshiro
А почему это дело без скобок?

поставил кавычки
о каких скобках речь?

koeshiro 24.06.2013 09:43

Цитата:

Сообщение от vadim5june (Сообщение 258096)
поставил кавычки
о каких скобках речь?

Ну так ож оговарился. . . . .

koeshiro 24.06.2013 09:48

Стоп а с линками тоже самое что ли?

vadim5june 24.06.2013 09:49

c link тоже должен onload работать
http://www.w3schools.com/jsref/event_onload.asp
там написано работает с
<body>, <frame>, <frameset>, <iframe>, <img>, <input type="image">, <link>, <script>, <style>

koeshiro 24.06.2013 13:01

vadim5june,
сделал вот так.
<script>for(i=0;i<15;i++)
{doc=document.getElementsByTagName('img')[i]; doc.onload=function()
{fdoc=document.getElementsByTagName('img')[i]; ImgSrc=doc.getAttribute("src");ImgId=doc.id;alert(ImgSrc);}}
</script>
Браузер мгновенно досчитывает до 15 и выводит только адрес последней картинки.

vadim5june 24.06.2013 13:09

Цитата:

Сообщение от koeshiro (Сообщение 258128)
vadim5june,
сделал вот так.
<script>for(i=0;i<15;i++)
{doc=document.getElementsByTagName('img')[i]; doc.onload=function()
{fdoc=document.getElementsByTagName('img')[i]; ImgSrc=doc.getAttribute("src");ImgId=doc.id;alert(ImgSrc);}}
</script>
Браузер мгновенно досчитывает до 15 и выводит только адрес последней картинки.

там внутри onload i не надо использовать там this на картинку указывает
ImgSrc=this.getAttribute("src");
for(i=0;i<15;i++)
{doc=document.getElementsByTagName('img')[i]; doc.onload=function()
{var ImgSrc=this.getAttribute("src");var ImgId=this.id;alert(ImgSrc);}}

koeshiro 24.06.2013 13:15

Цитата:

Сообщение от vadim5june (Сообщение 258129)
там внутри onload i не надо использовать там this на картинку указывает
ImgSrc=this.getAttribute("src");
for(i=0;i<15;i++)
{doc=document.getElementsByTagName('img')[i]; doc.onload=function()
{var ImgSrc=this.getAttribute("src");var ImgId=this.id;alert(ImgSrc);}}

Почему о токих вещях не говориться в учебнике на этом сайте? :blink:

vadim5june 24.06.2013 13:18

Цитата:

Сообщение от koeshiro (Сообщение 258132)
Почему о токих вещях не говориться в учебнике на этом сайте? :blink:

учебник здесь хороший-наверно не все читали
про асинхронные процессы поищите

koeshiro 24.06.2013 13:20

Цитата:

Сообщение от vadim5june (Сообщение 258136)
учебник здесь хороший-наверно не все читали

Может быть. А может просто чего-то не понял :)

рони 24.06.2013 13:24

Цитата:

Сообщение от koeshiro
Браузер мгновенно досчитывает до 15 и выводит только адрес последней картинки

Пример ошибочного использования

vadim5june 24.06.2013 13:25

Цитата:

Сообщение от koeshiro
А может просто чего-то не понял

цикл выполняется сразу
for(i=0;i<15;i++)
а загрузка картинок через некоторое время-ясно что i=15 для всех поэтому нельзя использовать

koeshiro 24.06.2013 13:40

vadim5june,
если использовать так. То не работает вовсе .-.
<script>for(i=0;i<15;i++)
{doc=document.getElementsByTagName('img')[i]; doc.onload=function()
{fdoc=document.getElementsByTagName('img')[this]; ImgSrc=fdoc.getAttribute("src");ImgId=fdoc.id;alert(ImgSrc);}}
</script>
Но я тут глупанул. Да ещё всем о своей глупости рассказал XD

koeshiro 24.06.2013 13:42

Ладно Всё работает. Нужно будет только аформление придумать. И всякую мелочь.

ruslan_mart 24.06.2013 14:38

Зачем внутри цикла каждый раз обращаться к функции getElementsByTagName()?

function imgLoad()
{
   //code
}

var imgs = document.getElementsByTagName('img');
for(i=0; i<imgs.length; i++) imgs[i].onload = imgLoad;

vadim5june 24.06.2013 14:50

Цитата:

Сообщение от Ruslan_xDD
Зачем внутри цикла каждый раз обращаться к функции getElementsByTagName()?

так лучше как у Вас


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