2010-02-10 44 views
0

我正在为客户建立一个CMS(建立在WordPress之上)。我从我的数据库返回的一些数据有问题。JavaScript对象不挖掘我的PHP Var的价值(其中有HTML)

基本上,我从PHP数据构建Javascript对象,以便在鼠标单击时更新我网站的某些区域。

例子(这将正常工作):

<script language = "Javascript> 
    var myObject = new Object(); 

     function updateDiv(id) 
     { 
      myObject.name = '<?php echo $valueName ?>'; // $varHeadline = "Bob" 
      myObject.headline = '<?php echo $value_headline ?>'; // $varHeadline = "My Story" 

      var div = document.getElementById(id).innerHTML = myObject.name + 
      '<br>' + myObject.headline'; 
     } 
</script> 

的问题出现了,当我的数据带回从我的数据库已经有一些HTML,或在其换行。

例子:

echo $varHeadline; 
    // returns <h1>This is my headline</h1> 
    //   This is part of the value too. 

所以,如果我创建了一个JavaScript对象与数据:

function updateDiv(id) 
{ 
    myObject.headline = '<?php echo $varHeadline; ?>'; 
    var div = document.getElementById(id).innerHTML = myObject.headline; 
} 

我得到了我的Javascript错误。 我喜欢继续使用Javascript对象数据填充我的div,但无法考虑一些包含HTML(或甚至单一或双引号)的数据。

我想保留我的HTML格式(<h1>标签等等),所以使用htmlspecialchars或strip_tags是不可能的。有没有死硬的方式来存储返回的HTML而不杀死Javascript? 在此先感谢。 -J

回答

4

json_encode()的字符串,并带走报价:

myObject.headline = <?php echo json_encode($varHeadline;) ?>; 

当然,你可以为改写这个:

<script language = "Javascript> 
    var myObject = <?php echo json_encode(array('name'=>$valueName,'headline'=>$value_headline)); ?>; 

     function updateDiv(id) 
     { 
      var div = document.getElementById(id).innerHTML = myObject.name + 
      '<br>' + myObject.headline'; 
     } 
</script> 

编辑:在下面的评论中指出,始终确保您可以信任您在页面上放置的HTML。如果$ valueName或$ value_headline来自用户输入,如果您不以其他方式验证HTML,那么这是一个糟糕的主意:http://en.wikipedia.org/wiki/Cross-site_scripting

+0

不要忘记清理$ varHeadline - 但它是网站上XSS安全漏洞的快捷方式。 – StasM 2010-02-10 00:55:00

+0

@StasM,好点。虽然,他的具体目标是允许在页面上放置任意的HTML,所以我假定他只是引用他自己的HTML。我会补充一点。 – 2010-02-10 00:57:52

+0

事实上,这个html来自我自己的来源。非常感谢你的回应。 – 2010-02-10 01:51:36

0

当您“引用“服务器端值被放入一个页面,当上下文是Javascript代码而不是HTML时,引用必须不同。对于HTML,当然,您可以将“&”符号转换为“&”,将小于符号转换为“<”,等等。在Javascript字符串中,小于号和和号不是问题 - 如果您要将字符串填充到HTML中,它们可能会晚一些,但在JavaScript解析器正在读取字符串的时候,可能会出现问题。什么一个问题是引用和字符超出良好的7位ASCII范围。 (这是一个泛化,但你明白我的意思。)

我不知道PHP,但它似乎必须有某种方式告诉它不要执行适合于HTML/XML的引用,而是做一些事情来保护Javascript字符串常量内特殊的字符。