• ベストアンサー

Ajax.Updaterでjavascriptを記述する方法

お世話になります。 prototype.jsを使って開発をしております。 Ajax.UpdaterにevalScripts: trueを設定し request.responseTextにjavascriptが記述されたものを返しているのですが javascriptに<(小なり)、>(大なり)があると &gt;&ltに変換されてしまい、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> という風に外部ファイルとしてなら恐らく上手くいくと思うのですが・・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

実際に試していませんけど、 transformToXML の出力は文字列ですから、 echo する前に、一旦文字列変数で受けて、変換(&gt;→>とか)できないですか?

bakenshibakenshi
質問者

お礼

BLUEPIXY様、ご教授有難う御座います。 ただ今時間が無いので試しておりませんが 多分出来ると思います。 ただその場合、不等号だけではないということが問題です。 自分だけ、その箇所だけ、というならこの方法でも構わないのかもしれませんが・・・。 scriptタグの中だけエスケープ処理を外すのがよいのでしょうか。 ちなみに外部ファイルの宣言で上手くいきませんでした。。。

その他の回答 (6)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#5>evalScripts: trueを設定したら… いっそ、evalScripts での実行でなくて、 自前でeval したらいいんじゃないかと思いますけど。

bakenshibakenshi
質問者

補足

BLUEPIXY様、申し訳御座いません。 evalScripts: trueでは、なくてjavascriptでエラーがおきてました。 それを修正しましたら、OKでした。 お騒がせしまして申し訳御座いませんでした。

  • gaku1
  • ベストアンサー率71% (10/14)
回答No.6

testから};までをあらかじめurlエンコードしておき, -- var str=urlエンコードされたjavascriptコード; eval(unescape(str)); -- というのはどうでしょうか。これならば不等号以外も一括して処理できそうな気がします。

bakenshibakenshi
質問者

お礼

gaku1様、たびたび有難う御座いました。 NO.5のお礼にて書きましたが、 どこでアンエスケープしてもダメなようです。 おかしいなぁー。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#4>scriptタグの中だけエスケープ処理を外すのがよいのでしょうか。 そうですね。それが目的ですから。

bakenshibakenshi
質問者

お礼

BLUEPIXY様、ご教授有難う御座います。 結果から言いますとダメでした。 transformToXMLした後にhtmlspecialchars_decodeをしましたが、&gt;のまま。 javascriptにて受け取ったreq.responseTextの&gt;をreplaceしてもダメでした。 結局Ajax.UpdaterにevalScripts: trueを設定したら 自動的にエスケープされてしまうのかなぁーと。 で、やっぱり外部ファイルとして宣言しようと思ったのですが <script language="javascript" type="text/javascript" src="hoge.js"></script> が読みにいってくれない。 何が原因か分かりますでしょうか?

回答No.3

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 "};"; としないといけないと思いますが、そういうことではないのでしょうか? はずしてたらすみません。

bakenshibakenshi
質問者

お礼

talooさん、ご教授有難う御座います。 すみません。説明不足でした。 XML+XSLTでXSLTの中にjavascriptを記述しています。

  • gaku1
  • ベストアンサー率71% (10/14)
回答No.2

No.1です。No.1は間違っていました。 もし,Math.log()を使うのであれば,対数関数への引数が負の時のほかに,引数が1になるとき(hoge==2のとき)の処理も追加してください。すみませんでした。

  • gaku1
  • ベストアンサー率71% (10/14)
回答No.1

if(hoge > 3)の不等号だけが問題なのであれば,これを回避するために汚らしいやりかたですが, if(!Math.log(3-hoge)) とやってみる手はあるかもしれません。

bakenshibakenshi
質問者

お礼

gaku1様、ご教授有難う御座います。 Math.logを使えば、不等号は解決しますね。 パースした時に問題になるのが不等号だけだったら この対応でOKですね。 が、問題になりそうなのはパースしたときに文字実体参照に 変換されてしまう文字ですね。 すべて洗い出しておかないといけないのか。。。

関連するQ&A