準・究極の選択

お世話になります。

prototype.jsを使って開発をしております。

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

A 回答 (7件)

実際に試していませんけど、


transformToXML の出力は文字列ですから、
echo する前に、一旦文字列変数で受けて、変換(&gt;→>とか)できないですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/02 23:16

#5>evalScripts: trueを設定したら…


いっそ、evalScripts での実行でなくて、
自前でeval したらいいんじゃないかと思いますけど。

この回答への補足

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

補足日時:2006/10/05 16:28
    • good
    • 0

testから};までをあらかじめurlエンコードしておき,


--
var str=urlエンコードされたjavascriptコード;
eval(unescape(str));
--
というのはどうでしょうか。これならば不等号以外も一括して処理できそうな気がします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/05 15:32

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


そうですね。それが目的ですから。
    • good
    • 0
この回答へのお礼

BLUEPIXY様、ご教授有難う御座います。
結果から言いますとダメでした。
transformToXMLした後にhtmlspecialchars_decodeをしましたが、&gt;のまま。
javascriptにて受け取ったreq.responseTextの&gt;をreplaceしてもダメでした。

結局Ajax.UpdaterにevalScripts: trueを設定したら
自動的にエスケープされてしまうのかなぁーと。
で、やっぱり外部ファイルとして宣言しようと思ったのですが
<script language="javascript" type="text/javascript" src="hoge.js"></script>
が読みにいってくれない。
何が原因か分かりますでしょうか?

お礼日時:2006/10/05 15:30

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 "};";

としないといけないと思いますが、そういうことではないのでしょうか?
はずしてたらすみません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/02 00:35

No.1です。

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

if(hoge > 3)の不等号だけが問題なのであれば,これを回避するために汚らしいやりかたですが,


if(!Math.log(3-hoge))
とやってみる手はあるかもしれません。
    • good
    • 0
この回答へのお礼

gaku1様、ご教授有難う御座います。
Math.logを使えば、不等号は解決しますね。

パースした時に問題になるのが不等号だけだったら
この対応でOKですね。
が、問題になりそうなのはパースしたときに文字実体参照に
変換されてしまう文字ですね。
すべて洗い出しておかないといけないのか。。。

お礼日時:2006/10/01 20:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報