<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>chimanaco blog &#187; JavaScript</title>
	<atom:link href="http://blog.chimanaco.net/archives/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chimanaco.net</link>
	<description>ちまなこです。 Crazy about Something!</description>
	<lastBuildDate>Fri, 23 Jul 2010 09:17:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SWFObject+ExternalInterfaceでのGoogle Analytics設定</title>
		<link>http://blog.chimanaco.net/archives/20081122192257.php</link>
		<comments>http://blog.chimanaco.net/archives/20081122192257.php#comments</comments>
		<pubDate>Sat, 22 Nov 2008 10:22:57 +0000</pubDate>
		<dc:creator>chimanaco</dc:creator>
				<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Google Analytics]]></category>
		<category><![CDATA[swfobject]]></category>

		<guid isPermaLink="false">http://www.chimanaco.net/wordpress/?p=17</guid>
		<description><![CDATA[FlashとJavaSrciptの連携をするにはExternalInterfaceを使うと便利です。過去記事で面倒なやり方をエントリーしましたが今後はこちらのやり方で行こうと想います。
先日「Google Analyti [...]]]></description>
			<content:encoded><![CDATA[<p>FlashとJavaSrciptの連携をするにはExternalInterfaceを使うと便利です。<a href="http://www.chimanaco.net/blog/archives/20080903170226.php">過去記事</a>で面倒なやり方をエントリーしましたが今後はこちらのやり方で行こうと想います。</p>
<p>先日<a href="http://internet.watch.impress.co.jp/cda/news/2008/11/18/21565.html">「Google Analytics」がFlashコンテンツのアクセス解析に対応</a>しましたが、こちらのやり方は後でやってみるとして、とりあえずExternalInterfaceを使ってJavaSrciptと連携しGoogle Analyticsを使えるようにしてみます。</p>
<p>こんな感じです。</p>
<p><script type="text/javascript" src="/blog/common/js/swfobject.js">	</script><br />
<!--Start-swf--></p>
<div id="externalFlash"></div>
<p><script type="text/javascript">
// <![CDATA[
var so = new SWFObject('/blog/sample/004/testGA.swf', 'external2', '350', '200', '9', '#ffffff');
so.addParam('wmode', 'opaque');
so.addParam('allowScriptAccess', 'always');
so.write('externalFlash');
// ]]&gt;
</script><br />
<!--End-swf--></p>
<p><span id="more-17"></span></p>
<h4>参考にさせて頂いたページ</h4>
<ul class="linkOut">
<li><a href="http://ryow.net/blog/2008/06/18-211129.php">ryow.net Blog &#8211; FlashからGoogle Analyticsを使う（AS2、AS3両方対応）</a></li>
<li><a href="http://ryow.net/blog/2007/09/07-232843.php">ryow.net Blog &#8211; SWFObjectを使ったExternalInterfaceまとめ</a></li>
<li><a href="http://www.google.com/support/googleanalytics/bin/answer.py?hl=jp&#038;answer=55520">Flash イベントをトラッキングするにはどうすればよいですか。 &#8211; Google Analytics ヘルプ センター</a></li>
</ul>
<p>以下、上記のサイト様のマネマネです。<br />
まず、ExternalInterfaceを使ってJavaSrciptと連携します。htmlの設定はこんな感じ。</p>
<p>[XHTML]</p>
<div id="externalFlash">
<script type="text/javascript">
	// <![CDATA[
	var so = new SWFObject('testGA.swf', 'external2', '350', '200', '9', '#ffffff');
		so.addParam('wmode', 'opaque');
		so.addParam('allowScriptAccess', 'always');
        so.write('externalFlash');
	// ]]&gt;
</script>
</div>
<p>[/XHTML]</p>
<p>1.SWFObjectを使ってFlashを表示させる部分をexternal**というdivで囲みます。<br />
2.SWFObjectの第2引数をexternal**とします。<br />
3.allowScriptAccessをalwaysに設定。</p>
<p>external**というidにするのがポイントのようです。Flashの設定は以下のようになります。(img1をクリックするとimg1用のページIDを送信)</p>
<p>[AS3]<br />
import flash.external.ExternalInterface;<br />
import flash.events.MouseEvent;<br />
img1.addEventListener(MouseEvent.CLICK,clickTest)</p>
<p>function clickTest(event:MouseEvent)：void {<br />
      ExternalInterface.call(&#8220;pageTracker._trackPageview&#8221;, &#8220;/flash/img1/&#8221;);<br />
    }<br />
[/AS3]</p>
<p>まず最初にexternalクラスのExternalInterfaceをimportして、callメソッドでJavaScript関数を呼び出します。call(&#8220;pageTracker._trackPageview&#8221;,&#8221;ページID&#8221;);という形式です。</p>
<p>さらにより使いやすくするためにpageTracker._trackPageviewを呼び出すためのクラスを作ります（ExGA.as）</p>
<p>[AS3]<br />
package{<br />
  import flash.external.*<br />
  public class ExGA{</p>
<p>    public static function tracker(pageID):void{<br />
      ExternalInterface.call(&#8220;pageTracker._trackPageview&#8221;,pageID)<br />
    }<br />
  }<br />
}<br />
[/AS3]</p>
<p>このクラスを使ってできたサンプルがこんな感じです。（ドキュメントクラスMain.as）</p>
<p>[AS3]<br />
package {<br />
	import flash.display.MovieClip;<br />
	import flash.events.Event;<br />
	import flash.events.MouseEvent;<br />
	import flash.text.TextField;</p>
<p>	//Google Analytics<br />
	import ExGA;</p>
<p>	public class Main extends MovieClip<br />
	{</p>
<p>		//コンストラクタ<br />
		public function Main():void {<br />
			init();<br />
		}</p>
<p>		public function init():void<br />
		{<br />
			//トラッキングに使うページID設定<br />
			var page1:String = &#8220;/flash/433/&#8221;;<br />
			var page2:String = &#8220;/flash/peopot/&#8221;;</p>
<p>			//イベントリスナー登録<br />
			img1.addEventListener(MouseEvent.CLICK, clickTrack(page1));<br />
			img2.addEventListener(MouseEvent.CLICK, clickTrack(page2));<br />
		}</p>
<p>		public function clickTrack(pageID:String):Function<br />
		{<br />
			return function(event:MouseEvent):void<br />
			{<br />
				ExGA.tracker(pageID)<br />
				//TextFieldにページIDを表示<br />
				textArea.text = pageID;<br />
			}<br />
		}<br />
	}<br />
}<br />
[/AS3]</p>
<p>MouseEvent.CLICKで実行するclickTrackハンドラに引数を持たせ、その引数をExGAクラスのstatic関数trackに送って、MouseEventをもつハンドラ関数を定義しています。これによりクリックした画像により個別のページIDを持たせることができます。</p>
<p><a href="http://www.chimanaco.net/blog/sample/004/004.zip">サンプルデータ</a>(36KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chimanaco.net/archives/20081122192257.php/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash JavaScript Integration Kitを使ってFlashからJavaScriptを操作する</title>
		<link>http://blog.chimanaco.net/archives/20080903170226.php</link>
		<comments>http://blog.chimanaco.net/archives/20080903170226.php#comments</comments>
		<pubDate>Wed, 03 Sep 2008 08:02:26 +0000</pubDate>
		<dc:creator>chimanaco</dc:creator>
				<category><![CDATA[ActionScript2.0]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ActionScript]]></category>

		<guid isPermaLink="false">http://www.chimanaco.net/wordpress/?p=10</guid>
		<description><![CDATA[今回やりたいことは、
ボタンを押すと別ウィンドウでFlashのスペシャルサイト表示。
開いたスペシャルサイトから元のページを操作（ページ遷移、focusを当て前面に出す）。
個人的には同じウィンドウで全て遷移して欲しいと [...]]]></description>
			<content:encoded><![CDATA[<p>今回やりたいことは、<br />
ボタンを押すと別ウィンドウでFlashのスペシャルサイト表示。<br />
開いたスペシャルサイトから元のページを操作（ページ遷移、focusを当て前面に出す）。<br />
個人的には同じウィンドウで全て遷移して欲しいところですが、これでやってみたいと想います。</p>
<p><a href="http://www.chimanaco.net//blog/sample/001/index.html">サンプル</a></p>
<p><span id="more-10"></span></p>
<h4>参考にさせて頂いたページ</h4>
<ul class="linkOut">
<li><a href="http://blog.burnercrew.com/2006/07/flash_javascript_integration_k.html">Flash / JavaScript Integration Kit &#8211; blog.burnercrew.com</a></li>
<li><a href="http://www.trick7.com/blog/2007/05/28-224730.php">trick7.com blog: Flash / JavaScript Integration kit 日本語訳</a></li>
<li><a href="http://www.himco.jp/allList.cfm">ヒム･カンパニー:翻訳記事全リスト文字表示</a>(62番)</li>
</ul>
<p>1. <a href="http://weblogs.macromedia.com/flashjavascript/">Flash / JavaScript Integration Kit</a>から最新版をダウンロードしておきます。</p>
<p>2. 1は一寸置いといて下準備。index.htmlからspecial.htmlを別ウィンドウで開く設定をします。<br />
&lt;head&gt;～&lt;/head&gt;部分に以下を記述。</p>
<p>[JavaScript]<br />
<script type="text/javascript">
<!--
function SWwopen(){
	window.open("special.html","SWindow", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=400,height=400");
    }
//-->
</script><br />
[/JavaScript]</p>
<p>続いて&lt;body&gt;～&lt;/body&gt;内該当する箇所に以下のような記述をします。</p>
<p>[XHTML]<br />
<a href="javascript:void(0);" onclick="SWwopen()">ウィンドウを開く</a><br />
[/XHTML]</p>
<p>これで別ウィンドウを開く準備ができました。続いて別ウィンドウで開くspecial.htmlの設定をします。</p>
<p>ActionScriptからJavaScriptを操作する設定をします。まずhtml側。<br />
installationフォルダ内のJavaScriptFlashGateway.js、JavaScriptFlashGateway.swfを今回使用するフォルダに移動。<br />
HTMLにFlashProxyのインスタンスを生成するJavaScriptを記述します。<br />
※xxxの部分は任意です。
</p>
<p>[JavaScript]<br />
<script type="text/javascript" src="xxx/JavaScriptFlashGateway.js"></script><br />
<script language="javascript">
var lcId = new Date().getTime();
var flashProxy = new FlashProxy(lcId, "xxx/JavaScriptFlashGateway.swf");
</script><br />
[/JavaScript]</p>
<p>body内にswfを表示するJavaScriptを記述。</p>
<p>[JavaScript]<br />
<script type="text/javascript">
var tag = new FlashTag("xxx/xxxx.swf", swfのheight, swfのwidth); // last two arguments are height and width
tag.setFlashvars('lcId='+lcId);
tag.write(document);
</script><br />
[/JavaScript]</p>
<p>さらに元ウィンドウをページ遷移させ、focusを当てるJavaScriptを記述。</p>
<p>[JavaScript]<br />
<script type="text/javascript">
<!--
function GoWin(WO) {
	if (opener.closed) {
		NewWin=window.open("","MWindow");
		NewWin.location.href=WO;
		window.opener.focus();    
		} 
    else { opener.location.href=WO;	
	window.opener.focus();
	}
}
//-->
</script><br />
[/JavaScript]</p>
<p>続いてFlash側。&quot;source/flash/actionscript&quot; 内のライブラリファイルをクラスパスが通る場所に置いて、importします。さらに、JavaScriptProxyクラスのインスタンスを作成します。</p>
<p>[AS3]<br />
import com.macromedia.javascript.JavaScriptProxy;<br />
var proxy:JavaScriptProxy = new JavaScriptProxy();<br />
[/AS3]</p>
<p>ここで「&quot;com.macromedia.javascript.JavaScriptProxy&quot;がロードされませんでした。」というエラーが出て暫く足踏みしたのですが、参考にさせて頂いた<a href="http://blog.burnercrew.com/2006/07/flash_javascript_integration_k.html">Flash / JavaScript Integration Kit &#8211; blog.burnercrew.com</a>の、</p>
<blockquote><p>Windows 版の Flash は asファイルが BOM つきの UTF-8 で保存されてないとダメらしい。<br />
JavaScriptProxy.as と JavaScriptSerializer.as を Flash で一度開いてから保存しなおすことによって解決。</p></blockquote>
<p>を発見してひと安心。仰る通りにして解決。<br />
続いてJavaScriptの関数を呼び出す以下の記述をします。</p>
<p>[AS3]<br />
proxy.call(&#8220;javaScriptMethodName&#8221;, &#8220;arg1&#8243;, new Object());<br />
[/AS3]</p>
<p>俺の場合、html側の記述で関数名がGoWin()、引数にURLを取る設定になっています。<br />
Flash側ではボタンを2つ作り、btn_01、btn_02と名前をつけてそれぞれ押すとその設定が入るようにしています。<br />
ソースは以下のようになりました。</p>
<p>[AS3]<br />
import com.macromedia.javascript.JavaScriptProxy;<br />
var proxy:JavaScriptProxy = new JavaScriptProxy();</p>
<p>//インスタンス宣言<br />
var btn_01:Button;<br />
var btn_02:Button;</p>
<p>//変数宣言<br />
var pageNum:Number;</p>
<p>//ブロードキャスター用オブジェクト<br />
var objCast:Object = new Object();</p>
<p>//カスタムブロードキャスター初期化<br />
AsBroadcaster.initialize(objCast);</p>
<p>//リスナー用オブジェクト<br />
var objListener:Object = new Object();</p>
<p>//objListenerをobjCastのイベントリスナーに登録<br />
objCast.addListener(objListener);</p>
<p>//関数定義<br />
objListener.eventComplete = function():Void  {<br />
	switch (pageNum) {<br />
		case 1 :<br />
			page = &#8220;page1.html&#8221;;<br />
			break;<br />
		case 2 :<br />
			page = &#8220;page2.html&#8221;;<br />
			break;<br />
	}<br />
	trace(pageNum);<br />
	proxy.call(&#8220;GoWin&#8221;,page,new Object());<br />
};</p>
<p>btn_01.onRelease = function() {<br />
	pageNum = 1;<br />
	objCast.broadcastMessage(&#8220;eventComplete&#8221;);<br />
};</p>
<p>btn_02.onRelease = function() {<br />
	pageNum = 2;<br />
	objCast.broadcastMessage(&#8220;eventComplete&#8221;);<br />
};<br />
[/AS3]</p>
<p>参考にさせて頂いたページも結構前の記事だったので、今はもっと好い方法があるのかもしれませんね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chimanaco.net/archives/20080903170226.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
