我有一页 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; ?>);
我赞成每个人的回答,因为我使用了所有东西。太感谢了!