У меня есть структура HTML ниже.
<div class = "SomeClassName">
<a href = "https://abc.xyz">
<span>
<img id = "SomeImgID1" />
</span>
</a>
<a href = "https://xyz.abc">
<span>
<img id = "SomeImgID2" />
</span>
</a>
</div>
Я хочу добавить тег <div> перед каждым тегом <img>, как мне это сделать с помощью чистого javascript?
Отвечает ли это на ваш вопрос? Как заменить элемент DOM на месте с помощью Javascript?
что ты пробовал?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что-то вроде
let divElement=document.querySelection('div.someClass');
Array.from(divElement.querySelectionAll('img'))
.forEach(el=>divElement.insertBefore(document.createElement('div'),el));
Опять же, если вы хотите обернуть img, вы можете использовать следующий фрагмент:
let divElement=document.querySelection('div.someClass');
Array.from(divElement.querySelectionAll('img'))
.forEach(el=>{
let div=document.createElement('div');
divElement.insertBefore(div,el));
div.appendChild(el);
});
Для получения дополнительной информации см. Element.insertBefore на MDN
извините, я не хочу «добавлять» пустые теги <div> перед тегами <img>. Я хочу обернуть теги <img> внутри <div> Вывод должен быть таким: <div class = "SomeClassName"> <a href = "abc.xyz "> <span> <div> <img id = "SomeImgID1" /> </span> </div> </a> <a href = " xyz.abc"> <span> <div> <img id = "SomeImgID2" /> </div> </span> </a> </div>
iaMsUPerNOva, наконец, я вас понял, и я здесь с решением.
<a class = "image" href = "https://abc.xyz"> <!--note this-->
$(function() {
var node = $("a.image"); // This will copy your a tag so that img tag will also get copied.
$(".SomeClassName").append('<div>hello</div>');//This will create a new div containing hello text
$("a.image").remove(); // This will remove a tag which is already copied to node.
$("SomeClassName").append(node); //Finally we are going to add newly created div to SomeClassName.
});
Итак, то, что мы хотим здесь сделать, включает в себя два шага:
IMG внутри вашего DIV с классом SomeClassName.IMG элементов создайте новый DIV и вставьте его перед элементом.Вот как вы это делаете.
/* document.querySelectorAll returns a NodeList.
The spread operator "..." converts it into an array,
so that we can call the forEach method on it. */
[...document.querySelectorAll("div.SomeClassName img")].forEach(x => {
// Here we create the new DIV
let div = document.createElement("div");
// Just some sample text to show
div.textContent = "Hello!";
// x.parentNode finds the parent of the IMG element.
// The frst parameter of node.InsertBefore is the
// element we want to insert as its child, and the
// the second parameter is the reference element
// before which this new element will be inserted
x.parentNode.insertBefore(div, x);
});
Не просто отвечайте кодом, на самом деле объясните, почему он полезен и как он работает, чтобы спрашивающий мог научиться.
Спасибо, мистер Х, за ответ. Я не хочу добавлять новый тег <div> перед <img>. Я хочу, чтобы тег <img /> был обернут внутри <div> вместо добавления <div></div> перед <img>, чтобы он выглядел так: <div><img /></div>
Спасибо всем за ваши ответы. Я забыл упомянуть ранее, что у меня был еще один родитель <div>, и окончательная структура была такой.
<div class = "ParentClassName">
<div class = "ChildClassName">Some Content</div>
<div class = "ChildClassName">Some Content2</div>
<div class = "ChildClassName">
<a href = "https://abc.xyz">
<span>
<img id = "SomeImgID1" />
</span>
</a>
<a href = "https://xyz.abc">
<span>
<img id = "SomeImgID2" />
</span>
</a>
</div>
</div>
Я мог бы обернуть все теги <img> внутри <div>, выполнив следующий шаг.
Примечание. Если ваше имя класса является динамическим, вы можете удалить его из селекторов запросов, и вы можете поместить только элемент селектора, например document.querySelector("div");
let divElement = document.querySelector("div.ParentClassName");
Array.from(divElement.querySelectorAll("div.ChildClassName img")).forEach(
(el) => {
let div = document.createElement("div");
el.parentElement.insertBefore(div, el);
div.appendChild(el);
}
);
и мой окончательный результат был
<div class = "ParentClassName">
<div class = "ChildClassName">Some Content</div>
<div class = "ChildClassName">Some Content2</div>
<div class = "ChildClassName">
<a href = "https://abc.xyz">
<span>
<div>
<img id = "SomeImgID1" />
</div>
</span>
</a>
<a href = "https://xyz.abc">
<span>
<div>
<img id = "SomeImgID2" />
</div>
</span>
</a>
</div>
</div>
Добро пожаловать в Stackoverflow. Пожалуйста, примите участие в туре (и получите значок). В вашем вопросе отсутствует попытка решить эту проблему самостоятельно. Идея состоит в том, чтобы вы попытались заставить что-то работать, а затем пришли сюда с конкретными проблемами, которые вы не можете решить. Совершив экскурсию и прочитав Как задать хороший вопрос в справочном центре, вы получите всю необходимую информацию.