Как извлечь текст «ближайшего соседа» с помощью javascript?

Учитывая содержимое HTML, подобное этому:

<span class = "type">First Name</span>
<span class = "entity">Bob</span>

<span class = "type">Company Name</span>
<span class = "entity">Apple</span>

<span class = "type">Phone</span>
<span class = "entity">800.555.5555</span>

Как можно извлечь Apple? - то есть первый класс сущностей, ближайший к type, который имеет значение Company Name.

Обновлено:

Без использования jQuery

Пожалуйста, покажите, какое исследование вы провели, и какой код вы пробовали. Такое ощущение, что вы просите добровольцев, которые отвечают на вопросы Stack Overflow, сделать вашу работу за вас, что нехорошо.

Heretic Monkey 21.07.2018 18:46

Возможный дубликат Найти следующий родственный элемент в DOM с помощью JavaScript

Adan Sandoval 21.07.2018 18:59
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
267
7

Ответы 7

Вы можете использовать querySelectorAll, чтобы получить все элементы .type, а затем проверить, совпадает ли текст с Company Name, а затем получить nextElementSibling

document.querySelectorAll('.type').forEach(el => {
  let text = el.textContent;

  if (text == 'Company Name') {
    el.nextElementSibling.style.color = 'red'
  }
})
<span class = "type">First Name</span>
<span class = "entity">Bob</span>

<span class = "type">Company Name</span>
<span class = "entity">Apple</span>

<span class = "type">Phone</span>
<span class = "entity">800.555.5555</span>

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

document.querySelector("type").nextSibling;

Это приводит к узлу, содержащему «Боб».

Heretic Monkey 21.07.2018 18:47

@HereticMonkey, потому что он не упомянул, в каком случае он хотел это сделать. может быть this.nextSibling; или что-то еще

MajiD 21.07.2018 18:49

Но это не то, что у вас есть. У вас есть document; что делает контекст документом. Поэтому querySelector выберет первый элемент, который соответствует селектору в порядке документа. Собственно, в этом случае ничего не будет совпадать, так как элементов type нет.

Heretic Monkey 21.07.2018 18:53

Хотя это может дать ответ на вопрос, лучше добавить описание того, как этот ответ может помочь решить проблему. Пожалуйста, прочтите Как мне написать хороший ответ, чтобы узнать больше.

Roshana Pitigala 21.07.2018 20:03

Вы можете использовать это, чтобы получить карту типа-сущности:

const mapping = Object.assign(...Array.from(document.querySelectorAll(".type + .entity"), ({previousElementSibling: {textContent: type}, textContent: entity}) => ({[type]: entity})));

console.info(mapping); // { "First Name": "Bob", "Company Name": "Apple", Phone: "800.555.5555" }
console.info(mapping["Company Name"]); // "Apple"

Это работает, если взять textContent каждого .entity, которому предшествует .type, и взять textContent их previousElementSibling. Параметр вложенной деструктуризации переименовывает textContent узлов .type в type и textContent узлов .entity в entity, чтобы создать объект {[type]: entity} для каждой пары <span>. Наконец, Object.assign объединяет все объекты в один.

Это наиболее лаконичное и полное решение.

user10108359 21.07.2018 19:01

Вы можете использовать jQuery .next () а потом просто позвони

$('.type').next().text(); 

чтобы получить текст в виде строки

«Без использования jQuery».
Sebastian Simon 21.07.2018 18:50

@Xufox Я сделал свой ответ перед он редактировал вопрос.

Adan Sandoval 21.07.2018 18:54

@AdanSandoval Вы ответили 4 минуты назад, а вопрос был отредактирован 9 минут назад.

user10108359 21.07.2018 18:55

ТАК асинхронен: спорить о нескольких минутах глупо. Вопросы можно редактировать в процессе ответа. Неважно.

Dave Newton 21.07.2018 18:58

Вы можете получить это, найдя все элементы .type, затем перебрав их в цикле и проверив nextElementSibling, чтобы убедиться, что это Спички.entity

Array.from(document.querySelectorAll('.type')).forEach(el => {
  let next = el.nextElementSibling
  if (el.textContent == 'Company Name' && next.matches('.entity')) {
    console.info(next.textContent)
  }
})
<span class = "type">First Name</span>
<span class = "entity">Bob</span>

<span class = "type">Company Name</span>
<span class = "entity">Apple</span>

<span class = "type">Phone</span>
<span class = "entity">800.555.5555</span>

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

var types = document.querySelectorAll('.type');
var entities = document.querySelectorAll('.entity');

for (var i = 0; i < types.length; i++) {
  if (types[i].textContent === 'Company Name') {
    entities[i].style.color = 'Red';
    break;
  }
}
<span class = "type">First Name</span>
<span class = "entity">Bob</span>

<span class = "type">Company Name</span>
<span class = "entity">Apple</span>

<span class = "type">Phone</span>
<span class = "entity">800.555.5555</span>

Я добавил функцию, которая будет фильтровать сущность с типом в качестве ключа

 <span class = "type">First Name</span>
    <span class = "entity">Bob</span>

    <span class = "type">Company Name</span>
    <span class = "entity">Apple</span>

    <span class = "type">Phone</span>
    <span class = "entity">800.555.5555</span>

      <script>
        var filterData = function(type){
            var typeData  =  document.getElementsByClassName('type')
          for(i=0;i<typeData.length;i++){
            if (typeData[i].outerText == type ){
                var entity = typeData[i].nextSibling.nextElementSibling
                console.info(entity.outerText)
            }

          }
        }
        filterData("Company Name")

     </script>

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