jjzjj

php - 针对我的特定情况将数据从 PHP 传递到 JavaScript 的最佳方式

coder 2024-04-11 原文

我在 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 数组,因为在数据属性中存储大量数据(并转义它们!)可能会出现问题。 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/

有关php - 针对我的特定情况将数据从 PHP 传递到 JavaScript 的最佳方式的更多相关文章

  1. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  2. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  5. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  6. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  7. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  8. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

随机推荐