我有一页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”中有双引号,则数据的eval仍然会失败。一串只是“测试”的工作,但它实际上逐字地“测试”。这是使用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实体和BAM!
以下是代码:
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; ?>);
由于我使用了所有东西,所以我赞成了所有人的答案。非常感谢你!
答案 0 :(得分:3)
JSON是你的朋友。
var msg_string = '$("body").append(<?php echo json_encode($content); ?>)';
答案 1 :(得分:3)
如果您唯一关注的是双引号,为什么不用转义字符串替换它们?
var msg_string = '$("body").append("<?php echo str_replace("\"", "\\"", $content); ?>")';
我无法准确测试,但这似乎对我有用。
答案 2 :(得分:2)
您需要使用str_replace
进行转义$search = array("'", '"');
$replace = array("\'", '\"');
var msg_string = '$("body").append("<?php echo str_replace(search, replace, $content; ?>")';