【问题标题】:Return HTML or build HTML using javascript?返回 HTML 或使用 javascript 构建 HTML?
【发布时间】:2011-06-23 01:33:42
【问题描述】:

我正在返回有关联系人的数据以构建列表

基本的html看起来像

{repeat:20}
<div class="contact">
  <a rel="123">FirstName LastName</a>
  <div class="info">
    {repeat:5}
    <div>
      <div class="infoLabel">Age:</div>
      <div class="infoPiece">56</div>
    </div>
    {endrepeat}
  </div>
</div>
{endrepeat}

{repeat:20} 不是实际代码
该代码块重复了 20 次

我的问题是。

还有什么好处:

  1. 创建标记服务器端,返回实际的html。
  2. 返回 Json 数据和信息并构建列表客户端。


为了讨论的目的,让我们假设一些常数
  • 服务器负载不是问题(我们使用的是高性能服务器)
  • 返回的数据仅供展示(不可篡改)
  • 我们不会考虑未启用 javascript 的用户。
  • 我们不考虑任何浏览器

【问题讨论】:

    标签: php jquery html ajax json


    【解决方案1】:

    如果您打算执行密集的 AJAX 任务,例如添加新记录、即时编辑它们等,那么我建议您加载一个空页面,该页面调用一个脚本,该脚本返回一个 JSON 字典数组, 然后使用最近在 jQuery 中实现的Template (beta) 系统,或者自己实现一个,有一个隐藏元素,带有带有类的 spans/divs/tds 标记,并在每次新记录到达时克隆和填充它。

    另一方面,如果您要保持此静态,只需使用 HTML。

    这就是我管理模板的方式。这是一种有效的方法,因为 DOM 元素确实存在于 DOM 树中,而且克隆比解析包含元素的字符串更便宜。

    <html>
        <head>
            <script type="text/javascript">
                $(function() {
    
                    $contactTemplate = $("#contact_template")
                    function makeContactElement(data) {
                        var $newElem = $contactTemplate.clone(true)
    
                        $newElem.attr("data-id", data.id)
                        $newElem.find(".name").text( data.firstName + " " + data.lastName )
    
                        for(var i in data.info) {
                            $newElem.find(".info").append( makeInfoElement(data.info[i]) )
                        }
    
                        return $newElem
                    }
    
                    $infoTemplate = $("#info_template")
                    function makeInfoElement(data) {
                        var $newElem = $infoTemplate.clone(true)
    
                        $newElem.find("infoLabel").text(info.label)
                        $newElem.find("infoPiece").text(info.piece)
    
                        return $newElem
                    }
    
                    $.getJSON('/foo.bar', null, function(data) {
                        for(var i in data) {
                            $("#container").append( makeInfoElement(data[i]) )
                        }
                    })
                })
            </script>
            <style type="text/css">
                .template { display: none; }
            </style>
        </head>
        <body>
    
            <div id="container">
            </div>
    
            <!-- Hidden elements -->
    
            <div id="contact_template" class="contact template">
              <a rel="123" class="name"></a>
              <div class="info"></div>
            </div>
    
            <div id="info_template" class="template">
              <div class="infoLabel"></div>
              <div class="infoPiece"></div>
            </div>
        </body>
    </html>
    

    然后,当您创建一条新记录时,只需用信息填充一个数据对象,您就可以确定所有元素流都是通用的。

    使用.clone(true) 打开了制作通用事件的大门,而不是绑定一个更昂贵的实时事件。

    例如,如果你想制作一个删除记录的按钮:

    <script ...>
    ...
    $("#contact_template .delete").click(function() {
        var id = $(this).parents("contact").attr("data-id")
        $.post('/foo.bar', { action: delete, id: id }, function() { ... })
        return false
    })
    </script>
    ...
    <div id="contact_template" class="contact template">
        <a href="#" class="delete">Delete</a>
    </div>
    

    祝你好运!

    【讨论】:

    【解决方案2】:

    由于您不担心服务器端负载并且有空闲的 CPU 周期,请继续让您的后端完成大部分工作。该应用程序将更敏捷,响应更快。但是,您必须牢记网络利用率。来回抛出 JSON 字符串非常有效并且减少了网络负载,但需要客户端做更多的工作。如本讨论所述,如今的浏览器速度非常快。 Chrome、FF4 和 IE9 中的 JavaScript 实现是我们见过的最快的。

    我的建议是按原样对您的应用程序做一个小型基准测试,看看它的性能如何。尝试通过许多请求来访问这两个变体,以查看负载情况。这实际上取决于您的特定应用程序。

    【讨论】:

    • 一个小基准,例如创建两个脚本,一个将使用 javascript 构建列表,另一个将简单地附加所需的联系方式。可以吗,你会说多少个周期作为安全基准?
    【解决方案3】:

    您似乎是在征求意见,而不是对技术问题的具体答案。所以这是我的看法。

    如今的趋势是面向 Web 应用程序,具有更多的客户端功能和离线功能。因此,我会在客户端做它并发送 JSON。这也更具可扩展性,因为服务器端的工作更少。

    【讨论】:

      【解决方案4】:

      在大多数情况下,在 Web 开发过程中,您需要决定什么对您来说更重要。

      如果您只是追求性能,那么在您的服务器上执行所有渲染操作并只提供 HTML 代码当然会更快。但这反过来又会在大多数情况下以灵活性为代价,而且您会通过网络获得更多流量。

      另一方面,例如,仅发送 JSON 数据并在客户端进行渲染,通过网络传输的流量要少得多,但客户端的 CPU 负载却更多。浏览器(DOM + ECMAscript)在过去的几年和一个月里已经提高了很多性能,所以很多应用程序都是这样做的。

      但这并不是故事的结局。 JSON 已优化,但未高度优化。同样,如果您真的追求性能,则需要创建自己的数据传输。比如

      |box1|item1|item2
      

      比 JSON 表示法更少代码

      '{"box1": ["item1", "item2"]}'
      

      这当然是非常具体的,但如果我们真的做大的话,它会节省大量流量。我推荐 Nicholas C. Zakas 的书High performance Javascript。关于这个主题的优秀书籍。

      【讨论】:

      • +1 从性能的角度来看,答案很好。我还想补充一点,HTML 和 JSON 之间的决定还取决于数据是静态的并且纯粹用于显示目的,还是您想稍后对其进行操作。
      【解决方案5】:

      如果我是你,页面加载时间不会影响我的决定。我会考虑维护起来有多容易。我认为在服务器端做这件事会让事情变得容易得多。无需为您的 javascript 解析模板。

      【讨论】:

        【解决方案6】:

        就个人而言,我会在服务器端创建它并返回 html。最大的原因是,否则您的网站对禁用 javascript 的任何人都毫无用处。搜索引擎也基本上看不到它。

        【讨论】:

        • 我感觉这一切都是动态加载的。
        • @Box9 你是对的。此外,如果搜索引擎首先找到了访问此页面的方法,我会很担心!
        • @Box9 和 @Hailwood - 两者都很好,所以我的理由可能不适用,但无论如何我都会在这里留下答案,因为它可能适用于更一般的情况(即使不是你的具体情况)
        • 我不认为我们生活在一个仍然值得考虑“转向 Javascript”的时代。
        【解决方案7】:

        我会说在服务器端做......因为 JS 可能会增加你的页面加载时间......

        【讨论】:

        • 您指的是初始页面加载时间吗?关于下载 Javascript。大多数高性能 Web 应用程序都使用压缩器,这一点,再加上缓存和高速互联网,这些天几乎完全否定了这一点。
        • 嗯。是啊,你说得对。当我重新考虑我的答案时,我应该闭嘴^^
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 2021-06-02
        • 2012-08-24
        相关资源
        最近更新 更多