SWFObject を使用して Flash SWF ファイルを再生しています。SWF ファイルは、いくつかのフラッシュ変数をサポートしています。一重引用符と二重引用符が混在する Flash 変数の 1 つに複雑な値を渡そうとすると、SWFObject が完全にレンダリングされたコンテンツを Flash オブジェクト用に確保された DIV に書き込むときに問題が発生します。
以下のコードは、 SWFObject がレンダリングされたコンテンツを書き込むflashcontentという名前の DIV と、SWFObject とやり取りする Javascript コードを示しています。
<!-- Div that will receive the Flash object. This DIV is written to by SWFObject.js. Therfore It's name must match the name
in the so.write() statement below. -->
<div id="flashcontent">
</div>
<!-- Div that will receive the Flash object. This DIV is written to by SWFObject.js. Therfore It's name must match the name
in the so.write() statement below. -->
<div id="flashcontent">
</div>
<!-- Create the tag cloud -->
<script type="text/javascript">
var so = new SWFObject("/Content/flash/tagcloud.swf", "tagcloud", "600", "400", "7", "#336699");
so.addParam("wmode", "transparent");
so.addVariable("mode", "tags");
so.addVariable("distr", "true");
so.addVariable("tcolor", "0xff0000");
so.addVariable("hicolor", "0x000000");
so.addVariable("tagcloud", "<tags><a href='javascript:showMessage(\"tag1\");' style='9'>tag one</a><a href='javascript:showMessage(\"tag2\");' style='12'>Tag two</a></tags>");
so.write("flashcontent");
</script>
ご覧のとおり、Javascript の showMessage() 関数に渡される文字列パラメーターを囲む二重引用符をエスケープしようとしています。ただし、flashcontent DIV コンテンツがレンダリングされると、次のようになります。
<div id="flashcontent"><embed type="application/x-shockwave-flash" src="/Content/flash/tagcloud.swf" width="600" height="400" id="tagcloud" name="tagcloud" bgcolor="#336699" quality="high" wmode="transparent" flashvars="mode=tags&distr=true&tcolor=0xff0000&hicolor=0x000000&tagcloud=<tags><a href='javascript:showMessage(" tag1");'="" style="9">tag one<a href='javascript:showMessage("tag2");' style="12">Tag two</a>"/></div>
最初のエスケープされた二重引用符は、エスケープされていない二重引用符として解釈され、フォーマットが壊れて無効なハイパーリンクになります。エスケープされていない引用符を取り除くと、内容は次のようになります。
<div id="flashcontent"><embed type="application/x-shockwave-flash" src="/Content/flash/tagcloud.swf" width="600" height="400" id="tagcloud" name="tagcloud" bgcolor="#336699" quality="high" wmode="transparent" flashvars="mode=tags&distr=true&tcolor=0xff0000&hicolor=0x000000&tagcloud=<tags><a href='javascript:showMessage(tag1);' style='9'>tag one</a><a href='javascript:showMessage(tag2);' style='12'>Tag two</a></tags>"></div>
これで、フォーマットが適切になり、Web ページが健全になりました。当然のことながら、ShowMessage() 関数がメッセージを表示すると、tag1とtag2が有効な Javascript 変数名ではないため、「未定義」と表示されます。
SWFObject のaddvariableメソッドは、エスケープされた二重引用符に対して通常とは異なることを行いますか? Javascript メソッドのパラメーターを二重引用符で囲むことができるように、 addvariableが受け入れる文字列を作成するにはどうすればよいですか?