Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   В ИЕ после обновления страницы картинки в полосе прокрутки позиционируются неправильн (http://www.flasher.ru/forum/showthread.php?t=130368)

djyamato 24.09.2009 17:52

InternetExplorer неправ. позиционирование после обновл. страницы
 
Вложений: 2
Здравствуйте
Вот какого рода проблема
Есть прокручивалка картинок ( МОРДОЛЕНТА :) ) http://divisionby0.org/web_Portfolio/walejo/ala_mamba/
почти все параметры вынесены из флэшки и можно выставить размер картинок, длину флэшки, высоту, количество показываемых картинок и.т.д.
При наведении на картинку она немного увеличивается - так что по высоте флэшка должна быть чуть выше чем картинка.

При обновлении страницы в Опере и FF все работает нормально (хоть миллион раз обновить страницу) - картинки подгружаемые в контейнер (MovieClip) позиционируются по Y там где нужно. А вот в ИЕ при обновлении страницы - почти наполовину своей высоты ниже позиционируются картинки загруженные, а может быть это контейнер(MovieClip) позиционируется неправильно (если обновлять страницу и дальше, то "опускания" картинок больше не происходит).
То есть, при обновлении страницы в ИЕ картинки как бы "падают" ниже, а при первой загрузке - правильно позиционируются.


Флэшка встроена swfObject-ом
Вот код вставки флэшки в страницу:

PHP код:

<div id="flash"><p align="right"><br />
      &
#210;ðåáóåòñÿ Adobe Flash Player 8.0</p>
    
<p align="center"><a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash&amp;promoid=BIOW" target="_blank">Download Adobe Flash</a></p>
    </
div>
    <
script type="text/javascript" language="javascript">
        var 
so = new SWFObject("sqlGet2.swf""mymovie""858""97""8""#ffffff");
            
so.addParam("menu""false");
            
so.addParam("scale""noscale");
            
so.addParam("allowFullScreen""false");
            
so.addVariable("AvatarsFolder""avatars");
            
so.addVariable("AnimSpd""4");
            
so.addVariable("RightRewindSpeed""7");
            
so.addVariable("notSelectedPersonsAlpha""60");
            
so.addVariable("PersonPic_width""60");
            
so.addVariable("PersonPic_height""88");
            
so.addVariable("PersonPic_Zazor""6");
            
so.addVariable("totalPersonsVisible""13");
            
so.addVariable("CodePage""true");
            
so.addVariable("linkPage""_blank");
            
so.addVariable("sqlGetScript""getDATA.php");

            
so.write("flash");
    
</script> 


во флэшке:
Код AS1/AS2:

Stage.scaleMode="noScale";
Stage.align ="TL";
Object.registerClass("PersonObj",PersonObj); // мувик в библиотеке
var sqlGetter=new LoadVars();
...
_root.createEmptyMovieClip("PersonsHolder",_root.getNextHighestDepth());
_root.PersonsHolder._x=0;
_root.PersonsHolder._y=Number(_root.PersonPic_height)/2+Math.abs(Stage.height-Number(_root.PersonPic_height))/2; //  это контейнер для подгруженных фото
...
sqlGetter.onLoad=function(){
        Persons_array=this.DB_data.split("<>"); // ответ скрипта читающего из базы MySQL
        Persons_array.pop();
        for(i=0;i<Persons_array.length;i++){
                var PersCont=_root.PersonsHolder.createEmptyMovieClip("PersonCont_"+i,_root.PersonsHolder.getNextHighestDepth());
                var PERSON=PersCont.attachMovie("PersonObj","PersonObj",PersCont.getNextHighestDepth());
                PersCont._width=_root.PersonPic_width;
                PersCont._height=_root.PersonPic_height;
                PersCont._x=i*(PersCont._width+Zazor)+(PersCont._width+Zazor)/2;
                PersCont._y=0;
 
                PERSON.dataArray=new Array();
                PERSON.nmbr=i;
                PERSON.parent=PersCont;
                PERSON.dataArray=Persons_array[i].split(",");
                PersonsObjectsArray.push(PERSON);
                PERSON.dataArray.pop();
                UserPicture_MCL.loadClip(PERSON.dataArray[PERSON.dataArray.length-2],PERSON.hlst);
        }
        if(Persons_array.length>Number(_root.totalPersonsVisible)){
                AnimationRightRewindSpeedRazn=Persons_array.length-Number(_root.totalPersonsVisible);
                PersonsHolder._x=(-1)*AnimationRightRewindSpeedRazn*(Number(_root.PersonPic_width)+Zazor);
                _root.AnimationRightRewindSpeed_Interval=setInterval(AnimationRightRewind,AnimationRightRewindSpeed);
                LoadArea_x=PersonsHolder._x;
        }
}
 
 
 
sqlGetter.load(_root.sqlGetScript+"?"+Math.random(115));


mooncar 24.09.2009 18:45

Была похожая проблема...
Код не совсем ясен.
Вот это как понимать?
Код AS1/AS2:

"PersonCont_"+i

Как у вас организован цикл? У вас onLoad несколько раз вызывается в цикле?
Покажите побольше. Stage тут не нужен, он не при чем.
PersonObj в аттаче как меняется?

djyamato 24.09.2009 18:57

Цитата:

Сообщение от mooncar (Сообщение 853185)
Была похожая проблема...
Код не совсем ясен.
Вот это как понимать?
Код AS1/AS2:

"PersonCont_"+i

Как у вас организован цикл? У вас onLoad несколько раз вызывается в цикле?
Покажите побольше. Stage тут не нужен, он не при чем.
PersonObj в аттаче как меняется?

"PersonCont_"+i это имена - то есть если в цикле то: PersonCont_0 PersonCont_1 PersonCont_2 итд


Код дополнил - взгляните будьте добры

mooncar 24.09.2009 19:31

Сделайте высоту сцены побольше (повыше), сделайте рамочку для PersonsHolder и для индивидуальных контейнеров, а то все белое. Тогда можно будет локализовать проявление проблемы и думать дальше.
Понять можно будет - съезжает ли сам общий холдер, или ниже делаются контейнеры с картинками или даже сами картинки внутри индивидуальных контейнеров, хотя это вряд ли.

Добавлено через 6 минут
Все таки что-то тут может быть с самой Stage.
Вот тут у вас задается положение общего холдера:
Код AS1/AS2:

root.PersonsHolder._y=Number(_root.PersonPic_height)/2+Math.abs(Stage.height-Number(_root.PersonPic_height))/2;

Может его жестко задать?

djyamato 24.09.2009 19:43

Спасибо за советы - помучаю флэшку с рамочками
Попробую жестко НО проблема эта в ИЕ выявляется не при первой загрузке а при обновлении страницы - при первой загрузке все позиционируется правильно

mooncar 24.09.2009 19:52

Цитата:

Сообщение от djyamato (Сообщение 853218)
а при обновлении страницы - при первой загрузке все позиционируется правильно

Это-то я заметил. Возможно, дело в разнице работы кэша IE и остальных браузеров? То есть при повторной загрузке, например, swf-ка берется уже из кэша. Попробуйте добавить при публикации к swf рандомную переменную, дабы обойти кэш.

djyamato 24.09.2009 19:56

Цитата:

Сообщение от mooncar (Сообщение 853224)
Это-то я заметил. Возможно, дело в разнице работы кэша IE и остальных браузеров? То есть при повторной загрузке, например, swf-ка берется уже из кэша. Попробуйте добавить при публикации к swf рандомную переменную, дабы обойти кэш.

а вот этого я не умею - подскажите пожалуйста как добавить рандомную переменную при публикации :rolleyes:

mooncar 24.09.2009 20:11

Если у вас страница php:
Код:

var so = new SWFObject("sqlGet2.swf<?php echo('?'.rand(1, 200) )?>", "mymovie", .....
Не уверен, сработает ли для SWFObject, и кроме того если страница у вас не php, то там у вас JS-скрипт, вместо <?php echo('?'.rand(1, 200) )?> для генерации нужно использовать JS-вставку, я вам не подскажу, с JS не очень дружу.

Добавлено через 2 минуты
Но вообще, конечно, кэш кэшем, проблемы быть не должно такой.

djyamato 24.09.2009 21:35

ясненько спасибо
буду экспериментировать
как сделаю опишу как я этот досадный глюк поборол

mooncar 25.09.2009 09:33

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

djyamato 25.09.2009 17:31

при первой загрузке ИЕ считает что Stage.height=97 а при второй из кэша считает что Stage.height=0 - бред какой-то :)

Пришлось вводить переменную в код вставки so.addVariable("StageHeight", "97") и относительно ее значения высчитывать местоположение холдера по Y

Код AS1/AS2:

_root.PersonsHolder._y=Number(_root.PersonPic_height)/2+Math.abs(_root.StageHeight-Number(_root.PersonPic_height))/2;


заработало корректно в ИЕ

Спасибо Вам "mooncar" за "перст указующий" :)



P.S. А вот интересно - почему собственно Stage.height у загруженной из кэша ИЕ флэшки равен нулю ?
может просто это свет с луны не туда упал ? ....

mooncar 25.09.2009 18:06

Обычно нулю равны размеры свежесозданных объектов (мувики) сразу после создания.
Когда закачиваем в них содержание извне, любые действия с участием размеров выполняются по готовности. Готовность - это все пишется внутри onLadInit, например.
А вот как быть, когда идет аттач из библиотеки, как определить готовность наполнения для дальнейших вычислений в этом случае , так и не разобрался. проблема моя как раз с этим была связана.
Видимо, тут нужен какой-то слушатель, проверяющие отличность размера от нуля и говорящий - все, можно уже дальше вычислять.

djyamato 25.09.2009 18:32

хм ну хорошо
а к чему же тогда var so = new SWFObject("sqlGet2.swf", "mymovie", "858", "97", "8", "#ffffff") - это же явные размеры ? (но тут глубоко разбираться нужно как работает swfObject для разных брузеров я так думаю)

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

mooncar 25.09.2009 18:43

Попробуйте аттачить в качестве контейнера мувик с размещенным внутри другим, например, прозрачным графическим символом (_alpha = 0).

djyamato 02.10.2009 16:06

Цитата:

Сообщение от mooncar (Сообщение 853567)
...
А вот как быть, когда идет аттач из библиотеки, как определить готовность наполнения для дальнейших вычислений в этом случае , так и не разобрался. проблема моя как раз с этим была связана.
Видимо, тут нужен какой-то слушатель, проверяющие отличность размера от нуля и говорящий - все, можно уже дальше вычислять.

Я вот так проверяю всегда готовность для действий с приаттаченным мувиком из библиотеки (его размеры, гружу в него картинки и вообще все что угодно)
то есть

Код AS1/AS2:

Object.registerClass("myMC",myMC);
var StartDepth=1;
var NewBTN=_root.attachMovie("myMC","myMC_",StartDepth,{_x:0,_y:0});
 
function myMC():Void {
  myMC.prototype.onLoad = function():Void  {
      var ThisObj=this;
 
      ThisObj.onUnload= function():Void  {
        ....
      }
      ThisObj.onRollOver= function():Void  {
        ....
      }
      ThisObj.onRollOut= function():Void  {
        ....
      }
  }
}


dimarik 03.10.2009 19:04

Код AS1/AS2:

Stage.addListener(this);
 
this.onResize = function():Void {
        Stage.removeListener(this);
        // do layout
};

Да, при мгновенной загрузке (ни одного ProgressEvent'а) размер стейджа может быть неопределенным.
Можно попробовать отложить позиционирование на один или несколько кадров;

Код AS1/AS2:

var delayFrames:Number = 10;
 
this.onEnterFrame = function():Void {
        if (delayFrames-- <= 0){
                delete this.onEnterFrame;
                // do layout
        }
};


djyamato 04.10.2009 00:35

'dimarik', простите, это в тему ТЕМЫ или в ответ господину 'mooncar' ?
Если в тему ТЕМЫ :) то я аттачу мувики определенного размера состоящие из 2х мувиков - холдера и холста (назову их так). После аттача гружу в холст (приаттаченного мувика) картинку и уменьшаю ее программно чтобы она уместилась в холсте. Когда загрузилась картинка - аттачу следующий в мордоленту. У приаттаченного мувика есть высота отличная от нуля (равная высоте холдера плюс расстояние для увеличения при наведении)


Ну а в конечном итоге - к чему тогда SwfObject размеры по ширине и высоте ? только чтобы зарезервировать на странице для себя место ?

То есть лучше не использовать Stage.height если нет на стейдже ничего изначально ?

dimarik 04.10.2009 12:45

Цитата:

Сообщение от djyamato (Сообщение 855355)
То есть лучше не использовать Stage.height если нет на стейдже ничего изначально ?

Лучше дождаться его правильного значения. Что я и предлагал в предыдущем своем посте.

djyamato 04.10.2009 13:29

ясненько - спасибо
Буду иметь это ввиду и учитывать эти факты в последующих разработках.

Всем спасибо.

formyka 23.11.2009 02:09

IE - самый гнусный и тупой браузер современности!!!

Эта проблемма лечиться так в AS3 - в конструкторе Document-класса пишем:

Код AS3:

      // dynamic publishing
      stage.addEventListener(Event.RESIZE, onResize);
      onResize();
 
      function onResize(event:Event = null):void
      {
        if (stage.stageHeight > 0 && stage.stageWidth > 0 && stage.hasEventListener(Event.RESIZE))
        {
          stage.removeEventListener(Event.RESIZE, onResize);
 
          // ваш код
 
        }
      }


dimarik 23.11.2009 10:20

Цитата:

Сообщение от formyka (Сообщение 867574)
IE - самый гнусный и тупой браузер современности!!!

Эта проблемма лечиться так - в конструкторе Document-класса пишем:

Здесь нет проблемы. Это обычное поведение.

formyka 23.11.2009 13:38

dimarik - Ссылку с большим пафосом я тоже могу положить.
Такое "обычное" поведение, почему-то только у браузера IE.

dimarik 23.11.2009 13:59

Хм. Век живи - век учись.

Только у ActiveX, а не у браузера.

formyka 23.11.2009 15:04

dimarik - В контексте вопроса звучит браузер IE... В контексте ответов звучит слово ПРОБЛЕММА! Это и ежу ясно, что данная ПРОБЛЕММА проявляется ВОЗМОЖНО и благодаяря иному поведению ActiveX (я думаю, вы и так поняли что я имел ввиду, но просто, по совершенно непонятным мне причинам, вы решили выглядить умно).

Вы, наверное, не знаете, что особенность работы этого ActiveX также зависит реализации самого браузера. IE (в отличие от других браузеров) изначально инициализирует переменные некоторых объектов в 0 (в том числе ширины и высоты), а потом инициирует событие RESIZE, чтобы выставить настоящие (а в случае таблиц и резиновой верстки еще и пересчитаные) ширины и высоты некоторым объектам (и даже в JavaScript его можно отловить). В других браузерах RESIZE срабатывает только при непосредственном изменении размеров окна, а окончательные ширины и высоты выставляются до, так называемого, запуска плагинов (я написал плагины - чтобы вы не придрались, так как, по большей части, другие браузеры используют плагинную систему в отличии от компонентной ActiveX). Так что, вообще говоря, нельзя утверждать, что именно в данном случае является первичным в контексте данной ПРОБЛЕММЫ - особенность реализации браузера IE или особенность реализации ActiveX с учетом особенностей реализации IE.

А что вы имеете в виду под "обычным поведением ActiveX" (поведением по отношению к чему, из сути вашего ответа - абсолютно не ясно)? Короче, не надо нам здесь пердеть в воздух, поправлять орфографию, пытаясь сказать что-то умное.

dimarik 23.11.2009 15:15

Ну, хозяин - барин. Пральна писать "ни о чем". =) Учите русский язык.

formyka 23.11.2009 16:39

Цитата:

Сообщение от dimarik (Сообщение 867669)
Ну, хозяин - барин. Пральна писать "ни о чем". =) Учите русский язык.

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

Да и между прочим, правильно писать "Правильно", а не "Пральна"!

Кто бы поправлял, ёмаё :)

dimarik 23.11.2009 21:32

Не берите в голову =) Ну, не русский Вы, так случилось. Но беситься-то зачем? Сказали же Вам, что ActiveX так себя ведет и баста!

Molecula 23.11.2009 22:26

У меня так же была проблема с ИЕ, пришлось писать хак для него, вешать ЕнтренФрейм, и ждать когда размеры высоты и ширины стейджа будут больше нуля, тогда уже делать какие-то расстановки и манипуляции с объекйтами, которые отталкивались от размера сцены.

dimarik 23.11.2009 22:47

Вы описали всего лишь workaround

Molecula 23.11.2009 23:41

Просто про слово "хак" я читал одно из определений, что это:
Цитата:

"нестандартное, порой, не самое красивое решение проблемы (грубый, или кривой хак, англ. dirty hack), как правило, основанное на использовании особенностей какой-либо платформы"
Вот для ИЕ и написал определенный код-проверку, которая нужна была для ИЕ.
Т.е. слово "хак" уместно для такой ситуации.

dimarik 23.11.2009 23:47

Хак это хак. фрик - это фрик, а Вы сделали workэраунд. Ну не более того. Сэ ля ви.

formyka 25.11.2009 22:39

Molecula не обращайте внимания, шизофрения - не лечится! :taunt:
Дубовый лоб непробиваем!


Часовой пояс GMT +4, время: 07:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.