1

我正在尝试将 php 字符串传递给 javascript 函数。php 部分如下所示:

<?php
   foreach ($friends as $key => $friend) {
   // Extract the pieces of info we need from the requests above
   $id = assertNumeric(idx($friend, 'id'));
   $name = idx($friend, 'name');
   // Here we link each friend we display to their profile
   echo('
     <li>
     <a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')">
     <img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . '
    </a>
    <form>
    <input type="button" value="Meet" onclick="postMeet(. $name.)"/>
    </form>
    </li>');
    }
?>

javascript函数看起来像这样。如果我将 $key 或 $id 传递给函数但不传递 $name,它会完美运行。有人有什么想法吗?我对 php 和 javascript 很陌生。

<script type="text/javascript">
function postMeet(key)
{
        var met = 'Met ';
        var body = met + ' '+ key;
        FB.api('/me/feed', 'post', { message: body }, function(response) {
               if (!response || response.error) {
               alert(response[0]);
               alert('Error occured');
               } else {
               alert('Post ID: ' + response.id);
               }
               });           
}
</script>
4

3 回答 3

6

在你的echo陈述中需要考虑三件事:

  1. $name是一个字符串,您将作为字符串文字嵌入到 HTML 属性中的 JavaScript 中onclick,因此在将其传递给postMeet函数的地方,您必须在其周围加上引号。JavaScript 允许使用'or引用字符串文字",只要它们是平衡的。因为我们用(因为 HTML 不允许)引用onclick属性,所以最容易用来分隔 JavaScript 字符串。所以:把它放在一边。"'''

  2. postMeet调用位于 HTML 属性 ( onclick) 中,这意味着在读取标记时,它会被读取为 HTML 文本。因此,您必须确保任何对 HTML 特殊的字符(例如,主要是<&,在这种情况下",因为您已用作属性"的分隔符onclick)被正确编码为&lt;&amp;&quot;。PHP 提供了htmlspecialchars执行此操作的函数。也许你在想“但$name永远不会有<它”。这就是错误出现的方式。养成对这些东西完全编码的习惯,当你输出更有趣的东西时,你就不会忘记。此外,人们为数据库中的“名称”字段填写各种废话。

  3. 在 JavaScript 字符串文字中,反斜杠和用于分隔字符串的任何类型的引号(例如,'")都必须转义(使用反斜杠)。因此,您必须考虑可能存在$name或更好的情况,充分保护自己。字符串文字'T.J. Crowder'是有效的,但字符串文字'Gerard 't Hooft'会导致语法错误,因为'in't Hooft未转义。它必须写成"Gerard 't Hooft"(用双引号分隔)或'Gerard \'t Hooft'(转义单引号)。PHP 提供了一个方便的函数 ,addslashes它将在', ",\和空字节之前插入反斜杠。

因此,将所有这些放在一起,当我们将变量的值输出到 时,我们必须在变量的值周围加上某种引号postMeet,我们必须编码特殊的 HTML 字符,并且我们必须确保引号等用反斜杠转义:

//                +--- start string literal with single quote
//                |
//                vv
onclick="postMeet(\''. addslashes(htmlspecialchars($name)) .'\')"
//                     ^^^^^^^^^^ ^^^^^^^^^^^^^^^            ^^
//                          |            |                   |
//  escape ", ', and \ -----+            |                   |
//           encode special HTML chars --+                   |
//                    end literal with single quote ---------+

例如:

echo('
  <li>
  <a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')">
  <img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . '
 </a>
 <form>
 <input type="button" value="Meet" onclick="postMeet(\''. addslashes(htmlspecialchars($name)) .'\')"/>
 </form>
 </li>');

重要的是要记住正在进行的三层解释: PHP 正在解释您的 PHP 代码并将标记输出到 HTML 页面;浏览器正在解释 HTML 标记,包括onclick属性的内容;JavaScript 解释器解释onclick属性的字符串内容(点击发生时浏览器将其传递),它必须是有效的 JavaScript 代码。

这是一个更孤立的示例,可以轻松复制并粘贴到测试页面中。使用测试页面上的“查看源代码”查看浏览器看到的内容,当然点击div查看一切正常:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Escape Test</title>
</head>
<body>
<?php
    $stuff = "Gerard 't Hooft says <<\"theoretical physics is FUN & a great way to aid humankind!\">>";
    echo('<div onclick="foo(\'' . addslashes(htmlspecialchars($stuff)) . '\')">Click me</div>');
?>
<script>
function foo(stuff) {
    alert(stuff);
} 
</script> 
</body>
</html>
于 2012-01-03T12:01:22.987 回答
0
echo('
 <li>
 <a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')">
 <img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . '
</a>
<form>
<input type="button" value="Meet" onclick="postMeet(. $name.)"/>
</form>
</li>');
}

错误的部分是 . $名称., . $名称。改成 \'' 。$名称。'\' 所以应该是

echo('
 <li>
 <a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')">
 <img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . '
</a>
<form>
<input type="button" value="Meet" onclick="postMeet(\'' . htmlspecialchars($name) . '\')"/>
</form>
</li>');
}

这就是为什么

$name = 'Andrew';
$var = '$name'; // outputs '$name';
$var = "$name"; // outputs 'Andrew';
于 2012-01-03T11:59:21.120 回答
0

提到

onclick="postMeet(.$name.)"/>

如 onclick="postMeet('.$name.')"/>

于 2012-01-03T12:23:47.013 回答