使用 $.html() 时如何提高渲染性能

2024-04-15

我正在研究骨干demo app https://jsfiddle.net/o75r7fu9/8/显示推文列表。当我用不同的数据替换所有“推文”时,我使用以下命令清除列表$.html()

render: function() {
    $("#item-table").html('');
    this.collection.each(this.addItem);
}

我想知道是否有人可以给我一个提示,我可以用什么来代替这个$.html()为了更好的性能,因为通过使用$.html()我导致回流,这导致布局处理时间很差。

代码中还有另外两个地方我使用了$.html()如果有人能给我关于如何改变这些的建议,如果其他地方也可能的话,那就太好了。


Create https://developer.mozilla.org/en-US/docs/Web/API/Document/createDocumentFragment a new 文档片段 https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment预渲染所有项目,然后更新 DOM 一次。

还有,赞成this.$(...) http://backbonejs.org/#View-dollar全局 jQuery 选择器$(...).

this.$是一个代理this.$el.find(...)这样效率更高,并且不太容易选择视图之外的内容。

使用 jQuery 的核心功能($()如果视图尚未呈现,则视图内的 ) 可能会失败。所以最好总是通过this.$el因此您甚至可以在视图实际放入 DOM 之前进行更改。

将创建的所有子视图保留在一个数组中,以便稍后干净地删除它们。

initialize: function() {
    this.childViews = [];
},
render: function() {
    // cache the list jQuery object
    this.$list = this.$("#item-table");

    // Make sure to destroy every child view explicitely 
    // to avoid memory leaks
    this.cleanup();

    this.renderCollection();
    return this;
},

真正的优化从这里开始,使用临时容器。

renderCollection: function() {
    var container = document.createDocumentFragment();

    this.collection.each(function(model) {
        // this appends to a in memory document
        container.appendChild(this.renderItem(model, false).el);
    }, this);

    // Update the DOM only once every child view was rendered.
    this.$list.html(container);
    return this;
},

Our renderItem函数仍然可以用于渲染单个项目视图并立即将其放入 DOM 中。但它还提供了推迟 DOM 操作的选项,并且只返回视图。

renderItem: function(model, render) {
    var view = new Item({ model: model });

    this.childViews.push(view);
    view.render();
    if (render !== false) this.$list.append(view.el);
    return view;
},

为了避免悬空侦听器造成内存泄漏,请务必调用remove在忘记每个视图之前。

我通过推迟实际调用来使用额外的优化remove所以我们现在不会在用户等待时浪费时间。

cleanup: function() {
    var _childViewsDump = [].concat(this.childViews);
    this.childViews = [];

    while (_childViewsDump.length > 0) {
        var currentView = _childViewsDump.shift();
        // defer the removal as it's less important for now than rendering.
        _.defer(currentView.remove.bind(currentView), options);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 $.html() 时如何提高渲染性能 的相关文章

  • 粉碎一个元素,向随机方向发送碎片

    我试图 粉碎 一个元素 例如 一个图像 并将其碎片朝随机方向飞行 当碎片到达目的地时 即x距离 以像素为单位 它们变成原始图像的较小版本 jQuery UI 的explode http api jqueryui com explode ef
  • 如何使用 console.log 省略文件/行号

    如今 您可以在 Chrome 的控制台中编写非常好的东西 查看this https developer chrome com devtools docs tips and tricks关联 我也做了一个截图 正如您在屏幕截图中看到的那样 文
  • Jeditable 错误时异步恢复

    我一直在使用 JQuery 的 JEditable 插件 我想向插件返回错误以指示它恢复到以前的值并向用户显示错误 我使用同步 ajax 调用来完成此工作 但我更喜欢使用异步回调 我必须到目前为止的代码如下 editbox editable
  • Chart.js - 如何将数组集合推入数据集

    我一直在尝试多种方法将数组集合推送到数据集中 任何人都可以帮助我根据下面的代码将数组推入堆积图表中 这是例子 Codepen 堆叠栏 https codepen io narendrajadhav pen abzpWam JavaScrip
  • 获取 pdf 第 1 页(共 2 页)的图像

    我正在使用 html2canvas 和 jsPDF 以及 Angular4 创建图像 我想将此图像放置在 2 页生成的 pdf 的第 1 页上 但似乎这条线 doc save test pdf 需要在函数内部htm2canvas 因为如果我
  • 将 javascript 放在 header 之外有多糟糕?

    这个问题几乎已经说明了一切 我开始添加一些功能到我的周末项目 http www my clock net 对于我和几个朋友来说 这是一个小应用程序 因为我们是交换生 所以它对我们来说有点有用 但事情是这样的 我在 php 中执行此操作并使用
  • 内联执行生成的汇编程序

    我正在阅读以下演示文稿 http wingolog org pub qc 2012 js slides pdf http wingolog org pub qc 2012 js slides pdf其中讨论了 4 10 19 内联 ASM
  • 如何垂直打印数组中的字符串元素? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个数组 我想垂直打印每个元素 例如 myArr abc def ghi 输出应该是 a d g b e h c f
  • toJSON() 和 JSON.Stringify() 之间的区别

    如果您需要读取或克隆模型的所有数据属性 请使用其 toJSON 方法 此方法返回属性的副本作为 对象 尽管有其名称 但不是 JSON 字符串 当 JSON stringify 为 使用 toJSON 方法传递一个对象 它将返回的字符串化 t
  • jQuery 字符和字数统计

    这是一个非常简单的问题 jQuery 是否可以获取一个元素 计算该元素 不是文本区域或输入 中的单词数和字符数 并将其显示在 HTML 文档上 我能想到的唯一可行的代码是 document write content text length
  • 它们是“相同的”吗?代码大战

    这是完整的问题描述 给定两个数组 a 和 b 编写一个函数 comp a b Clojure 中的 compSame a b 来检查这两个数组是否具有 相同 元素以及相同的重数 这里 相同 意味着 b 中的元素是 a 平方中的元素 无论顺序
  • 如何更改 Vuetify 日历日期格式

    我正在尝试在以下 Vuetify 日历上启用输入事件 https github com vuetifyjs vuetify blob master packages docs src examples calendars complex e
  • 如何在 Next.js 中正确使用 Mongoose 模型?

    我正在使用 TypeScript 和 MongoDB Mongoose 构建 Next js 应用程序 我在使用 Mongoose 模型时开始遇到错误 这导致它们在每次使用模型时都尝试覆盖模型 导致模型覆盖错误的代码 import mong
  • 调用不带括号的 javascript 函数

    以下 renderChat 函数用于将消息和图像渲染到聊天板上 该函数内部还有另一个函数 var onComplete function 它完成创建列表元素并将其附加到聊天列表的所有工作 onComplete函数之后就只有这三行代码 img
  • 加载 angularjs 路由后运行 javascript 代码

    我需要在 angularjs 加载路线后显示警报 显示警报的代码位于 angularjs 异步加载的视图中 视图加载后 我希望它能够运行 但它没有 我知道我可以广播并告诉它稍后运行等 但我需要一个更通用的解决方案 假设您正在谈论基于以下内容
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • Firefox 和 Chrome 为 offsetTop 提供了不同的值

    我试图相对于输入字段定位一个跨度元素 让我们称之为 工具提示跨度 为此 我将工具提示跨度和输入字段包装在另一个跨度元素中 我们称之为 包装器跨度 该元素具有position relative 然后我设置position absolute在工
  • 在 Sublime Text 下获取完整的 JS 自动补全

    我刚刚在 Windows Vista 下安装了 Sublime Text 甚至遵循了中给出的建议这个帖子 https stackoverflow com questions 10636410 modifying sublime text 2
  • 处理延迟对象数组

    自从使用 Deferred我已经遇到过这种情况几次 我有一个值列表 每个值都以某种方式生成一个延迟对象 并且我想在所有延迟对象都解析后执行回调 一个更具体的例子是这样的 var urls foo com bar com baz com qu
  • 调试客户端时使用 Chrome/Firefox

    我正在使用带有 getUserMedia 的相机 但出现了一些需要修复的错误 问题是 Visual Studio 只允许我使用 IE 调试 JavaScript 我的意思是命中断点 而 IE 不支持 getUserMedia 如果您想在 I

随机推荐

  • 这个符号在 php 中的对象或空值中意味着什么[重复]

    这个问题在这里已经有答案了 您能解释一下运营商做什么吗 gt 在 PHP 中做 因为我有这段代码 drive objDrive gt func gt getDriver gt value 目前只是一个提案 你可以去找找在此输入链接描述 ht
  • 在 Docker 容器中运行数据库的性能问题

    有没有人注意到在 docker 容器中运行数据库 MySQL 或 Postgres 有任何性能问题 我被告知会发生严重的性能下降 请指教 Docker 本身带来的开销非常小 它只是将进程与主机上的其他进程隔离 但是 您可以采取多种措施来降低
  • Dask“没有名为 xxxx 的模块”错误

    使用dask分布式我尝试提交一个位于另一个名为worker py的文件中的函数 在工人中我有以下错误 没有名为 worker 的模块 但是我无法弄清楚我在这里做错了什么 这是我的代码示例 import worker def run self
  • StaleDataException:尝试在关闭游标后访问它

    FATAL EXCEPTION main Process com example lenovo phone PID 4885 android database StaleDataException Attempted to access a
  • 如何访问具有相同名称的不同表的多个mysql行

    我认为我已经接近解决方案 但还没有完全明白 我想做的是从两个不同的表中获取product naam和categorie naam 下面的代码为我提供了两者的 naam 我可以访问它们 但现在我想要产品中的所有内容 而不仅仅是名称 然后我不知
  • 使用 sinon 断言使用所需参数进行了特定的存根调用

    假设您正在测试一个函数 该函数将使用不同的参数多次调用依赖项 var sut ImportantFunction function dependency dependency a 1 dependency b 2 使用QUnit Sinon
  • 如何在MAC上用python打开Excel实例?

    我认为这个问题之前已经被问过 但还不清楚 在最初的问题中 用户提供了 excel exe 它是 Windows 可执行扩展 不适用于 mac 我需要在 MAC 上用 Python 打开新的 Excel 实例 我应该导入哪个模块 我是一个新手
  • 如何将 perforce 用户更改为超级用户

    如何将标准 perforce 用户更改为超级用户 看到很多关于如果超级用户密码丢失该怎么办的问题 但没有看到关于如何创建另一个超级用户或授予当前用户超级用户权限的问题 您将需要更新该用户的 Perforce Protections 表 例如
  • 从 React Native 应用程序中删除 console.log

    如果您删除console log 在将 React Native 应用程序部署到商店之前调用 是否存在一些性能或其他问题 如果console log 调用保留在代码中 有没有办法使用某些任务运行程序删除日志 类似于 Grunt 或 Gulp
  • 将数据从两个 UItextfield 传递到新的视图控制器

    我有点坚持尝试将数据从一个视图控制器上的两个 UITextfield 传递到另一个视图控制器 基本上我得到了以下物品 视图控制器 h import
  • TDD 在机器学习中的好处

    据我所知 TDD 的典型工作流程是基于黑盒测试的 首先我们定义接口 然后编写一个或一组测试 然后我们实现通过所有测试的代码 那么请看下面的例子 from abc import ABCMeta class InterfaceCalculato
  • 如何使用 Volley 获取并解析 JSON 对象

    我一直无法找到这个问题的详细答案 或者至少没有一个我能理解的答案 我正在尝试设置 Volley 以从 iTunes 中提取 JSON 对象 然后我想解析这些对象 获取它们的图像 URL 例如 这里是 iTunes JSON 对象 URL S
  • python使用ssh时找不到模块

    我在服务器上使用 python 当我运行需要 numpy 模块的 python 命令时 如果我这样做 ssh
  • 连接 Hibernate 的查询生成

    我想实施虚拟视图与预处理器 一个简单的例子 之前的HQL FROM PublishedArticle a 生效后的 HQL FROM Article a WHERE a published true 本质上 我需要一种在执行查询之前处理查询
  • Angular 4 和 ng-template

    我收到此警告 The
  • 使用python(谷歌应用程序引擎)获取上传文件的名称和扩展名

    我正在使用表单将文件上传到谷歌应用程序引擎并将它们存储在数据存储中 我还想存储原始文件名和扩展名以供演示之用 有没有办法从发布服务器端检索此数据 或者只能在客户端收集并作为单独的字段发送 例如http www tinyurl com 5jy
  • 使用已填充的模型添加非空且唯一的字段

    我的应用程序中有一个模型在带有一些条目的服务器中运行 我需要添加一个SlugField 对于该模型来说是唯一且非空的 这SlugField将根据trading name 我更改了模型以添加这个新字段并修改了保存方法 class Suppli
  • jqGrid treeGrid 捕获展开折叠事件

    我使用 jqGrid 来构建一些大树 现在我想记住cookie中展开和折叠的节点 所以我想捕捉展开和折叠事件 我在手册中找不到它 所以我用这种方式解决了 grid find div treeclick bind click function
  • PRY 或 IRB - 重新加载类并忘记已删除的功能

    如果您更改文件然后在 pry 或 irb 中重新加载它 它似乎会拾取您添加到该类中的任何新功能 但不会忘记您从该类中删除的旧功能 重现步骤 使用单一方法创建一个类 例如 say hello 打开 PRY 或 IRB 并且load my cl
  • 使用 $.html() 时如何提高渲染性能

    我正在研究骨干demo app https jsfiddle net o75r7fu9 8 显示推文列表 当我用不同的数据替换所有 推文 时 我使用以下命令清除列表 html render function item table html