ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   Flex Builder 2.0
     htmlTextプロパティ設定時にエラー
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
gekotan
投稿日時: 2007-5-1 13:41
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

未だにエラーの拾い方は解りませんが、imgタグが自動で読み込まれることを考えて、ちょっと思うことがありまして以下のコードを試してみました。


<?xml version="1.0" encoding="utf-8"?>

<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute"
	 creationComplete="init()">
<mx:Script>
	<![CDATA[
		// こっちは大丈夫だけど		
		private var text1:String ="<b>画像前</b><img src=\"http://www.fxug.net/modules/xhnewbb/index.php\"><b>画像後</b>";
		// こっちはダメね・・・
		private var text2:String = "<b>画像前</b><img src=\"java script:document.location='http://www.fxug.net/modules/xhnewbb/index.php'\"><b>画像後</b>";
		
		private function init():void{
			this.addEventListener("ioError",test);
			this.addEventListener(IOErrorEvent.NETWORK_ERROR,test);
			this.addEventListener(IOErrorEvent.VERIFY_ERROR,test);
			this.addEventListener(IOErrorEvent.DISK_ERROR,test);



			txtTest.addEventListener(IOErrorEvent.IO_ERROR,test);
			txtTest.addEventListener(IOErrorEvent.NETWORK_ERROR,test);
			txtTest.addEventListener(IOErrorEvent.VERIFY_ERROR,test);
			txtTest.addEventListener(IOErrorEvent.DISK_ERROR,test);


			try{
				txtTest.htmlText = text2;
				
			}catch(e:Error){
				trace(e.message);
			}
		
		}
		
		private function test(evt:IOErrorEvent):void{
			trace("aa");
		}		
	]]>
</mx:Script>
	<mx:TextArea id="txtTest"/>	
</mx:Application>


URLをimgのsrc属性に設定する場合は大丈夫なんですが、javascriptで設定すると、ホラ、エラーが出た後、FxUGにすっ飛んでいきます(笑)

CSRFの踏み台の出来上がり・・・htmlTextって、使用できるタグが制限されているので逆に安全かと思ってましたが、ちょっと怖いかな。RSSやAtomのサマリの中にimgタグ見たら除去した方がいいのかもしれないかも・・・もしくはsrc属性がjava script:で始まった場合は除去とか・・・

まぁ、実際にはcrossdomainの問題があるので、FlexでRSSリーダー作るより、PHPなんかで読ませてFlexには結果だけ返すことにはなるんでしょうが、うーん・・・(実は最初、crossdomainの問題にも気付いていなかった。嗚呼悲しきflash初心者)

RichTextEditorとかでも同じなのかな。ブラケットじゃなくてタグを使っていたので、ちょっと怖いですね。

gekotan
zono
投稿日時: 2007-4-30 1:20
やや お馴染みさん
登録日: 2007-1-21
居住地: Aichi/Japan
投稿: 4
Re: htmlTextプロパティ設定時にエラー
こん○○は。
いつも短直な発想で恐縮です。
皆さんの深い知識と考察に勉強させられる次第です。

「htmlTextプロパティ設定時にエラー」の続きですが...(懲りずに:汗)
wolfさんが報告されたCanvas不具合の影響は、ただただ、そうなんだぁ〜と納得してしまいます。

<img.../>が1つならいいのに、2つだとエラーが出てしまう...スキル不足の私では的を
得た解決法は見出せませんが...次のような対策は変でしょうか?

▼アプリケーション(27行目あたり)
引用:

private function lstItems_change(evt:Event):void{

myHBox.removeChild(txaDescription); ←ここから追加
txaDescription = new TextArea();
myHBox.addChild(txaDescription);
txaDescription.explicitWidth=300;
txaDescription.explicitHeight=300; ←ここまで追加


var selectedItem:RssItem= evt.target.selectedItem as RssItem; this.txaDescription.htmlText = selectedItem.rssDescription; this.txaDescription2.text = selectedItem.rssDescription;
}
     ▽
     ▽(中略)
     ▽
<mx:HBox width="100%" height="100%" id="myHBox">←ID追加

TextAreaを毎回、削除と追加を繰り返すというものです。
ちょっと強引ですが...
(エラー確認もしっかりとやってません)

追伸:
gekotanさんの画像リンク切れの取得について私にはわかりません。スミマセン


----------------
****************************
WindowsXP(SP2)
IE(6.0)
Flex(2.0)
FlexBuilder(2.0)
****************************

gekotan
投稿日時: 2007-4-28 23:03
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

htmlTextのネタに便乗してもうひとつ
<img>タグで画像が表示されるのですが、この画像がリンク切れを起こしていたり、そもそもなかった場合、

Error #2044: ハンドルされていない IOErrorEvent : text=Error #2035: URL が見つかりません。

というエラーが表示されてしまうのですが、これってどうやって拾うんでしょう?

try catchで、囲んでも、
TextAreaにIOErrorEventを拾うリスナーを登録しても、
this(Application)にIOErrorEventを拾うリスナーを登録しても、
拾えません。うーん、ASやFlexを使い始めたのは今年からなんですが、なんか根本的にエラーに対する考えが間違っているのかな

gekotan
wolf
投稿日時: 2007-4-27 0:52
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
自分も一度別の理由でTextFieldまで追ってみたことがあるんですが、そこから向こうはmx_internalの世界なんですよねぇ。
オープンソース化で明らかになるんだろうか。

アイデアとしては、スクロールバーなしで表示するようにしたTextFieldをContainerでラップしたカスタムコンポーネントを作成し、
スクロールバーはTextFieldの外側で表示させるようにする、っていうのが思い浮かびますが、試す気力が・・・(^^;
venzou
投稿日時: 2007-4-26 13:47
ご主人様
登録日: 2007-1-25
居住地: 穴の中
投稿: 101
Re: htmlTextプロパティ設定時にエラー
こんにちは

エラーの発生条件を絞り込んでみました。

TextAreaの場合
・wordWrap=true(デフォルト)
・画像が2つ以上含まれるhtmlを表示する
・スクロールバーが表示される
・上記の後、htmlText or textを変更するとエラー


継承元をTextFieldまで辿りました。

TextFieldの場合
・wordWrap=true
・画像が2つ以上含まれるhtmlを表示する
・上記の後、htmlText or textを変更するとエラー


TextFieldの問題らしい所までは分かりましたが、ここから先はお手上げです。


エラー再現用アプリ(画像ファイルtest.gifを用意してください)
test.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" >
    <mx:Script>
        <![CDATA[
            import flash.text.TextField;
            import mx.controls.TextArea;

            //エラーの条件
            //画像が2つ以上ある
            //test.gifを用意してください(内容は適当に)
            private var testHtml:String = ''
                +'<img id="img1" src="test.gif" height="100" width="200" />'
                +'<img id="img2" src="test.gif" height="100" width="200" />'
                +'<br>0<br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9'
                +'<br>0<br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9'
                ;

            private var tf:TextField = new TextField;

            private function clickEvt1():void{
                //txaDescription.wordWrap = false;
                //↑wordWrap = falseだとエラーにならない(しかし、表示が乱れる)
                txaDescription.htmlText = testHtml;
            }

            private function clickEvt2():void{
                txaDescription.htmlText = '';
                //↑ここでエラー
                //txaDescription.text = '';
                //↑これでもエラー
            }

            private function clickEvt3():void{
                //エラーの条件
                //wordWrap=falseだとエラーにならない
                tf.wordWrap = true;

                tf.width = img.width;
                tf.height = img.height;
                tf.htmlText = testHtml;
                img.addChild(tf);
            }
            private function clickEvt4():void{
                tf.htmlText = '';
                //↑ここでエラー
                //tf.text = '';
                //↑これでもエラー
            }
        ]]>
    </mx:Script>
    <mx:HBox>
        <mx:VBox>
            <mx:TextArea id="txaDescription" width="200" height="200"/>
            <mx:Button label="TextAreaのエラー再現(1)" click="clickEvt1()" />
            <mx:Button label="TextAreaのエラー再現(2)" click="clickEvt2()" />
        </mx:VBox>
        <mx:VBox>
            <mx:Image id="img" width="200" height="200"/>
            <mx:Button label="TextFieldのエラー再現(1)" click="clickEvt3()" />
            <mx:Button label="TextFieldのエラー再現(2)" click="clickEvt4()" />
        </mx:VBox>
    </mx:HBox>
</mx:Application>


(1)(2)の順にボタンを押すと100%エラーになります。(SDK2.0.1で確認)

ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。
wolf
投稿日時: 2007-4-22 18:30
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
うーん(^^;

試してみましたが、「はてなブックマークに追加」の画像リンクボタンがガッツリ消えてます・・・。

この件についてですが、エラー報告スレで書いたCanvasの不具合と似たような原因ではないかと考えています。
そもそも、画像リンクまできちんと表示されるようにスクロール領域が設定されて欲しい・・・。

zono
投稿日時: 2007-4-22 5:08
やや お馴染みさん
登録日: 2007-1-21
居住地: Aichi/Japan
投稿: 4
Re: htmlTextプロパティ設定時にエラー
こん○○は。
FLEXビギナーですがtrial and errorで検証してみました(汗

恐らくですが...

ロードするHTMLの中にチルダ(~)があるとエラーが出るのでは

・RssReader.asの105行辺りにチルダ取るコード追加
引用:

private function getRSSData(rssXML:XML):void{
if (rssXML.namespace("") != undefined) {
default xml namespace = rssXML.namespace("");
}
for each (var item:XML in rssXML..item) {
// linkのないものは表示しない
if(item.link.toString() != ""){
var rssItem:RssItem = new RssItem();
rssItem.rssTitle = item.title.toString();
rssItem.rssDescription = item.description.toString() .replace(/~/gi, "");←これを追加
rssItem.rssLink = item.link.toString();
rssItem.tags = cardTag;
_itemList.push(rssItem);
}
}


こんな感じで試してみたところ、verticalScrollPolicyを記さなくとも取り急ぎエラー出ておりません。
ビギナーの見解ですのでご参考までに。。


----------------
****************************
WindowsXP(SP2)
IE(6.0)
Flex(2.0)
FlexBuilder(2.0)
****************************

gekotan
投稿日時: 2007-2-23 20:43
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

なるほど、確かに画面サイズを小さくしたり、verticalScrollPolicyをOnにしたりすると出なくなりました。有難うございます。助かりました。

何となく、大きなhtmlを表示した後に出やすいなとは思っていたのですが、スクロールバーにまで頭が行きませんでした。

とりあえず、verticalScrollPolicyをOnにして運用してみて、またエラーが出たらその時考えることにします。

有難うございました。

gekotan
wolf
投稿日時: 2007-2-23 0:31
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
現象を確認しました。
イベントのweakReferenceのせいかと思ったのですが、違うみたいですので発言を修正します。

私の環境では、大きなhtmltextをsetしたあと、次のhtmlTextをセットしようとするとエラーが起こるように見えましたが、画面サイズを十分に小さくして、どのRSSでもスクロールバーが表示されるようにすると、エラーがまったくでなくなりました。
同様に、verticalScrollPolicyをOnに設定しても、エラーが発生しなくなりました。

スクロールバーの表示・非表示の切り替えに関するバグのような気がします・・・。断言できませんが。
gekotan
投稿日時: 2007-2-22 20:31
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

うーん、同じ内容でも出るときと出ないときがあるので、タグの問題でもないような・・・

エラーの処理方法は未だわかりませんが、大体どういった状況で起こるかは判明しました。

どうも、TextAreaのサイズに収まりきらないような内容を表示したときに「たまに」出るエラーのようです。
以下、再現しやすいコードを載せてみます。
RssReader.asはmanagersというパッケージにありますので、フォルダをつくってそこに、RssItemはvalueObjectsというパッケージにありますので、フォルダをつくってそこにコピーしてください。

まずはアプリケーション

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="horizontal"
	creationComplete="init()">
	<mx:Script>
		<![CDATA[
			import valueObjects.RssItem;
			import mx.collections.ArrayCollection;
			import managers.RssReader;
			private var reader:RssReader;
			[Bindable]
			private var rssItems:ArrayCollection;

			private function init():void{
				reader = new RssReader();
	   			reader.addEventListener("dataLoaded",rssLoadHandler);			
			}
			private function rssLoadHandler(evt:Event):void{
				rssItems = new ArrayCollection(reader.itemList);				
			}
			
			private function btnSend_click(evt:MouseEvent):void{
    			reader.load(txtSite.text);				
			}
			
			private function lstItems_change(evt:Event):void{
				var selectedItem:RssItem= evt.target.selectedItem as RssItem;
				this.txaDescription.htmlText = selectedItem.rssDescription; 
				
				
			}			
		]]>
	</mx:Script>
	<mx:HBox width="100%" height="100%">
		<mx:VBox width="100%" height="100%">
			<mx:HBox width="100%" height="50%">
				<mx:Label text="サイトURL"/>
				<mx:TextInput id="txtSite" text="http://feeds.feedburner.jp/wbb"/>
				<mx:Button id="btnSend" label="送信" click="btnSend_click(event)"/>			
			</mx:HBox>

			<mx:List 
				id="lstItems" 
				width="100%" 
				height="200%" 
				dataProvider="{rssItems}"
				labelField="rssTitle"
				change="lstItems_change(event)"/>
		</mx:VBox>
		<mx:TextArea id="txaDescription" width="200%" height="50%"/>

	</mx:HBox>

</mx:Application>






次は、RssReader

package managers
{
	import flash.utils.*;
	import flash.net.URLRequest;
	import flash.net.URLLoader;
	import flash.events.*;
	import valueObjects.RssItem	

	[Event(name="dataLoaded")]		
	public class RssReader extends EventDispatcher
	{
		private var _title:String;
		private var _description:String;
		private var _itemList:Array;
		private var _loader:URLLoader;
		
		public var cardTag:String;
		
		// コンストラクタ
		public function RssReader(){
			_itemList = new Array();
			_loader = new URLLoader();
			// イベント登録
			_loader.addEventListener(Event.COMPLETE, loadHandler);
			_loader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
			_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
		}
		
		// プロパティ
		public function get itemList():Array{
			return _itemList;
		}
		
		public function get title():String{
			return _title;
		}
		
		public function get description():String{
			return _description;
		}
		
	
		public function load(urlString:String):void{
			var rssXMLURL:URLRequest = new URLRequest(urlString);
			_loader.load(rssXMLURL);	
		}
		// Atomにも対応したけど、系統多すぎて網羅できているか不安。仕様をはっきり決めて欲しい
		private function loadHandler(evt:Event):void{
			try{
				parse(_loader.data);
/* 				_itemList = new Array();
				var rssXML:XML = XML(_loader.data);

				if(isAtom(rssXML)){
					getAtomData(rssXML);
				}else{
					getRSSData(rssXML);
				}
 */				
 				XML.prettyPrinting = false;				
				this.dispatchEvent(new Event("dataLoaded", true));
			}catch(ex:Error){
				trace(ex.message);
				
			}			
	
		}
		
		private function ioErrorHandler(evt:IOErrorEvent):void{
			trace(evt.toString());
		}
		
		private function securityErrorHandler(evt:SecurityErrorEvent):void{
			trace(evt.toString());			
		}
		
		// RSS(Atom)のパース
		public function parse(rss:Object):void{
				_itemList = new Array();
				var rssXML:XML = XML(rss);

				if(isAtom(rssXML)){
					getAtomData(rssXML);
				}else{
					getRSSData(rssXML);
				}
			
		}
		
		private function getRSSData(rssXML:XML):void{
			if (rssXML.namespace("") != undefined) {
				default xml namespace = rssXML.namespace("");
			}
			for each (var item:XML in rssXML..item) {
				// linkのないものは表示しない
				if(item.link.toString() != ""){
					var rssItem:RssItem = new RssItem();
					rssItem.rssTitle = item.title.toString();
					rssItem.rssDescription = item.description.toString();
					rssItem.rssLink = item.link.toString();
					rssItem.tags = cardTag;
					_itemList.push(rssItem);
				}
			}
			_title = rssXML.channel.title.toString();
			_description = rssXML.channel.description.toString();
			
		}
		
		private function getAtomData(atomXML:XML):void{
			if (atomXML.namespace("") != undefined) {
				default xml namespace = atomXML.namespace("");
			}
			for each (var entry:XML in atomXML..entry) {
				// linkのないものは表示しない
				var link:String;
				if(entry.link.toString() == ""){
					link = entry.link.@href;
				}else{
					link = entry.link;
				}
				
				if(link != ""){
					var rssItem:RssItem = new RssItem();
					rssItem.rssTitle = entry.title.toString();
					rssItem.rssDescription = entry.content.toString();
					rssItem.rssLink = link;
					rssItem.tags = cardTag;
					_itemList.push(rssItem);
				}
			}
			_title = atomXML.title.toString();
			_description = atomXML.subtitle.toString();
			
		}
		// 暫定。w3cとpurl.orgのatomがあって厄介。
		// そのうち正式な判別方法に差し替え
		private function isAtom(xml:XML):Boolean{

			if(xml.name().toString().indexOf("::feed") != -1){
				return true;
			}else{
				return false;
			}
		
		}
	}
}


最後にRssItem

package valueObjects
{
	[Bindable]
	public class RssItem
	{
		private var _rssTitle:String;
		public var rssLink:String;
		public var rssDescription:String;
		public var tags:String;
		
		public function set rssTitle(target:String):void{
			var value:String;
			value = target.replace(/<\/??b>/gi,"");
			_rssTitle = value;
		}
		
		public function get rssTitle():String{
			return 	_rssTitle;
		}

	}
}


送信ボタンをクリックすると、配信先のリストがリストボックスに表示されます。

リストボックスにある記事を高速でぐりぐり選択しているとそのうちエラーで落ちます。

なお。インプットテキストには予めエラーの出やすいサイトを予め設定してあります。

結局、原因はまだよく解りません。

長文、大変申し訳ありません

gekotan
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を