3

我有一页 iframed 在另一页内。子页面使用 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" 中有双引号,则数据的评估仍然失败。一串“测试”有效,但它实际上逐字放置“测试”。这是使用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 **

所以我终于想通了。这是以下三个答案的组合。json 的回答给了我提示。基本上双引号需要加三倍反斜杠,这样当它进入 eval 时,所有内容都可以正确读取。

我遇到了其他一些障碍,包括 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 回答