HTMLLoader переход на другой сайт

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Аватара пользователя
Kavis
Сообщения: 33
Зарегистрирован: 02 сен 2012, 11:10

HTMLLoader переход на другой сайт

Сообщение Kavis »

Собсвтвенно загружаю сайт в пределах него ссылки все работают, но перейти по ссылке которая ссылается на другой домен не выходит, в чем может быть дело ?
вот код

Код: Выделить всё

    import flash.display.Sprite;    import flash.html.HTMLLoader;    import flash.net.URLRequest; var html:HTMLLoader = new HTMLLoader();            var urlReq:URLRequest = new URLRequest("http://comicsall.com/");            html.width = stage.stageWidth;            html.height = stage.stageHeight;            html.load(urlReq);             addChild(html);
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: HTMLLoader переход на другой сайт

Сообщение sanych_dv »

На другой домен можно перейти, невозможно перейти по ссылке в новом окне (target = "_blank").

Решение:

1. создаем субкласс NewHTMLHost.as

Код: Выделить всё

 package{    import flash.events.Event;    import flash.html.HTMLHost;    import flash.html.HTMLWindowCreateOptions;    import flash.html.HTMLLoader;        public class NewHTMLHost extends HTMLHost    {        public function NewHTMLHost(defaultBehaviors:Boolean = true)        {            super(defaultBehaviors);        }                override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader        {                        var htmlLoader:HTMLLoader = super.createWindow(new HTMLWindowCreateOptions);            htmlLoader.addEventListener(Event.LOCATION_CHANGE, function(e:Event):void                {                });            return htmlLoader;        }    } } 
2. Привязываем к HTMLLoader наш HTMLHost:

Код: Выделить всё

 package{    import flash.display.Sprite;    import flash.html.HTMLLoader;    import flash.net.URLRequest;        public class Main extends Sprite    {                public function Main():void        {            var html:HTMLLoader = new HTMLLoader();            var urlReq:URLRequest = new URLRequest("http://yandex.ru/");            html.htmlHost = new NewHTMLHost;            html.width = stage.stageWidth;            html.height = stage.stageHeight;            html.load(urlReq);            addChild(html);        }        } } 
3. Ссылки открываются в новом окне.
Аватара пользователя
Kavis
Сообщения: 33
Зарегистрирован: 02 сен 2012, 11:10

Re: HTMLLoader переход на другой сайт

Сообщение Kavis »

sanych_dv, огромное спасибо, у меня уже вчера ночью начали проскальзывать мысли, что это из-за ссылок в новом окне, но у же голова не работала.
Аватара пользователя
Kavis
Сообщения: 33
Зарегистрирован: 02 сен 2012, 11:10

Re: HTMLLoader переход на другой сайт

Сообщение Kavis »

Кстати, а чем отличается StageWebView от HTMLLoader ?
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: HTMLLoader переход на другой сайт

Сообщение sanych_dv »

Kavis
StageWebView - упрощенный вариант HTMLLoader с ограниченным взаимодействием между AS3 и JavaScript. Некоторые устройства не поддерживают HTMLLoader, а для поддержки StageWebView используют системные модули.
Аватара пользователя
Kavis
Сообщения: 33
Зарегистрирован: 02 сен 2012, 11:10

Re: HTMLLoader переход на другой сайт

Сообщение Kavis »

Получается если я для Андройда буду делать, то лучше воспользоваться StageWebView
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: HTMLLoader переход на другой сайт

Сообщение sanych_dv »

Проверяйте свойства:

StageWebView.isSupported
HTMLLoader.isSupported
Аватара пользователя
Kavis
Сообщения: 33
Зарегистрирован: 02 сен 2012, 11:10

Re: HTMLLoader переход на другой сайт

Сообщение Kavis »

sanych_dv,
Решил я все таки использовать StageWebView, и побоыстрому переписал NewHTMLHost в NewStageWebView.as
Но компилятор ругается
D:\ProektS\Android\site_for_Android\com\my\NewStageWebView.as, строка 10 1016: Базовый класс является окончательным.
D:\ProektS\Android\site_for_Android\com\my\NewStageWebView.as, строка 17 1020: Метод, который помечен на переопределение, должен переопределять другой метод.

Сам код

Код: Выделить всё

 package com.my{    import flash.events.Event;    import flash.html.*;    import flash.media.StageWebView;    import flash.events.Event;         public class NewStageWebView extends StageWebView    {        public function NewStageWebView(defaultBehaviors:Boolean = true)        {            super(defaultBehaviors);        }                override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):StageWebView        {                        var StageWeb:StageWebView = super.createWindow(new HTMLWindowCreateOptions);            StageWeb.addEventListener(Event.LOCATION_CHANGE, function(e:Event):void                {                });            return StageWeb;        }    } } 
Как в таком случае выкручиваться ?
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: HTMLLoader переход на другой сайт

Сообщение sanych_dv »

StageWebView вы не расширите, это final class.

Можно сделать такой костыль:

Код: Выделить всё

          private var urlLoader:URLLoader;        private var webView:StageWebView; // ...      // создаем URLLoader и webView                 urlLoader = new URLLoader;        urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);        urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onUrlLoaderIOError);         urlLoad("http://yandex.ru/yandsearch?text=flash&lr=76");                    webView = new StageWebView;        webView.stage = this.stage;                webView.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);        webView.addEventListener(Event.COMPLETE, onWebViewComplete);        webView.addEventListener(Event.LOCATION_CHANGE, onLocationChange);        webView.addEventListener(ErrorEvent.ERROR, onWebViewError);     private function urlLoad(urlString:String):void {        urlLoader.load(new URLRequest (urlString) );        }                private function onURLLoaderComplete(e:Event):void         {        // получаем HTML в строку        var str:String = URLLoader(e.currentTarget).data;                // парсим HTML на предмет ссылок с target=_blank и переписываем на _self (или удаляем таргеты)        // к примеру....                var myPattern:RegExp = /target="_blank"/gi;        str = str.replace(myPattern, 'target="_self"');            // Создаем webView и загружаем в webView поправленный HTML                webView.loadString(str);                }                private function onWebViewComplete(e:Event):void         {                    //trace( StageWebView(e.currentTarget).title   )        }                        private function onLocationChange(e:Event):void         {                        // location бывает странным :))                       trace(e.currentTarget.location);                        // по ссылке загружаем новый url через UrlLoader            urlLoad ("http:" + e.currentTarget.location)                            }         private function onUrlLoaderIOError(e:IOErrorEvent):void         {            trace(e.errorID, e.text);        }                private function onWebViewError(e:ErrorEvent):void         {            trace(e.errorID, e.text);        }  
Аватара пользователя
Kavis
Сообщения: 33
Зарегистрирован: 02 сен 2012, 11:10

Re: HTMLLoader переход на другой сайт

Сообщение Kavis »

sanych_dv ,
Не прокатил этот код, у яндекса кнопка не работает, и ошибки идут в отладку, похоже в HTML стирается что-то еще, я вот думаю может можно, как то отследить, что нажали по ссылке, которая открывается в новом окне и загрузить эту ссылку через stageWebView.loadURL, но тут даже если пытаться просто ссылку выдернуть, и то не получается, LocationChangeEvent не реагирует на ссылки которые в новом окне..... :shock:
Ответить