当前位置: 首页 > 面试题库 >

createElement优于innerHTML的优势?

陆绪
2023-03-14
问题内容

在实践中,相比于innerHTML,使用createElement有什么优势?我之所以问是因为,我坚信使用innerHTML在性能和代码可读性/可维护性方面会更加有效,但是我的团队成员已经决定使用createElement作为编码方法。我只是想了解createElement如何更有效。


问题答案:

除了安全之外,使用其他方法还具有一些优点,createElement而不是修改innerHTML(而不是仅仅丢弃已有的内容并替换它),例如Pekka已经提到的:

追加元素时保留对DOM元素的现有引用

当您追加(或以其他方式修改)时innerHTML,必须重新解析和重新创建该元素内的所有DOM节点。如果保存了对节点的任何引用,则它们实际上将是无用的,因为它们不再显示出来了。

保留附加到任何DOM元素的事件处理程序

这实际上只是最后一个的特例(尽管很常见)。设置innerHTML不会自动将事件处理程序重新附加到它创建的新元素上,因此您必须自己跟踪它们并手动添加它们。在某些情况下,事件委托可以消除此问题。

在某些情况下可能更简单/更快

如果您要进行大量添加操作,则绝对不希望继续进行重置,innerHTML因为尽管对于简单的更改来说速度更快,但是反复重新解析和创建元素会更慢。解决该问题的方法是在字符串中构建HTML,并innerHTML在完成后设置一次。根据情况的不同,字符串操作可能比仅创建元素和附加元素要慢。

此外,字符串操作代码可能更复杂(特别是如果您希望它是安全的)。

这是我有时使用的功能,它使使用起来更加方便createElement

function isArray(a) {
    return Object.prototype.toString.call(a) === "[object Array]";
}

function make(desc) {
    if (!isArray(desc)) {
        return make.call(this, Array.prototype.slice.call(arguments));
    }

    var name = desc[0];
    var attributes = desc[1];

    var el = document.createElement(name);

    var start = 1;
    if (typeof attributes === "object" && attributes !== null && !isArray(attributes)) {
        for (var attr in attributes) {
            el[attr] = attributes[attr];
        }
        start = 2;
    }

    for (var i = start; i < desc.length; i++) {
        if (isArray(desc[i])) {
            el.appendChild(make(desc[i]));
        }
        else {
            el.appendChild(document.createTextNode(desc[i]));
        }
    }

    return el;
}

如果您这样称呼它:

make(["p", "Here is a ", ["a", { href:"http://www.google.com/" }, "link"], "."]);

您将获得与此HTML等效的代码:

<p>Here is a <a href="http://www.google.com/">link</a>.</p>


 类似资料:
  • 问题内容: 使用内容类型application / json通过文本/纯文本发送序列化为json的对象有什么性能优势?我知道许多框架(例如Spring)都可以根据内容类型映射和序列化数据,但是总的来说,我发现此过程非常简单,因此对于在JSON对象上使用application / json而不是text / plain的应用,这并不是一个令人信服的理由。 。 问题答案: 假设您正在谈论使用JSON与

  • 处理高性能和高效率的并发一直是部署nginx的主要优势。现在我们来了解有关Nginx更多的优点。 在过去几年中,Web架构师已经接受了将应用程序基础架构与Web服务器分离和分离的想法。 然而,以前以LAMP(Linux,Apache,MySQL,PHP,Python或Perl)为基础的网站的形式可能不仅仅是一个基于LEMP的(“E”代表“Engine x”)) ,但是越来越多地将网络服务器推送到基

  • 我在PHP中使用了一些AJAX来处理提交表单之类的事情,最近我开始研究WebSockets。我跟随本教程来了解基础知识。据我所知,websockets保持连接打开,而AJAX打开和关闭请求。 我的问题是,如果您只是提交表单或auto_complete之类的简单任务(这里有一个jQuery插件),websockets是否比AJAX有优势?也许教程不是最棒的,但似乎要让websockets工作(至少在

  • 我在模拟中使用下面的代码。因为我一遍又一遍地调用dijkstra方法,性能对我来说非常关键。,我使用PriorityQueue将图的节点保持相对于它们到源的距离的升序。PriorityQueue为我提供了以O(log n)复杂度访问距离最小的节点。但是,要在重新计算节点距离后保持节点有序,我需要首先删除节点,而不是再次添加它。我想可能有更好的方法。我感谢任何反馈。提前感谢所有社区。

  • 问题内容: 在我的慢速查询日志中,此查询(使用不同的名称而不是“ jack”)发生了很多次。为什么? Users表具有许多字段(超过我选择的这三个字段)和大约40.000行。 是主要的,并且是自动递增的。 有一个索引。 具有唯一索引。 有时需要3秒钟!如果我在MySQL上解释选择,我会得到: 这是我能做的最好的吗?我该如何解决? 问题答案: 如果必须使用regexp-style 子句,则肯定会遇到

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 与MySQL相比,使用MySQLi有什么优势? 问题答案: 见文档: PHP的mysqli扩展是什么? mysqli扩展或MySQL改进的扩展是为了利用MySQ