3

あるページが別のページの中に iframe されています。子ページは、sendMessage() 関数を使用して親ページと通信します。親ページは、子ページから受信したメッセージに対して eval() を実行します。

メッセージを作成するコードは次のとおりです。

 var msg_string = '$("body").append("<?php echo $content; ?>")';
 var send_string = "sendMessage(\'" + msg_string + "\', '<?php echo $receiver_domain; ?>')";
 setTimeout(send_string, <?php echo $delay; ?>);

特に問題は、$content 変数に HTML が含まれており、id="test" などの二重引用符がこの連結のすべてでうまく機能しないことです。私はこれを理解しようとして途方に暮れています。

私はすでに $content の引用符を " に変換してエスケープしようとしましたが、その結果、ブラウザーは div id を二重引用符 (""test"") で囲みました。

** アップデート **

json_encode メソッドを使用すると、データを親ページに取得できます。これは、私がやっていることよりもはるかに簡単な解決策です (私はすでにこれを達成しましたが、何かがおかしいと考えました)。つまり、div id="test" に二重引用符があると、データの評価は失敗します。"test" だけの文字列でも機能しますが、実際には "test" をそのまま入力します。これは、json メソッドを使用した後の html の JavaScript ソースです。

 var msg_string = '$("body").append("<div class=\\\"test\\\">HEY WHATS UP<\/div>");';
 var send_string = "sendMessage(\'" + msg_string + "\', 'http://domain.com')";
 setTimeout(send_string,500);

これは評価で失敗します。eval の代わりにアラートを配置すると、次の結果が得られます。

 $("body").append("<div class="test">HEY WHATS UP</div>");

何か案は?

** アップデート 2 **

だから私は最終的にこれを理解しました。以下の3つの回答の組み合わせでした。json の回答がヒントになりました。基本的に、二重引用符は、評価に行くまでにすべてが適切に読み取られるように、3 つのバックスラッシュを付ける必要がありました。

html の /r/n 文字を含む他のいくつかの問題に遭遇しました... str_replace で削除し、アポストロフィも削除しました...これは内部の html 要素にありました...適切な html エンティティに置き換えましたそしてバム!

コードは次のとおりです。

 function escapeQuotes(string){
   var quotes_regex = new RegExp("\"", "g");
   return string.replace(quotes_regex, "\\\"");
 }

 var msg_string = '$("body").append(<?php echo json_encode( str_replace("\r\n", '', $content) ); ?>);';
 var send_string = "sendMessage(\'" + escapeQuotes(msg_string) + "\', '<?php echo $receiver_domain; ?>')";
 setTimeout(send_string,<?php echo $delay; ?>);

私はすべてのビットを使用したので、みんなの答えに賛成しました。どうもありがとう!

4

3 に答える 3

3

JSON はあなたの友達です。

var msg_string = '$("body").append(<?php echo json_encode($content); ?>)';
于 2012-04-14T02:28:36.590 に答える
3

二重引用符が唯一の懸念事項である場合は、それらをエスケープ文字列に置き換えてみませんか?

var msg_string = '$("body").append("<?php echo str_replace("\"", "\\"", $content); ?>")';

正確にテストすることはできませんが、それは私にはうまくいくようです。

于 2012-04-14T02:36:51.853 に答える
2

str_replaceを使用してエスケープする必要があります

$search  = array("'", '"');
$replace = array("\'", '\"');
var msg_string = '$("body").append("<?php echo str_replace(search, replace, $content; ?>")';
于 2012-04-14T02:40:55.707 に答える