PDA

Просмотр полной версии : прикол - JavaScript - setVariable();


blackhund
17.07.2002, 00:30
прикол с функцикей джаваскрипта. вот эта самая функция setVariable() очень хитрая и непонятная.
пусть в документе, в котором вызывается мувик описана следующая функция:
<script language="JavaScript">
<!--
var auxStr = "we***we***we***";
function ToFlash(Str) {
window.document.setVariable("_root.infl.inFlash",Str);
}
//-->
</script>

далее, в мувике написан сценарий:

_root.infl.Inflash = "Hi dudes!"; /*записываем в переменную inFlash, к-я есть переменная динамического текстового поля, которое мы сделали ручками и нажав f8 превратили в movieclip с именем infl*/
getUrl("javascript:ToFlash(auxStr)");
attachMovie("idText","Text",1); /*создаем экземпляр клипа, который есть также динамическое текстовое поле с переменной textVar*/
_root["Text"].textVar = _root.infl.Inflash; /*ну это понятно*/

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

Ilya
17.07.2002, 02:16
Hi !

есть предположение что во время задания textVar переменная еще не успела дойти из яваскрипта во флеш :) setVariable штука асинхронная и требует времени :)

blackhund
17.07.2002, 12:50
возможно это действительно связано со временем выполнения функции setVariable(). я попытался после ее вызова поставить цикл для задержки, типа:

p = 0;
while (p < BolshoyeChislo) {
p++;
}

не помогло. или оно и не могло помочь?

blackhund
17.07.2002, 12:59
вот еще одно наблюдение по теме. вот то текстовое поле, которое создаетя сценарием и куда я пытаюсь загнать импортированную переменную интересно себя ведет. я запустил эту всю беду. и вот что интересно. когда загрузилась страничка с мувиком, это текствовое поле уже было создано и заполнено текстом еще до того как на экране появился текст импортированный из JS. хотя заполнение того первого поля в сценарии стоит после этого с JS. а получается что хоть по тексту программы оно создаетя позже, на деле как раз все получается наоборот. в чем же дело? такое впечатление, что выполняются все методы флэша в первую очередь и только потом все остальное независимо от порядка следования в тексте программы. или я опять чего-то не понял?

ish
17.07.2002, 13:00
методы плеера исполняются после выполнения кода в кадре :)
тобишь если ты вызываешь каким либо способом (через фскоманды или гетурлом) какой либо метод плеера, жди результат его отработки не ранее чем плеер перейдет на следующий кадр :) уф типо того :)

ish
17.07.2002, 13:11
http://www.ishlab.ru/simbeos/ - небольшие разработки на эту тему

там был случай когда я хотел возвращать переменную JS напрямую
примерно так:

function getJSVar(var) {
temp=null
fscommand("get","temp,var");
while(temp==null) {}
return temp;
}

команда get в JS имела синтаксис

if(command=="get") {
ar = args.split(",");
player.setVariable(ar[0],eval(ar[1]));
alert("Method is invoked!!")
}


естесттвенно, при вызове ф-ии getJSVar появлялось окошко сообщения, то есть метод плеера выполнился, но переменная temp обновит свое значение только на следующем кадре, и плеер не подавал признаков жизни :)

УильямБрэдберри
17.07.2002, 15:14
да..
и ЫШШО...
во-первых:
функсыя setVariable пишется не так

в JS она пишытся вот так:

movie.SetVariable([target],[variable]);

т.е. с БольшОЙ буквы "S"

во-вторых действительно нужно сначала подождать появления твоего мувика в сцене, а потом туда уже все пихать..

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

blackhund
17.07.2002, 15:53
2УБ:

нет, ты не прав, все таки функция setVariable(), таки с маленькой буквы

далее, мы вызываем функцию _из_ мувика. зря ты так.
ish же написал, что вызываем в сценарии fscommand(); а она уже в свою очередь вызывает нам нашу setVariable() из документа. так что все граммотно.

и насчет кадра ish тоже прав. я вот сделал простой мувик с кнопкой на первом кадре, которая принажатии делает переход
gotoAndStop(2)
а во втором кадре кнопку при нажатии которой
gotoAndStop(1)
в первом кадре я подкачал значение прозрачности для кнопки с помощью setVariable();
так вот, кнопки изменили прозрачность только тогда, когда я перешел во второй кадр и из него вернулся в первый. так что ish очень даже прав насчет обновления импортируемых переменных. я только что все проверил. все так как они и сказал.

2ish:

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

lexass
17.07.2002, 15:58
ХЗ.SetVariable(name, value)

ish
17.07.2002, 16:11
да, правильно с большой конечно, эт я по привычке :)

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

ish
17.07.2002, 16:14
2ish:
так что получается, если мне нужно для формирования таблицы качать из джаваскрипта строковую переменную, с ней можно будет работать только тогда, когда мы еще раз станем в первый кадр? безобразие, а что делать? :)
на на первый а на другой

УильямБрэдберри
17.07.2002, 16:40
Оригинал написал(а) blackhund
2УБ:

нет, ты не прав, все таки функция setVariable(), таки с маленькой буквы



КТО НЕПРАВ!!!! :eek: :eek: :eek:
Я НЕПРАВ???

А спорим на 500 баксов :) ?

lexass
17.07.2002, 16:46
2УильямБрэдберри
спорим, со всеми что вот так
XZ.SetVariable(name, value) :D
ЗЫ
500 енотов , КАЖДОМУ ;)

УильямБрэдберри
17.07.2002, 17:03
Оригинал написал(а) lexass
2УильямБрэдберри
спорим, со всеми что вот так
XZ.SetVariable(name, value) :D
ЗЫ
500 енотов , КАЖДОМУ ;)

ага :)
"смотрит на болт, смотрит на стакан,
- болт
- стакан
-болт
- стакан"

А кто такое XZ?

про то, что вызывает он из мувика, я сразу не просек :)

ЗЫ: а пусть он еще в нетскейпе запуститЮ тогда мы посмотрим, кто - кому 500 гринов бут отдавать.

blackhund
17.07.2002, 17:09
2УБ

sorry, таки с большой. но у меня под IE написано с маленькой и работает, это меня и смутило. значит под нетскейпом такой номер не пройдет? надо проверить будет.

lexass
17.07.2002, 17:12
XZ=movie
movie=anyMovie
anyMovie=MyMovie
XZ=* хрен знает, какой-то мувик *

PS
просто так короче :)