Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   глюк в Firefox ? (https://javascript.ru/forum/events/8273-glyuk-v-firefox.html)

alexrussia 17.03.2010 20:48

глюк в Firefox ?
 
Здравствуйте такая проблема при добавлении в дерево сбиваются значения style.left и style.top (устанавливаются не те значения), самое что интересное только при первом событии клика, второе событие клика проходит правильно. в IE такой проблемы не возникает.
Другими словами при создании объекта img устанавливаются по умолчанию значения style.left и style.top как будто мы не установили im.setAttribute("style").Кроме того возможно при первом событии firefox не учитывает im.height и im.width


отрывок кода:
case "click":
   var im=document.createElement("img");
   var s=g.src; im.src=s.substring(0,s.lastIndexOf('.'))+"kadr"+s.substring(s.lastIndexOf('.'),s.length);
   im.className="imagebig";
   im.setAttribute("name","big");
   im.setAttribute("style","left:"+String((988-im.width)/2)+"px;"+"top:"+String(g.offsetTop-im.height/4)+"px;");
g.parentNode.appendChild(im);
   goonlis(remlis);
   addlis("1",bigimg,im);
   break;

Kolyaj 17.03.2010 21:49

Цитата:

Сообщение от alexrussia
im.setAttribute("style","left:"+String((988-im.width)/2)+"px;"+"top:"+String(g.offsetTop-im.height/4)+"px;");

im.style.left = String((988-im.width)/2)+"px";
im.style.top = String(g.offsetTop-im.height/4)+"px";

alexrussia 17.03.2010 22:07

Цитата:

Сообщение от Kolyaj (Сообщение 48059)
im.style.left = String((988-im.width)/2)+"px";
im.style.top = String(g.offsetTop-im.height/4)+"px";

это тоже самое, от этого глюк не исчезнет!
Заметил что typуface выдает "auto" в firebug !
Самое интересное что когда через firebug проходишь строки с установкой стиля - firefox нормально устанавливает позицию элемента!
var xss=document.getElementsByName("big")[0];
if (window.getComputedStyle)
var typeface = window.getComputedStyle(im, null).width;

Serge Ageyev 17.03.2010 22:20

Мне кажется что к моменту запроса картинка еще не загрузилась, поэтому ее ширина и не доступна (еще). Как насчет прицепить обработчик события onload к создаваемой картинке и туда перенести нужный код?

alexrussia 17.03.2010 22:28

Цитата:

Сообщение от Serge Ageyev (Сообщение 48063)
Мне кажется что к моменту запроса картинка еще не загрузилась, поэтому ее ширина и не доступна (еще). Как насчет прицепить обработчик события onload к создаваемой картинке и туда перенести нужный код?

да правильно я уже нашел сам ошибку, но вы меня опередили !!!
у firefox вылетает событие load при загрузке изображений, а у IE нет. поэтому надо или image.complete, но лучше image.onload !!!
решение ошибки:
case "click":
var s=g.src;
var im=document.createElement("img");
im.src=s.substring(0,s.lastIndexOf('.'))+"kadr"+s.substring(s.lastIndexOf('.'),s.length);
im.onload=function(){
im.className="imagebig";
im.setAttribute("name","big"); 
im.setAttribute("style","left:"+String((988-im.width)/2)+"px;"+"top:"+String(g.offsetTop-im.height/3)+"px;");
document.body.appendChild(im);
goonlis(remlis);
addlis("1",bigimg,im);}
break;}

Kolyaj 17.03.2010 22:30

Цитата:

Сообщение от alexrussia
у firefox вылетает событие load при загрузке изображений, а у IE нет.

У всех вылетает, устанавливайте onload до установки src.

alexrussia 17.03.2010 22:39

Цитата:

Сообщение от Kolyaj (Сообщение 48066)
У всех вылетает, устанавливайте onload до установки src.

в книге "изучаем jquery 1.3 Джонатан чаффер карл шведберг" как раз написано что у ie не вылетает load так как считается что картинка сразу загрузилась. тем более если бы в ie было load то у меня такая же как в firefox была фигня.
необязательно до или после так как это событие ,его можно после или перед ставить разницы нет никакой.

Kolyaj 17.03.2010 22:53

Не надо ссылаться на книги по JavaScript, 99% из них не выдерживают никакой критики. Лучше взять и попробовать

(function f(i) {
    var img = new Image();
    img.onload = function() {
        alert('loaded');
        if (i < 3) {
            f(i + 1);
        }
    };
    img.src = 'http://javascript.ru/forum/images/ca_serenity/misc/logo.gif';
})(0);

Kolyaj 17.03.2010 22:55

Цитата:

Сообщение от alexrussia
необязательно до или после так как это событие ,его можно после или перед ставить разницы нет никакой.

До или после чего? Если вы его поставите после того, как оно сработает, вы его не поймаете.

alexrussia 17.03.2010 23:45

Цитата:

Сообщение от Kolyaj (Сообщение 48071)
До или после чего? Если вы его поставите после того, как оно сработает, вы его не поймаете.

Почему тогда IE дебаггер показывает что onload - не используется ?


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