【问题标题】:What is best practice when writing code for dom manipulation? [closed]为 dom 操作编写代码时的最佳实践是什么? [关闭]
【发布时间】:2018-07-18 20:32:48
【问题描述】:

因此,我正在创建一个 Web 应用程序,它获取食谱信息并根据食物食谱 API 将其打印到 DOM。我正在获取 JSON 信息并大量操作 dom。我突然意识到这段代码非常难以阅读。这是一个片段:

//create ingredient title

const ingredientTitle = document.createElement("p");

const ingredientTitleTextNode = document.createTextNode("Ingredients");

ingredientTitle.appendChild(ingredientTitleTextNode);

const ingredientTitleParent = document.querySelector(".recipe-ingredients-item");

ingredientTitleParent.appendChild(ingredientTitle);

//create ingredient title end



//create ingredient UL and LIs

const ingredients = selectedItemJson.hits[0].recipe.ingredientLines;


const ingredientUl = document.createElement("ul");

for (let j = 0; j < ingredients.length; j++) {

  const ingredientLi = document.createElement("li");

  const ingredientTextNode = document.createTextNode(ingredients[j]);

  ingredientLi.appendChild(ingredientTextNode);

  ingredientUl.appendChild(ingredientLi);

}

const ingredientParent = document.querySelector(".recipe-ingredients-item");

ingredientParent.appendChild(ingredientUl);

//create ingredient UL and LIs end

还会有更多这样的内容。那么这是不好的做法吗?如果是这样,我该怎么办。提前致谢。

【问题讨论】:

  • 也许考虑使用 Angular JS 或 jQuery
  • 显而易见的答案是使用像jQuery这样设计良好的库的API
  • 我需要学习 jQuery,但出于某种原因我真的不喜欢它的语法 :( 为什么 jQuery 会帮我做这件事?
  • 我现在看看 angular nick
  • 这不是一个适合堆栈溢出的问题。对此没有明确的答案。

标签: javascript html dom-manipulation


【解决方案1】:

1) 使用 innerHTML 的快速简单示例:

var html = "";
var list = [
    {
        name: "name",
        components: [
            {name: "ingredient1", quantity: "q1"},
            {name: "ingredient2", quantity: "q2"}
        ]
    },
    {
        name: "name2",
        components: [
            {name: "ingredient3", quantity: "q1"},
            {name: "ingredient4", quantity: "q2"}
        ]
    },

]

for (var x = 0; x < list.length; x++){
    var item = list[x];
    html += "<h1>" + item.name + "</h1>";
    html +="<ul>";
    for (var y = 0; y < item.components.length; y++){
        var component = item.components[y];
        html += "<li>" + component.name + ", quantity: " + component.quantity + "</li>";
    }
    html += "</ul>";
}
var dom = document.createElement("p");
dom.innerHTML = html;
document.getElementsByTagName("body")[0].appendChild(dom);

2) 使用直接 dom

var body = document.getElementsByTagName("body")[0];
var p = document.createElement("p");
body.appendChild(p);

for (var x = 0; x < list.length; x++){
    var item = list[x];
    var h1 = document.createElement("h1");
    h1.innerText = item.name;
    p.appendChild(h1);
    var ul = document.createElement("ul");
    for (var y = 0; y < item.components.length; y++){
        var li = document.createElement("li");
        var component = item.components[y];
        li.innerText = component.name + ", quantity: " + component.quantity;
        ul.appendChild(li);
    }
    p.appendChild(ul);
}

JSPerf 测试 InnerHTML 与直接 dom

https://jsperf.com/innerhtml-vs-dom-append/1

【讨论】:

  • 在连接字符串时使用 innerHTML 非常慢。不要使用这个。
  • 好吧,你说的慢得可怕是什么意思 - 对于快速解决方案,它不会比手动创建 dom 元素慢多少。如果用户没有高级模板的经验,这将有助于快速解决他的问题。
  • 我的意思是可怕慢。我说它是出于使用简单 TODO 列表应用程序的经验。真的很慢。严重地。一旦我将其更改为使用 DOM,改进是巨大的。
  • 谢谢,为了可读性,我可能只需要这样做。虽然,我最初选择不走那条路,因为它显然被认为是不好的做法,而 appendChild() 意味着更好?
  • 这是一个完全可以接受的方法。重复的小 DOM 插入可能会很慢,因为每次插入新的 DOM 节点时浏览器都必须重排文档——不要在循环中单独使用 innerHTML 每个成分——但是单次插入一大块 html 就可以了.
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多