Как добавить идентификатор, используя имя класса в нескольких тегах?

Например, у нас есть HTML-тег:

<div class = "box">This is a box</div>

Мы используем имя класса тега div box и добавляем id = "box" в тот же тег div. Результат:

<div id = "box" class = "box">This is a box</div>

Мы можем добиться изменений с помощью приведенного ниже кода для одного тега:

document.getElementsByTagName("div")["class", "box"].setAttribute("id", "box")

Но если мы не знаем или у нас есть несколько классов в элементе HTML, как добавить id ко всем тегам?

Пример:

<div class = "box">Hello World</div>
<div class = "box--red">Hello World</div>
<div class = "box--blue">Hello World</div>
<div class = "box--green">Hello World</div>

Результат должен быть таким, как показано ниже:

<div id = "box">Hello World</div>
<div id = "box--red">Hello World</div>
<div id = "box--blue">Hello World</div>
<div id = "box--green">Hello World</div>

Итак, вам не следует пытаться сделать так, чтобы у одного предмета был один и тот же id - это приведет к тому, что позже случатся плохие вещи. Используйте id, когда на странице будет одна и только одна вещь с этим id.

Matthew Herbst 10.12.2018 05:51

@MatthewHerbst приведенный выше код предназначен только для примера на веб-сайте, у нас есть несколько разделов, использующих имя класса (например, заголовок, слайдер, сведения, службы и т. д.). Я хочу добавить идентификатор, используя имя класса.

imjayabal 10.12.2018 05:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
1 573
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я не уверен, зачем вы это делаете, это реальный сценарий, но его можно достичь, перебрав все элементы div, установив идентификатор для имени класса, а затем удалив атрибут класса. Я создал ванильный пример Javascript ниже.

Примечание. id должен быть уникальным в DOM, иначе вы можете вызвать несколько проблем.

document.querySelectorAll('div').forEach(function(el) {
  el.id = el.classList;
  el.removeAttribute('class');
});

Если вам нужно настроить таргетинг на разные элементы, у которых в качестве первой части атрибута класса указано «box», вы можете использовать селектор [class^ = "box"] в querySelectorAll следующим образом:

document.querySelectorAll('[class^ = "box"]').forEach(function(el) {
  el.id = el.classList;
  el.removeAttribute('class');
});

Вы хотели сказать el.removeAttr() вместо el.removeAttribute()?

Ahmad 10.12.2018 05:55

Нет, removeAttr() - это метод jQuery, а el.removeAttribute() - это обычный javascript, который не требует jQuery.

itodd 10.12.2018 05:57

Хотя это будет работать, почему вы используете свойство classList, если вам не нужен массив? Вы создаете JavaScript и создаете массив из строки, а затем конвертируете ее обратно в строку, чтобы сохранить в атрибуте id. Вместо этого просто используйте className.

Racil Hilan 10.12.2018 07:08

Да, вы можете использовать здесь className.

itodd 10.12.2018 23:34
Ответ принят как подходящий

Вы можете использовать подстановочный знак * в имени класса, как показано ниже.

$('[class* = "box"]').each(function(i, ele) {
  var id = $(this).attr('class');
  $(this).attr('id', id);

});
.box {
  background-color: lightblue;
}
.box--red {
  background-color: red;
}
.box--blue {
  background-color: blue;
}
.box--green {
  background-color: green;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "box">Hello World</div>

<div class = "box--red">Hello World</div>

<div class = "box--blue">Hello World</div>

<div class = "box--green">Hello World</div>

Вы можете использовать jQuery Атрибут начинается с селектора для цикла по всем элементам, чтобы вы могли установить атрибут я бы с attr с текущим элементом класс. Затем удалите класс с помощью removeClass ().

$('div[class^=box]').each(function(i, el){
  $(el).attr('id', $(el).attr('class'));
  $(el).removeClass($(el).attr('class'));
});
#box{
}
#box--red{
  color:red;
}
#box--blue{
  color:blue;
}
#box--green{
  color:green;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "box">Hello World</div>
<div class = "box--red">Hello World</div>
<div class = "box--blue">Hello World</div>
<div class = "box--green">Hello World</div>

Ванильный JavaScript: Использование querySelectorAll() и forEach()

var elList = document.querySelectorAll('div[class^=box]');
elList.forEach(function(el) {
  el.id = el.className;
  el.removeAttribute('class');
});
#box{
}
#box--red{
  color:red;
}
#box--blue{
  color:blue;
}
#box--green{
  color:green;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "box">Hello World</div>
<div class = "box--red">Hello World</div>
<div class = "box--blue">Hello World</div>
<div class = "box--green">Hello World</div>

Хотя это будет работать, почему вы используете свойство classList, если вам не нужен массив? Вы создаете JavaScript и создаете массив из строки, а затем конвертируете ее обратно в строку, чтобы сохранить в атрибуте id. Вместо этого просто используйте className.

Racil Hilan 10.12.2018 07:08

Этот код подойдет вам

$("div[class^='box']").each(function() {
  var className = $( this ).attr('class');
  $( this ).attr({id: className}).removeAttr('class');
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "box">Hello World</div>
<div class = "box--red">Hello World</div>
<div class = "box--blue">Hello World</div>
<div class = "box--green">Hello World</div>

Я думаю, что следующее может помочь, если вы хотите использовать jQuery:

var boxCollection = $(".wrapper div");
boxCollection.each(function(){
	$(this).attr("id", $(this).attr("class"));
});
#box-1{
 color: red; 
}
#box-2{
  color: orange;
}
#box-3{
  color: blue;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "wrapper">
  <div class = "box-1">Box 1</div>
  <div class = "box-2">Box 2</div>
  <div class = "box-3">Box 3</div>
</div>

Я добавил цветовую схему, чтобы легче было понять переход.

Вы можете легко сделать это в JavaScript, используя метод querySelectorAll() и просматривая результаты в цикле:

document.querySelectorAll("[class^=box]").forEach(function(box) {
  box.setAttribute("id", box.className);
  box.removeAttribute("class");
});
<div class = "box">Hello World</div>
<div class = "box--red">Hello World</div>
<div class = "box--blue">Hello World</div>
<div class = "box--green">Hello World</div>

Примечание. Хотя это будет работать с тегами с несколькими классами, пробелы в id недопустимы. Браузеры допускают пробелы в id, но с ними будет труднее работать. Вы можете заменить пробелы символами подчеркивания перед присвоением им id.

Этот код прост и соответствует вышеуказанному требованию.

var a = document.querySelectorAll('div[class^ = "box"]');
for(var i=0;i<a.length;i++) {
  a[i].setAttribute("id",a[i].getAttribute("class"));
  //console.info(a[i].getAttribute("id"));
}

Другие вопросы по теме