- ベストアンサー
Ajax.Updaterでjavascriptを記述する方法
お世話になります。 prototype.jsを使って開発をしております。 Ajax.UpdaterにevalScripts: trueを設定し request.responseTextにjavascriptが記述されたものを返しているのですが javascriptに<(小なり)、>(大なり)があると ><に変換されてしまい、javascriptが正常に動作しません。 なければ正常に動作します。 恐らくはrequest.responseTextに返す前にPHPで $xsl = new DomDocument(); $xsl->load("hoge.xsl"); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); とパースをかけていることが原因だと思うのですが 何か対処法はありませんでしょうか? どうぞよろしくお願い致します。 xslに書いてあるjavascriptの内容 <script language="javascript" type="text/javascript"> // <![CDATA[ test = function(hoge){ if(hoge > 3){ alert("over"); } }; // ]]> </script> http://oshiete1.goo.ne.jp/kotaeru.php3?q=1875880 を参考にCDATAをscriptの中に書いたり、外に書いたりと試しましたが ダメでした。当然か。。。 <script type="text/javascript" src="./hoge.js"></script> という風に外部ファイルとしてなら恐らく上手くいくと思うのですが・・・。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
実際に試していませんけど、 transformToXML の出力は文字列ですから、 echo する前に、一旦文字列変数で受けて、変換(&gt;→>とか)できないですか?
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#5>evalScripts: trueを設定したら… いっそ、evalScripts での実行でなくて、 自前でeval したらいいんじゃないかと思いますけど。
補足
BLUEPIXY様、申し訳御座いません。 evalScripts: trueでは、なくてjavascriptでエラーがおきてました。 それを修正しましたら、OKでした。 お騒がせしまして申し訳御座いませんでした。
- gaku1
- ベストアンサー率71% (10/14)
testから};までをあらかじめurlエンコードしておき, -- var str=urlエンコードされたjavascriptコード; eval(unescape(str)); -- というのはどうでしょうか。これならば不等号以外も一括して処理できそうな気がします。
お礼
gaku1様、たびたび有難う御座いました。 NO.5のお礼にて書きましたが、 どこでアンエスケープしてもダメなようです。 おかしいなぁー。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#4>scriptタグの中だけエスケープ処理を外すのがよいのでしょうか。 そうですね。それが目的ですから。
お礼
BLUEPIXY様、ご教授有難う御座います。 結果から言いますとダメでした。 transformToXMLした後にhtmlspecialchars_decodeをしましたが、&gt;のまま。 javascriptにて受け取ったreq.responseTextの&gt;をreplaceしてもダメでした。 結局Ajax.UpdaterにevalScripts: trueを設定したら 自動的にエスケープされてしまうのかなぁーと。 で、やっぱり外部ファイルとして宣言しようと思ったのですが <script language="javascript" type="text/javascript" src="hoge.js"></script> が読みにいってくれない。 何が原因か分かりますでしょうか?
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
PHPとprototype.jsについては詳しくないですが、 > echo $processor->transformToXML($xml); で出力しているのはXMLですよね? responseTextをeval()して利用出来るのはXMLではなくJavaScriptだけですから、 > echo $processor->transformToXML($xml); の部分を削除して、 Content-type: text/plain または Content-type: application/x-javascript などのコンテントヘッダを出して、 echo "test = function(hoge){"; echo "if(hoge > 3){"; echo "alert("over");"; echo "}"; echo "};"; としないといけないと思いますが、そういうことではないのでしょうか? はずしてたらすみません。
お礼
talooさん、ご教授有難う御座います。 すみません。説明不足でした。 XML+XSLTでXSLTの中にjavascriptを記述しています。
- gaku1
- ベストアンサー率71% (10/14)
No.1です。No.1は間違っていました。 もし,Math.log()を使うのであれば,対数関数への引数が負の時のほかに,引数が1になるとき(hoge==2のとき)の処理も追加してください。すみませんでした。
- gaku1
- ベストアンサー率71% (10/14)
if(hoge > 3)の不等号だけが問題なのであれば,これを回避するために汚らしいやりかたですが, if(!Math.log(3-hoge)) とやってみる手はあるかもしれません。
お礼
gaku1様、ご教授有難う御座います。 Math.logを使えば、不等号は解決しますね。 パースした時に問題になるのが不等号だけだったら この対応でOKですね。 が、問題になりそうなのはパースしたときに文字実体参照に 変換されてしまう文字ですね。 すべて洗い出しておかないといけないのか。。。
お礼
BLUEPIXY様、ご教授有難う御座います。 ただ今時間が無いので試しておりませんが 多分出来ると思います。 ただその場合、不等号だけではないということが問題です。 自分だけ、その箇所だけ、というならこの方法でも構わないのかもしれませんが・・・。 scriptタグの中だけエスケープ処理を外すのがよいのでしょうか。 ちなみに外部ファイルの宣言で上手くいきませんでした。。。