Поиск класса по Dynami c ID и доступ к значению данных - PullRequest
1 голос
/ 21 апреля 2020

У меня есть данные с древовидной структурой, где я хочу получить идентификаторы каждого родителя при нажатии на конкретного родителя. Это похоже на мой вопрос здесь

Я не могу получить требуемый alert Может кто-нибудь сообщить мне, что не так

$(".chapter").on("click", function() {
  let id = $(this).attr("href");
  list = $.map($(id).find(".sportlist"), function(item) {
    alert($(item).data("value"))
  })
});
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.css" rel="stylesheet" />
<div class="tree-ehex col-md-3" style="padding-left:0px;float: left; width:215px;overflow-x:scroll;height:261px;" id="treeOrderDiv">
  <ul style="padding-left: 0px;" id="leftsubMenus-Ul">
    <li class="parent_li">
      <span style="font-family: serif;font-size: small;" title="Collapse this branch"><i class="tree-ehex-title glyphicon glyphicon-minus-sign"></i></span>
      <a href="#Parent" class='chapter'> Parent</a>
      <ul id='#Parent'>
        <li style="display: list-item;" data-value='20'>
          <a href="#"><span style="text-transform: uppercase;color:black;font-size: smaller;font-family: sans-serif"> Child1 </span></a>
        </li>
        <li style="display: list-item;" data-value='22'>
          <a href="#"><span style="text-transform: uppercase;color:black;font-size: smaller;font-family: sans-serif"> Child2 </span></a>
        </li>
      </ul>
    </li>
    <li class="parent_li">
      <span style="font-family: serif;font-size: small;" title="Collapse this branch"><i class="tree-ehex-title glyphicon glyphicon-minus-sign"></i></span>
      <a href="#Parent1" class='chapter'> Parent1</a>
      <ul id="#Parent1">
        <li class='sportlist' style="display: list-item;" data-value='22'>
          <a href="#"><span style="text-transform: uppercase;color:black;font-size: smaller;font-family: sans-serif"> Child</span></a>
        </li>
        <li class='sportlist' style="display: list-item;" data-value='24'>
          <a href="#"><span style="text-transform: uppercase;color:black;font-size: smaller;font-family: sans-serif"> Child1 </span></a>
        </li>
      </ul>
    </li>
  </ul>
</div>

Ответы [ 4 ]

1 голос
/ 21 апреля 2020

Здесь есть пара вопросов.

  • Префикс # не должен помещаться в атрибут id в вашем HTML. Убери это.
  • В первой группе элементов в #Parent отсутствует класс .sportlist.

Кроме того, следует отметить, что map() или $.map() используется для создания массива из объекта jQuery. Если вам нужно всего лишь oop, просто используйте each().

Также не используйте встроенные атрибуты style, если нет другого выбора. Лучше всего использовать правила стилей CSS во внешней таблице стилей.

Наконец, не используйте alert() для отладки, поскольку это приводит к типам данных. console.log() или console.dir() всегда лучший способ действий здесь.

С учетом всего сказанного, попробуйте это:

$(".chapter").on("click", function() {
  let selector = $(this).attr("href");

  $(selector).find(".sportlist").each(function() {
    let value = $(this).data('value');
    console.log(value);

    // do something useful with value...
  })
});
#treeOrderDiv {
  padding-left: 0px;
  float: left;
  width: 215px;
  overflow-x: scroll;
  height: 261px;
}

#leftsubMenus-Ul {
  padding-left: 0px;
}

.parent_li span {
  font-family: serif;
  font-size: small;
}

.sportlist {
  display: list-item;
}

.sportlist span {
  text-transform: uppercase;
  color: black;
  font-size: smaller;
  font-family: sans-serif;
}
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.css" rel="stylesheet" />
<div class="tree-ehex col-md-3" id="treeOrderDiv">
  <ul id="leftsubMenus-Ul">
    <li class="parent_li">
      <span title="Collapse this branch"><i class="tree-ehex-title glyphicon glyphicon-minus-sign"></i></span>
      <a href="#Parent" class="chapter">Parent</a>
      <ul id="Parent">
        <li class="sportlist" data-value="20">
          <a href="#"><span>Child1</span></a>
        </li>
        <li class="sportlist" data-value="22">
          <a href="#"><span>Child2</span></a>
        </li>
      </ul>
    </li>
    <li class="parent_li">
      <span title="Collapse this branch"><i class="tree-ehex-title glyphicon glyphicon-minus-sign"></i></span>
      <a href="#Parent1" class="chapter">Parent1</a>
      <ul id="Parent1">
        <li class="sportlist" data-value="22">
          <a href="#"><span>Child</span></a>
        </li>
        <li class="sportlist" data-value="24">
          <a href="#"><span>Child1</span></a>
        </li>
      </ul>
    </li>
  </ul>
</div>

Обновление

Если я задаю href как # вместо #Parent мы можем получить список, как мы получаем в настоящее время?

Конечно. Для этого вам нужно использовать обход DOM, а не нацеливать элементы напрямую. Попробуйте это:

$(".chapter").on("click", function() {
  let $ul = $(this).next('ul');
  $ul.find(".sportlist").each(function() {
    let value = $(this).data('value');
    console.log(value);

    // do something useful with value...
  })
});
1 голос
/ 21 апреля 2020

У вас есть несколько вариантов:

  1. изменить id атрибуты ul с <ul id="#Parent"> на <ul id="Parent"> и оставить js как есть
  2. или оставить html как есть, но изменить js:
$(".chapter").on("click", function() {
 let id = $(this).attr("href");
 let chapter = $(document.getElementById(id));
 list = $.map(chapter.find(".sportlist"), function(item) {
   alert($(item).data("value"))
 })
});
0 голосов
/ 21 апреля 2020

Вы можете решить проблему, не изменяя HTML, используя следующую команду: script: -

$(".chapter").on("click", function() {  
  $.each($(this).next().find('li'), function(){
    alert($(this).data('value'))
  });
});
0 голосов
/ 21 апреля 2020

Не включайте # в свои атрибуты id. Итак, измените id='#Parent' на id='Parent'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...