我在 Drupal 中建立了一个在线社区,其主页有点像 Facebook 墙。您会看到 25 个最新帖子,以及这些帖子下方的两个最新评论。这些评论下方还有一个文本区域,以便您可以快速在特定帖子上发布新评论。
这些 Facebook 风格的帖子通过 JavaScript 内置了许多功能。单击帖子正下方的“查看所有评论”链接会进行 AJAX 调用,该调用会获取该帖子的所有评论并将其显示在其正下方。您还可以将帖子标记为有帮助,作为您问题的解决方案,编辑内联评论等。所有这些操作都需要 AJAX 请求,这意味着发出请求的 JavaScript 需要知道基本信息,例如节点 ID(唯一的帖子的标识符)、评论 ID(评论的唯一标识符)等。
我最初的实现将这些基本数据散布在所有帖子中,这使得编写需要找到它的 JS 变得更加复杂。所以我的第二个实现只是将所有这些数据输出到每个帖子的主要包装元素中的 JSON 兼容字符串中。虽然这让 JS 更容易找到它需要的数据,但将 JSON 编写为字符串是一种痛苦(转义引号,没有换行符)。
所以现在我有了第三个想法,我正在寻找实现前的反馈。这个想法是为所有这些帖子创建一个全局 JS 数组,其中包含保存每个帖子数据的对象。该数组中的每个元素都将保存 AJAX 调用所需的必要数据。所以它看起来像这样:
Facebook 风格的帖子模板
<div class="post" data-postindex="<?php echo $post->index; ?>">
<!-- lots of other HTML for the post -->
</div>
<script type="text/javascript">
globalPostArray.push({
nid: <?php echo $post->nid; ?>,
authorID: <?php $post->authorID; ?>,
//etc. etc. etc.
});
</script>
上面代码的结果是,当需要 AJAX 请求的链接被点击时,JS 将简单地从该链接向上遍历 DOM,直到找到主要的
.post
元素。然后它会获取 data-postindex
的值,以便知道 globalPostArray
中的哪个元素保存它需要的数据。想法?我觉得必须有一些标准的、公认的方式来完成这样的事情。
最佳答案
我从未听说过在 PHP 和 Javascript 之间“传递”信息的标准方法,因为它们分别是服务器端语言和客户端语言。我个人会使用您的第二个和第三个解决方案的混合体。
将帖子 ID 存储在 data-postindex 属性中(数据属性是新的,并且是存储少量数据的“正确”方式)。但我仍然只使用 JSON 数组作为其余部分,因为在 data-attributes 中存储大量数据(并转义它们!)可能会出现问题。 PHP 有一个 json_encode
函数,可以为您处理所有转义等操作 - 只需像往常一样构建一个 PHP 数组(例如 $postdata
),然后将其扔到您的帖子模板中:
<script type="text/javascript">
globalPostArray.push(<?php echo json_encode($postdata) ?>);
</script>
其中
$postdata
类似于以下内容:$postdata = array(
'nid' => 5,
'authorId' => 45
...etc...
);
从现有代码生成这样的数组应该很容易。
不久前我写了一个 blog post 关于我对这种事情的实现,但听起来你只需要一个指向 json_encode 的指针。
关于php - 对于我的特殊情况,将数据从 PHP 传递到 JavaScript 的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9136997/