PDA

Просмотр полной версии : Firefox проблема с window.status


AzagThoth
05.05.2010, 01:29
Есть код.
getURL("javascript:function setStatus(par){window.status=par}");
but.onRelease=function():Void{
getURL("javascript:setStatus('Привет зелёным человечкам.')");
}
В IE 8 строка состояния браузера меняется при нажатии кнопки, в Firefox ни каких изменений.
Кто нибудь знает - почему?

Добавлено через 7 минут
Ха-ха. window.close() тоже не работает. Подозреваю что тут дело в том, что Firefox не до конца поддерживает спецификацию JavaScript, или где то нужно дать особые разрешения что бы всё это работало. Одно могу сказать точно alert() точно работает.

in4core
05.05.2010, 01:41
А собственно зачем вам оно надо? если диплинк для этого есть готовый класс

AzagThoth
05.05.2010, 01:47
Вообще на самом деле не зачем пока что. Просто читаю книжку и делаю примеры по ней. Ну и слегка неприятно/непонятно когда что-то ведёт себя не так как это описано.
А можно поподробнее про:
если диплинк для этого есть готовый класс
Что такое диплинк? И что за готовый класс? О_о

in4core
05.05.2010, 02:29
www.google.ru там набираем DeepLink. Готовый класс - SWFAddress

AzagThoth
05.05.2010, 04:05
В общем что такое DeepLink так и осталось для меня тайной за семью печатями. Гугл, как впрочем и Яндекс, находит всё что угодно, но только не ответ на этот вопрос.
А за то что сказали название класса - спасибо. Только вот в справочнике по AS2 от Adobe о нём не сказано не слова. Вероятно Вы имели в виду класс созданный группой умельцев на коленке. По крайней мере вот что я нашёл по этому вопросу: тут ссылка на страничку сайта умельцев где можно скачать класс и доку по нему (http://www.asual.com/swfaddress/). Собственно пока особо не ознакомился, сейчас сижу занимаюсь.

Интересен вопрос - где можно узнать какие команды JavaScript поддерживает Firefox, да и другие браузеры. Это просто будет полезно и пригодится в дальнейшем. Или если он поддерживает их все, тогда где нужно ему разрешить выполнение тех команд в работе с которыми возникли проблемы(команды приведены в первом посте)?

Добавлено через 1 час 37 минут
Ололо!
private static function _call(fn:String, param:Object):Void {
if (typeof param == 'undefined') param = '';
trace(ExternalInterface.available);//Возвращает true
trace(_availability);//Возвращает false
if (_availability) {
if (System.capabilities.os.indexOf('Mac') != -1) {
if (_queue.length == 0) {
_queueInterval = setInterval(SWFAddress._callQueue, 10);
}
_queue.push({fn: fn, param: param});
} else {
ExternalInterface.call(fn, param);
}
}
}

Это в файле - SWFAddress.as для AS2. Что-то пере|недо-мутили.

Добавлено через 2 часа 7 минут
}{E-}{E
Вопрос решён.
Да, SWFAddress оказался хренью. Как я и предполагал изначально :) Об этом говорит обнаруженный бажок + отсутствие адекватного хелпа.
Собственно разобрал как реализован setStatus в компоненте SWFAddress. ExternalInterface.call() - вызывает функцию JavaScript.
Вот выдержка из хелпа Adobe по AS2:
call (ExternalInterface.call method)
public static call(methodName: String, [parameter1: Object]) : Object

Calls a function exposed by the Flash Player container, passing 0 or more arguments. If the desired function is not available, the call returns null; otherwise it returns the value provided by the function. Recursion is not permitted; a recursive call produces a null response.

If the container is an HTML page, this method invokes a JavaScript function in a <script> element.

If the container is some other ActiveX container, this method broadcasts an event with the specified name, and the container processes the event.

If the container is hosting the Netscape plug-in, you can either write custom support for the new NPRuntime interface or embed an HTML control and embed Flash Player within the HTML control. If you embed an HTML control, you can communicate with Flash Player through a JavaScript interface that talks to the native container application.

Availability: ActionScript 1.0; Flash Player 8

Parameters

methodName: String - The name of the function to call in the container. If the function accepts parameters, they must appear following the methodName parameter.

parameter1: Object [optional] - Any parameters to be passed to the function. You can specify zero or more parameters, separating them by commas. The parameters can be of any ActionScript data type. When the call is to a JavaScript function, the ActionScript types are automatically marshalled into JavaScript types. When the call is to some other ActiveX container, the parameters are encoded in the request message.

Returns

Object - The response received from the container. If the call failed (for example if there is no such function in the container, or the interface was not available, or a recursion occurred, or there was a security issue) null is returned.

Example

The following example calls the JavaScript function sayHello() in the HTML page that contains the SWF. The call is made by using the ExternalInterface.call() method.

import flash.external.*;

var greeting:String;
var btn:MovieClip = createButton(100, 30, 0xCCCCCC);
btn.onPress = function() {
greeting = String(ExternalInterface.call("sayHello", "browser"));
this.mcTxt.text = greeting; // >> Hi Flash.
}

function createButton(width:Number, height:Number, color:Number):MovieClip {
var depth:Number = this.getNextHighestDepth();
var mc:MovieClip = this.createEmptyMovieClip("mc_" + depth, depth);
var mcFmt:TextFormat;

mc.beginFill(color);
mc.lineTo(0, height);
mc.lineTo(width, height);
mc.lineTo(width, 0);
mc.lineTo(0, 0);

mcFmt = new TextFormat();
mcFmt.align = "center";
mcFmt.bold = true;

mc.createTextField("mcTxt", depth, 0, 0, width, height);
mc.mcTxt.text = "Call JS Function";
mc.mcTxt.setTextFormat(mcFmt);

return mc;
}

For the previous example to work properly, you should be copy and paste the following code into the containing HTML page. Unless the HTML page is hosted on a server, your browser may alert you with a security warning.

<script>
function sayHello(name) {
alert(">> Hello " + name + ".");
return ">> Hi Flash.";
}
</script>


Другими словами аналог getURL("javascript:setStatus('Привет зелёным человечкам.')");
Будет такой:
import flash.external.*;
ExternalInterface.call("setStatus('Привет зелёным человечкам.')", "browser");
Естественно в Firefox ничего работать не будет из за дефолтного отруба части команд JavaScript. Для того чтобы исправить ситуацию идём: Инструменты -> Настройки -> Содержимое -> Использовать JavaScript -> Дополнительно. И ставим там какие нужно галки.
__
Думаю, тема исчерпана.

Добавлено через 2 часа 17 минут
И да,
window.close()
Заставить работать в Firefox не получилось. Судя по всему эта команда залочна разрабами Firefox. Наверное как не очень безопасная. Хотя, кто их знает.

etc
05.05.2010, 07:58
Другими словами аналог getURL("javascript:setStatus('Привет зелёным человечкам.')");
Будет такой:
import flash.external.*;
ExternalInterface.call("setStatus('Привет зелёным человечкам.')", "browser");
Это не аналог, в таком виде.

AzagThoth
05.05.2010, 07:59
Если флеш ролик открывать при помощи браузера - работает одинаково. Отсюда сделан вывод, что это, судя по всему, аналог.

etc
05.05.2010, 08:04
В первом случае вы вызываете setStatus с текстом. Во втором неверный синтаксис, первый аргумент принимает имя функции, а не строку непонятно с чем. Аналогом будет это:
ExternalInterface.call("setStatus", 'Привет зелёным человечкам.');

AzagThoth
05.05.2010, 08:21
Да, так точно. Блин. Это я какую то ерунду написал :)) Проверял двумя методами, всё работало. Просто перекосел с примером когда отписывался. Спасибо большое, что поправили.

in4core
05.05.2010, 13:49
дА уж написать такую ахинею! SWFAdress работет на всех браузерах прекрасно и выполняет свою задачу на 100%. DeepLink - линкование во флеше с помощью сторонних компонентов, чтопозволяет меня текст адреса, текст заголовка страницы. А далее и возможность с помощью навигации на сайте реагировать на строку состояния, а так же в обратном порядке меняя строку состояния переходить на определенное место флешке или же вы полнять опред действие....

AzagThoth
05.05.2010, 18:27
Посмотрите как написан этот компонент. Выше я привёл конкретную ошибку. Ни один из примеров скаченных с сайта разработчика SWFAddress не работает ни в IE, ни в Firefox. Это и не удивительно:
if (_availability) {
Выше я подробно всё расписал.
Все функции что Вы перечислили можно реализовать без особого труда средствами AS2 при помощи связки с JS(справочник в руки) и руководствуясь докой от Adobe.

Добавлено через 1 час 43 минуты
А с запретом в браузере, хоть какой компонент/команды используйте толку не будет.

in4core
05.05.2010, 20:16
Ты совсем чтоли? Я сайт свой делал через SWF на всех браузерах линкинг работает! Если у тебя руки не оттуда растут.

AzagThoth
05.05.2010, 20:29
Естественно в Firefox ничего работать не будет из за дефолтного отруба части команд JavaScript. Для того чтобы исправить ситуацию идём: Инструменты -> Настройки -> Содержимое -> Использовать JavaScript -> Дополнительно. И ставим там какие нужно галки.
Какое слово Вам непонятно?

in4core
05.05.2010, 20:33
Первым моим браузером был FF , после того как я установил ( переустановил win 7) . Настройки я не менял никакие и ничего не делал - ВСЕ РАБОТАЕТ и РАБОТАЛО на ура!" Вы сильно ошибаетесь. Вы видимо не то что то используете

Добавлено через 3 минуты
И про отруб полный бред! Вы ваще пишете полный бред. Если почитает док там конкретно написано ВСЕ, что доступно во всех браузерах на данный момент изобретенных. И нигде не написано что надо включать настройки. Если бы это было так, тогда бы смысла класс небыло писать! Потрудитесь разобраться в классе, а так же проверить работу , прежде чем кого то поганить. И то nxо там написано, вам не написать простейшими call методами. а тем более getURL . Там 2 файла класса на 1000 строк. Думаешь для прикола написали так много ?))))

AzagThoth
05.05.2010, 20:52
Предлагаю решить этот спор раз и на всегда. Пожалуйста выполните процедуру которую я описал и если у Вас, вдруг, включено "Изменять текст в строке состояния", в настройках JavaScript в Firefox то снимите эту галочку(если вдруг не поняли у меня она была выключена по умолчанию). После чего откройте с помощью браузера Firefox примеры скаченные с сайта разработчиков по SWFAddress. Или же любое своё что-то самописное, что бы изменяло текст в строке статуса. Смею Вас заверить вероятность того что Вас ждёт жёсткий облом с работоспособностью этой ерунды 100%. Если же вдруг случится чудо, то попрошу выложить swf файл в котором Вам удалось найти реализацию этой возможности, или реализовать самому. До тех пор пока Вы этого не сделаете, все Ваши заявления по поводу волшебного функционирования этой штуки будут являться не более чем пустым трёпом(извините если вдруг огорчил или обидел чем-то).

in4core
05.05.2010, 21:07
AzagThoth Тока что открыл настройки для интереса и заметил что галка(измменять строку) не включена как и у вас, но все работет все равно)))) Я понял почему вы тупите. Вместе с классом добавляется файл JS ( AC_RunActiveContent) он вкорне отличается от того что по умолчанию генерирует флеш.
Вот пример как я работал с SWF при этом все работало. Если вы хотите поспорить на денежки, то я вам выложу еще и сайт свой в инет, а так же пришлю все скрины на месте...

_global.DPI = new com.in4core.DynamicDeepLinking();

SWFAddress.setStrict(false);
SWFAddress.onExternalChange = function() {
var Value = SWFAddress.getValue();
DPI.setDDL(Value);
};
SWFAddress.onChange = function() {
var TITL = SWFAddress.getValue();
DPI.setTITLE(TITL);
}



Код DPI думаю вам ниче не даст....

function setDDL(tostring) {

//// search portfolio//////
str = tostring.lastIndexOf("/")+1;
str1 = tostring.lastIndexOf("?");
str2 = tostring.lastIndexOf("=")+1;
subs = tostring.substring(str, str1);// path
subs2 = tostring.substr(str2);// id
subs3 = tostring.substr(tostring.lastIndexOf("/")+1);
///search services/////////
strS = tostring.substr(9);
/////////functions////////////////
............. // и так далее

private function setTITLE(g) {
var title = 'IN4CORE STUDIOS LLC';
if (g == "" || g == undefined) {
g = "HOME";
}
title += ". [ "+g.toUpperCase()+" ] ";
SWFAddress.setTitle(title);
}
}

AzagThoth
05.05.2010, 21:17
Мда. Я увидел лишь, то, что Вы делаете SWFAddress.setTitle(title);
Разговор шёл не о заголовке окна, а о строке статуса она расположена в самом низу браузера прямо над панелькой пуска. И да, мне НЕ НУЖЕН исходник. Нужен просто SWF для того, что бы убедиться что это действительно возможно. Во что я сейчас, пока что, искренне не верю.
Вместе с классом добавляется файл JS ( AC_RunActiveContent) он вкорне отличается от того что по умолчанию генерирует флеш.
За это предложение спасибо. Посмотрю/постараюсь поискать этот файл и разобраться что это за файл такой.

in4core
05.05.2010, 21:25
Строку статуса снизу не проверял, насчте этого сказать не могу. Но это не главное в диплинке, главное кнопки браузера,строка адреса и заголовок.А это работет на ура, а остальное не главное. Видимо мы друг друга не верно поняли. Но про строку проверю тоже. И напишу

AzagThoth
05.05.2010, 21:34
:) А то. Просто getURL(), это самый что ни на есть универсальный инструмент для работы с передачей данными в JS из Flash, можно передавать алгоритмы любой сложности и любой формы. Я особо не разбирал класс SWFAddress, но по тому как там устанавливается строка статуса, и обнаруженным багом(собственно после устранения мной которого строка статуса вообще стала устанавливаться, разумеется при включённой настройке в Firefox) был сделан вывод, что это не более чем относительно удобный инструмент для тех кто не хочет или не может вдаваться в подробности функционирования языка JS. Просто сборник наиболее полезных и часто используемых скриптов, которые лучше по мере возникновения потребности всё таки написать самому оперируя возможностями Flash и JS. По крайней мере будет и ясно как работает, и вероятное всего, откровенных глюков будет на порядок меньше. В общем это просто мнение, моё скромное мнение на настоящий момент.