首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在容器元素中获取Id为的所有元素的最快的性能方法

在容器元素中获取Id为的所有元素的最快的性能方法
EN

Stack Overflow用户
提问于 2016-06-05 22:06:38
回答 3查看 54关注 0票数 0

我正在尝试重构,并做出一个性能明智的代码。

代码的思想是用需要更新的idvalue更新所有元素的idvalue,当元素被移除/删除时会发生这种情况

所以我要做的是在一个容器元素中获取所有带有Idvalue的元素(可以嵌套在2到4中)。

目前,我正在使用jQuery来完成这项任务。我在每个具有Id的元素上添加了一个类,并使用jQuery .find()通过分配给它们的类来获取所有这些元素。我真的讨厌我的代码,如果有另一种最好的方法,我也想改变它。

那么,有没有一种既快又有性能的方法来完成这个任务呢?

代码语言:javascript
复制
$("button").on("click", function(){
   $($(this).val()).remove();
   updateParagraph();
});

function updateParagraph() {
   $(".paragraphs").each(function(index, data){
   var dataId = data.id.split("-");
   var idIndex = dataId[dataId.length-1];
   var index = index + 1;
   if (index != idIndex) {
      dataId.splice(-1, 1);
      dataId.push(index);
      dataId = dataId.join("-");
      $(this).attr("id", dataId);
      setChildElementsId($(this), index)
    }
  });
}

function setChildElementsId(parent, inx) {
   $(parent).find(".id-holder").each(function(index, data){
     if (data.id) {
        var dataId = data.id.split("-");
        dataId.splice(-1, 1);
        dataId.push(inx);
        dataId = dataId.join("-");
        $(this).attr("id", dataId);
        if(isParagraph(data.tagName)) {
      	  $(this).text(inx);
        }
    }
    else if (data.value) {
      var dataValue = data.value.split("-");
      dataValue.splice(-1, 1);
      dataValue.push(inx);
      dataValue = dataValue.join("-");
      $(this).val(dataValue);  
    }
  });
}

function isParagraph(tagName){
	return tagName == "P";
};
代码语言:javascript
复制
<div id="container-1" class="paragraphs">
  <div id="header-container-id-1" class="id-holder">
    <h4>Header</h4>
  </div>
  <div id="paragraph-container-id-1" class="id-holder">
    <p id="id-1" class="id-holder">1</p>
  </div>
  <button value="#container-1" class="id-holder">delete</button>
</div>
<div id="container-2" class="paragraphs">
  <div id="header-container-id-2" class="id-holder">
    <h4>Header</h4>
  </div>
  <div id="paragraph-container-id-2" class="id-holder">
    <p id="id-2" class="id-holder">2</p>
  </div>
  <button value="#container-2" class="id-holder">delete</button>
</div>
<div id="container-3" class="paragraphs">
  <div id="header-container-id-3" class="id-holder">
    <h4>Header</h4>
  </div>
  <div id="paragraph-container-id-3" class="id-holder">
    <p id="id-3" class="id-holder">3</p>
  </div>
  <button value="#container-3" class="id-holder">delete</button>
</div>
<div id="container-4" class="paragraphs">
  <div id="header-container-id-4" class="id-holder">
    <h4>Header</h4>
  </div>
  <div id="paragraph-container-id-4" class="id-holder">
    <p id="id-4" class="id-holder">4</p>
  </div>
  <button value="#container-4" class="id-holder">delete</button>
</div>
<div id="container-5" class="paragraphs">
  <div id="header-container-id-5" class="id-holder">
    <h4>Header</h4>
  </div>
  <div id="paragraph-container-id-5" class="id-holder">
    <p id="id-5" class="id-holder">5</p>
  </div>
  <button value="#container-5" class="id-holder">delete</button>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

EN

回答 3

Stack Overflow用户

发布于 2016-06-05 22:26:56

如果我没理解错的话,您希望更优雅地识别哪些元素具有"__-id-#“或简单的"id-#”形式的id

如果是这样的话,看看一些more advanced jQuery selectors。尤其是Attribute Contains Selector,它可能会满足您的需求。

例如,我认为$(parent).find("[id*='id-']")可能会做你想做的事情。

票数 1
EN

Stack Overflow用户

发布于 2016-06-06 01:06:10

虽然我理解你想要做什么,但我不太明白你为什么要这么做。

除非有一些限制迫使你像以前那样组织你的HTML,好吧,不要这样做。

代码语言:javascript
复制
<div id="container-123" class="paragraphs">
  <h4>Header</h4>
  <p>1</p>
  <button type="button">delete</button>
</div>

删除<h4><p>周围的<div>,除非您出于某种样式原因需要它们。<button>不需要知道它ID,因为它是容器的子元素,所以您的删除处理程序可以利用这个事实:

代码语言:javascript
复制
$(document.body).on("click", "button", function() {
  $(this).closest('.paragraphs').remove();
});

如果存在需要特定ID的外力(例如,用于链接到锚点),请将其保留在顶部容器元素上。如果您的CSS以ID为目标元素,则重构CSS。

票数 0
EN

Stack Overflow用户

发布于 2018-12-27 21:14:24

我想用javascript回答你的问题。事实上,您不需要任何id-s

我希望我来得还不算太晚。

代码语言:javascript
复制
let buttons = Array.from(document.querySelectorAll(".id-holder"));

buttons.forEach(b => {
//for each button add an event listener
  b.addEventListener("click", () => {
    b.parentElement.parentElement.removeChild(b.parentElement);
    resetNums();
  });
});


function resetNums(){
// reseting the text inside the p
  let btns = Array.from(document.querySelectorAll(".id-holder"));
  btns.forEach((bt,i)=>{
    let theP = bt.parentElement.querySelector("p");
    theP.innerHTML = i+1;
  })
}
代码语言:javascript
复制
<div>
  <div>
    <h4>Header1</h4>
  </div>
  <div>
    <p>1</p>
  </div>
  <button class="id-holder">delete</button> 
</div>

<div>
  <div>
    <h4>Header2</h4>
  </div>
  <div>
    <p>2</p>
  </div>
  <button class="id-holder">delete</button>
</div>

<div>
  <div>
    <h4>Header3</h4>
  </div>
  <div>
    <p>3</p>
  </div>
  <button class="id-holder">delete</button>
</div>

<div>
  <div>
    <h4>Header4</h4>
  </div>
  <div>
    <p>4</p>
  </div>
  <button class="id-holder">delete</button>
</div>

<div>
  <div>
    <h4>Header5</h4>
  </div>
  <div>
    <p>5</p>
  </div>
  <button class="id-holder">delete</button>
</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37642824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档