Получить элемент внутри элемента по классу и идентификатору - JavaScript

Хорошо, я раньше занимался JavaScript, но самая полезная вещь, которую я написал, - это стильный переключатель CSS. Поэтому я немного новичок в этом. Скажем, у меня есть HTML-код:

<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>

Как мне изменить "Привет, мир!" на "Прощай мир!"? Я знаю, как работают document.getElementByClass и document.getElementById, но я хотел бы уточнить. Извините, если это было задано раньше.

Ответ 1

Ну, во-первых, вам нужно выбрать элементы с такой функцией, как getElementById.

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];

getElementById возвращает только один узел, но getElementsByClassName возвращает список узлов. Поскольку существует только один элемент с таким именем класса (насколько я могу судить), вы можете просто получить первый (для чего предназначен [0] - он как массив).

Затем вы можете изменить HTML с помощью .textContent.

targetDiv.textContent = "Goodbye world!";

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];
targetDiv.textContent = "Goodbye world!";
<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>

Ответ 2

Вы можете сделать это следующим образом:

var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
    list[0].innerHTML = "Goodbye world!";
}

или, если вы хотите сделать это с меньшим количеством проверок ошибок и большей кратностью, это можно сделать в одной строке следующим образом:

document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";

Пояснение:

  • Вы получаете элемент с id="foo".
  • Затем вы найдете объекты, которые содержатся в этом объекте с class="bar".
  • Это возвращает подобный массиву nodeList, поэтому вы ссылаетесь на первый элемент в этом узлеList
  • Затем вы можете установить innerHTML этого элемента, чтобы изменить его содержимое.

Предостережения: некоторые старые браузеры не поддерживают getElementsByClassName (например, более старые версии IE). Эта функция может быть закреплена на месте, если отсутствует.


Здесь я рекомендую использовать библиотеку, которая имеет встроенную поддержку селектора CSS3, а не беспокоиться о совместимости браузера (пусть кто-то еще выполняет всю работу). Если вы хотите только библиотеку, чтобы сделать это, то Sizzle будет работать отлично. В Sizzle это будет сделано следующим образом:

Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";

jQuery имеет встроенную библиотеку Sizzle и в jQuery это будет:

$("#foo .bar").html("Goodbye world!");

Ответ 3

Если это необходимо для работы в IE 7 или ниже, вам нужно помнить, что getElementsByClassName не существует во всех браузерах. Из-за этого вы можете создать собственное имя getElementsByClassName или попробовать это.

var fooDiv = document.getElementById("foo");

for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) {
    childNode = fooDiv.childNodes[i];
    if (/bar/.test(childNode.className)) {
        childNode.innerHTML = "Goodbye world!";
    }
}

Ответ 4

Рекурсивная функция:

function getElementInsideElement(baseElement, wantedElementID) {
    var elementToReturn;
    for (var i = 0; i < baseElement.childNodes.length; i++) {
        elementToReturn = baseElement.childNodes[i];
        if (elementToReturn.id == wantedElementID) {
            return elementToReturn;
        } else {
            return getElementInsideElement(elementToReturn, wantedElementID);
        }
    }
}

Ответ 5

Самый простой способ сделать это:

function findChild(idOfElement, idOfChild){
  let element = document.getElementById(idOfElement);
  return element.querySelector('[id=' + idOfChild + ']');
}

или лучше читаемый:

findChild = (idOfElement, idOfChild) => {
    let element = document.getElementById(idOfElement);
    return element.querySelector(`[id=${idOfChild}]`);
}

Ответ 6

Вы не должны использовать document.getElementByID, потому что его работа только для элементов управления на стороне клиента, где ids исправлены. Вы должны использовать jquery, как показано ниже.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                                                                                                             
<div id="foo">
   <div class="bar"> 
          Hello world!
     </div>
</div>

используйте это:

$("[id^='foo']").find("[class^='bar']")

// do not forget to add script tags as above

если вы хотите удалить любую операцию редактирования, просто добавьте ".". позади и выполнять операции