Перенос идентификаторов элементов из PHP в JavaScript

Я сделал небольшой скрипт, чтобы при нажатии на кнопку можно было показать или скрыть описание.

    $('.package-1-show').click(function () {
        $('.js-package-1').css('display', 'block');
        $('.package-1-show').css('display', 'none');
        $('.package-1-hide').css('display', 'block');
    });

    $('.package-1-hide').click(function () {
        $('.js-package-1').css('display', 'none');
        $('.package-1-hide').css('display', 'none');
        $('.package-1-show').css('display', 'block');
    });

    $('.package-2-show').click(function () {
        $('.js-package-2').css('display', 'block');
        $('.package-2-show').css('display', 'none');
        $('.package-2-hide').css('display', 'block');
    });

    $('.package-2-hide').click(function () {
        $('.js-package-2').css('display', 'none');
        $('.package-2-hide').css('display', 'none');
        $('.package-2-show').css('display', 'block');
    });
#packages-list-1, #packages-list-2 {
  padding: 20px;
}

.name {
  font-size: 22px;
  font-weight: bold;
  padding-bottom: 10px;
}

.package-1-show, .package-2-show {
  cursor: pointer;
  display: block;
  padding-bottom: 10px;
}

.package-1-hide, .package-2-hide {
  cursor: pointer;
  display: none;
  padding-bottom: 10px;
}

.js-package-1, .js-package-2 {
  display: none;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id = "packages-list-1">
    <div class = "name">Package 1</div>
    <div class = "package-1-show">View</div>
    <div class = "package-1-hide">Hide</div>
    <div class = "js-package-1">Package 1 description</div>
</div>

<div id = "packages-list-2">
    <div class = "name">Package 2</div>
    <div class = "package-2-show">View</div>
    <div class = "package-2-hide">Hide</div>
    <div class = "js-package-2">Package 2 description</div>
</div>

Но тогда я хочу подключить PHP, и моя страница будет выглядеть так

<?php foreach ($items as $item) { ?>
    <div id = "packages-list-<?= $item->id ?>">
        <div class = "name">Package <?= $item->id ?></div>
        <div class = "package-<?= $item->id ?>-show">View</div>
        <div class = "package-<?= $item->id ?>-hide">Hide</div>
        <div class = "js-package-<?= $item->id ?>">Package <?= $item->id ?> description</div>
    </div>
<?php } ?>

И таких элементов на странице может быть хоть 1, хоть 5, хоть 10.

Но что мне делать дальше со сценарием? Мне как-то нужно передать идентификаторы пакетов в JavaScript, чтобы скрипт выглядел примерно так

        $('.package-' + item_id + '-show').click(function () {
            $('.js-package-' + item_id).css('display', 'block');
            $('.package-' + item_id + '-show').css('display', 'none');
            $('.package-' + item_id + '-hide').css('display', 'block');
        });

        $('.package-' + item_id + '-hide').click(function () {
            $('.js-package-'+ item_id).css('display', 'none');
            $('.package-' + item_id + '-hide').css('display', 'none');
            $('.package-' + item_id + '-show').css('display', 'block');
        });

Но как мне передать идентификаторы элементов из PHP в JavaScript?

И еще, что мне делать с частью css, ведь там у меня тоже фиксированные идентификаторы?

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

Teemu 14.09.2023 14:15

Хоть это и не элегантно, но точно так же, как вы прокручиваете и выводите <div>, вы можете прокручивать и выводить JS.

StephenCollins 14.09.2023 14:45

Для ясности: в настоящее время вы не используете атрибут HTML id ни в CSS, ни в JavaScript. Вы используете классы, которые должны быть более общими и неприменимыми к одному элементу, например ID. Ответ – рекомендуемый способ сделать это. Правило №1 программирования: не повторяйтесь. Если несколько элементов ведут себя одинаково, напишите код один раз.

Andy 14.09.2023 16:19
Поведение ключевого слова "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
3
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует больше способов выбора элементов и взаимодействия с ними, чем уникальные идентификаторы. В этом случае вы не хотите повторять один и тот же код снова и снова, меняя только число. Вместо этого обобщите обработчик событий click, чтобы он работал с каждым показанным набором элементов.

Для любой конкретной ссылки «показать/скрыть» выберите элемент(ы) относительно этой ссылки. Например:

$('.show').click(function () {
  $(this).siblings('.description').css('display', 'block');
  $(this).css('display', 'none');
  $(this).siblings('.hide').css('display', 'block');
});

$('.hide').click(function () {
  $(this).siblings('.description').css('display', 'none');
  $(this).css('display', 'none');
  $(this).siblings('.show').css('display', 'block');
});
#packages-list-1, #packages-list-2 {
  padding: 20px;
}

.name {
  font-size: 22px;
  font-weight: bold;
  padding-bottom: 10px;
}

.show {
  cursor: pointer;
  display: block;
  padding-bottom: 10px;
}

.hide {
  cursor: pointer;
  display: none;
  padding-bottom: 10px;
}

.description {
  display: none;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id = "packages-list-1">
    <div class = "name">Package 1</div>
    <div class = "show">View</div>
    <div class = "hide">Hide</div>
    <div class = "description">Package 1 description</div>
</div>

<div id = "packages-list-2">
    <div class = "name">Package 2</div>
    <div class = "show">View</div>
    <div class = "hide">Hide</div>
    <div class = "description">Package 2 description</div>
</div>

Здесь я специально использую .siblings() для нацеливания на ближайшие элементы относительно элемента, по которому щелкнули. Существует множество методов обхода DOM, которые можно использовать для поиска элементов относительно выбранного элемента. (Например, общий шаблон, который я использовал в более сложной разметке, заключается в использовании .closest() для перехода к известному общему родительскому элементу, а затем .find() для целевого элемента(ов) внутри этого общего родительского элемента.)

Возможно, вам даже не понадобится, чтобы эти родительские элементы имели идентификаторы, как здесь. Я в основном предполагаю баланс между общими наборами разметки и необходимостью использования идентификаторов в вашем случае использования. Этот баланс может простираться настолько далеко, насколько вам хочется. Но общая цель состоит в том, чтобы обобщить функциональность, которую необходимо применять неоднократно, чтобы вам не приходилось снова и снова копировать/вставлять один и тот же код.


Если вам нужно передать значения из PHP в JavaScript, вы можете сделать это так же, как и для HTML. Вам понадобится элемент <script> в этом HTML:

<script>
$('.js-package-<?= $item->id ?>').css('display', 'none');
</script>

JavaScript в файлах .js всегда должен оставаться пригодным для повторного использования и не должен ссылаться на определенные идентификаторы.

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