JS / jQuery - Как мне получить текст сразу двух DIV-содержимого?

Я хочу перебрать все элементы <TD>, где я хочу записать Title и Link одного и того же элемента <TD> в двух переменных. Как я могу сделать это в JS / jQuery?

Мой HTML:

<td>
    <div class = "class_Title row border-bottom" name = "name_Title" id = "id_Title">
        <B>Microsoft</B>
    </div>
    <div class = "class_Link row" name = "name_Link" id = "id_Link">
        https://www.microsoft.com
    </div>
</td>

<td>
    <div class = "class_Title row border-bottom" name = "name_Title" id = "id_Title">
        <B>Google</B>
    </div>
    <div class = "class_Link row" name = "name_Link" id = "id_Link">
        https://www.google.com
    </div>
</td>
<!-- there are a lot of these...-->

Мой Javascript:

    $('.class_Title').each(function(){
        var str_CurrentTitle = '';
        str_CurrentTitle= $(this).text().trim()

        $('.class_Link').each(function(){
            var str_CurrentLink = '';
            str_CurrentLink= $(this).text().trim()

            //call another function, to work with the result
            Start_To_Work_With_The_Result(str_CurrentTitle, str_CurrentLink)
        })
    })

Ожидаемый результат: я могу вызвать функцию Start_To_Work_With_The_Result один раз с параметрами (Microsoft / https://www.microsoft.com) и во втором цикле с параметрами (Google / https://www.google.com).

Как я могу решить эту проблему элегантным способом?

Наверное, не следует повторно использовать свойства id на одной странице. Свойство элемента DOM id должно быть уникальным для этой страницы.

Charlie Fish 28.12.2018 02:27
Поведение ключевого слова "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) для оценки ваших знаний,...
1
1
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что-то вроде следующего? Это будет проходить через все элементы td и получить нужные данные. Вместо вложенных циклов.

$('td').each(function(){
    var str_CurrentTitle = $(this).children(".class_Title").text().trim();
    var str_CurrentLink = $(this).children(".class_Link").text().trim();

    //call another function, to work with the result
    Start_To_Work_With_The_Result(str_CurrentTitle, str_CurrentLink)
})

Это предполагает, что все ваши элементы div, к которым вы хотите получить доступ в элементах td, имеют классы class_Title и class_Link.

это может не сработать, если есть также div, у которых нет классов OP, пустых ячеек или другого сконструированного содержимого ячеек

thex 28.12.2018 02:36

@thex Из-за того, что OP пытался использовать методы .each для каждого из этих классов, я предполагаю, что все div, к которым OP хочет получить доступ, имеют эти классы.

Charlie Fish 28.12.2018 02:38

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

thex 28.12.2018 02:42

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

Charlie Fish 28.12.2018 02:44

что значит вложенный .each? И даже это, к сожалению, в моем случае код не работает. Можно ли указать td's с ID - чтобы убедиться, что только эти td находятся в цикле?

Baku Bakar 28.12.2018 02:46

@EmbaBakar У вас есть .each внутри .each, что плохо для производительности и работает не так, как вы ожидаете. Is it possible to specify the td's with a ID - to make sure, that only these td are in the loop?. Я не понимаю, что вы имеете в виду. Вы имеете в виду ограничить это не всеми td?

Charlie Fish 28.12.2018 02:47

@EmbaBakar вложенный означает, что в вашем случае вы повторяете каждую итерацию извлечения заголовка, а также каждую ссылку, что на самом деле не то, что вам нужно. Вам не нужен ID на вашем <td>

thex 28.12.2018 02:48

@CharlieFish Спасибо за информацию, теперь я понимаю, о чем вы. И да, я имею в виду, что это ограничивается тем, чтобы он не проходил через все td .

Baku Bakar 28.12.2018 02:49

@EmbaBakar Вы можете добавить класс к каждому td. Затем вместо $('td').each вы бы сделали $('td.myclassname').each, заменив myclassname на имя класса, которое вы выбрали. Это выберет все элементы td с заданным именем класса.

Charlie Fish 28.12.2018 02:50

@CharlieFish Большое спасибо - теперь я понял.

Baku Bakar 28.12.2018 02:52
Ответ принят как подходящий

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

У вас должен быть только один цикл, а затем использовать метод навигации DOM, чтобы получить элемент-брат.

$(".class_Title").each(function() {
  var str_CurrentTitle = $(this).text().trim();
  var link = $(this).siblings(".class_Link");
  var str_CurrentLink = link.text().trim();
  Start_To_Work_With_The_Result(str_CurrentTitle, str_CurrentLink);
});

function Start_To_Work_With_The_Result(title, link) {
  console.info(title, link);
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table><tr>
<td>
  <div class = "class_Title row border-bottom" name = "name_Title" id = "id_Title">
    <B>Microsoft</B>
  </div>
  <div class = "class_Link row" name = "name_Link" id = "id_Link">
    https://www.microsoft.com
  </div>
</td>

<td>
  <div class = "class_Title row border-bottom" name = "name_Title" id = "id_Title">
    <B>Google</B>
  </div>
  <div class = "class_Link row" name = "name_Link" id = "id_Link">
    https://www.google.com
  </div>
</td>
</tr></table>

Ваш ответ точен, исходный JS не делает того, что должен делать.

thex 28.12.2018 02:33

Не работает. Результат - оба названия (Microsoft и Google). Я хотел бы сначала иметь заголовок, чем ссылку на заголовок.

Baku Bakar 28.12.2018 02:38

@EmbaBakar, ты уверен, что не испортил код? мне кажется правильным

thex 28.12.2018 02:45

можно ли разместить jsfiddle?

Baku Bakar 28.12.2018 02:47

Я добавил к ответу исполняемый фрагмент. Мне пришлось добавить вокруг него <table><tr>...</tr></table>, чтобы добиться хороших результатов.

Barmar 28.12.2018 02:48

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