Динамические теги Div в цикле while

У меня есть цикл while, который заполняет 4 вкладки div (в одном родительском div) с помощью PHP.

У меня также есть сценарий копирования в буфер обмена для копирования текста из тега P. К сожалению, эта функция работает только в том случае, если тег и кнопка имеют уникальный идентификатор.

Итак, мой вопрос заключается в следующем: Как назначить последовательный идентификатор моим зацикленным тегам P? В том смысле, что я хочу, чтобы первый набор вкладок в первом заполненном div имел идентификаторы 1,2,3,4, а следующий - 5,6,7,8... и так далее.

Вот HTML в цикле PHP:

<div id='content' class='tab-content'>
   <div id='navpills-1' class='tab-pane active'>
      <p id='text'>Text to be copied to clipboard.</p>
      <button id='jsbtn' class='btn jsbtn' onclick='copyToClipboard('p#text')'>Copy</button>
   </div>
</div>

Вот сценарий, который я использую для копирования текста из тега P в буфер обмена:

<script>
    function copyToClipboard(element) {
      var $temp = $("<textarea>");
      var brRegex = /<br\s*[/]?>/gi;
      $("body").append($temp);
      $temp.val($(element).html().replace(brRegex, "\r\n")).select();
      document.execCommand("copy");
      $temp.remove();
    }
</script>

Вам не нужно использовать идентификатор только для того, чтобы функция работала. Кнопка активирует event, и вы можете легко определить элемент, который нужно скопировать, используя родительские/родственные селекторы.

Professor Abronsius 11.05.2022 11:27

Добавьте обработчики событий способом правильный jQuery, не используя встроенные атрибуты. $('.jsbtn').on('click', function() {...}); Затем у вас есть доступ к выбранному элементу с помощью $(this), поэтому вы можете использовать $(this).parent().find('p').html(), чтобы перейти от кнопки к родительскому div, найти там элемент p и получить его содержимое. Идентификаторы на кнопке и абзаце могут быть полностью удалены.

CBroe 11.05.2022 11:38

Также теперь есть улучшенный API для копирования текста в/из буфера обмена — см. MDN для получения подробной информации об API буфера обмена

Professor Abronsius 11.05.2022 11:40

Спасибо профессору Абронсиусу и CBroe за ваши ответы! @Cbroe... не могли бы вы написать это для меня? Что я должен поместить в кнопку, а затем в скрипт? Я относительно новичок в PHP, но ничего не знаю о Javascript/jQuery. Спасибо!

askjeevs 11.05.2022 14:23
Поведение ключевого слова "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
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы не привержены использованию jQuery, вы можете легко достичь своей цели с помощью довольно простого, ванильного Javascript. API буфера обмена предоставляет современное решение для копирования текста (и прочего) в системный буфер обмена и из него.

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

В следующем нигде не используются атрибуты ID — вместо этого обработчик событий, назначенный каждой кнопке, использует event, чтобы определить, какой элемент был нажат (вызвал обработчик), и из этого узла можно, учитывая, что вы знаете структуру DOM, найти другие узлы представляет интерес. В приведенном ниже коде event.target относится к кнопке — оттуда мы находим ее родителя, а из этого родителя мы находим конкретный элемент P, содержимое которого нужно скопировать. Метод, предложенный @CBroe, делает это с использованием методов jQuery, с которыми я не знаком.

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>Basic Clipboard Copy Example</title>
    </head>
    <body>
        <div class='tab-content'>
           <div class='tab-pane active'>
              <p class='copy'>Text to be copied to clipboard.</p>
              <button class='btn jsbtn'>Copy</button>
           </div>
           <div class='tab-pane active'>
              <p class='copy'>Some other text to be copied to clipboard.</p>
              <button class='btn jsbtn'>Copy</button>
           </div>
           <div class='tab-pane active'>
              <p class='copy'>Guess what...more text and not an ID in sight</p>
              <button class='btn jsbtn'>Copy</button>
           </div>
           <div class='tab-pane active'>
              <p class='copy'>And the final Paragraph and final chapter and final word.</p>
              <button class='btn jsbtn'>Copy</button>
           </div>
        </div>
        
        <textarea cols=100 rows=10></textarea>
        
        <script>
            document.querySelectorAll('button.jsbtn').forEach( bttn=>bttn.addEventListener('click',e=>{

              const pttn=/<br\s*[/]?>/gi;
              const paragraph=e.target.parentNode.querySelector('p.copy');
              const textarea=document.querySelector('textarea');

              // writeText copies text to the clipboard
              navigator.clipboard.writeText( paragraph.innerHTML.replace( pttn, String.fromCharCode( 10 ) ) )
                .then(
                  ()=>{
                    /* 
                       All good... and to illustrate reading this copied text... 
                       readText - reads from the clipboard
                    */
                    navigator.clipboard.readText()
                        .then( text=>{
                            textarea.value=text;
                        })
                  },
                  (e)=>{console.info( 'error: %s',e.message )}
                )
            }));
        </script>
    </body>
</html>

...ты гений! Большое спасибо за то, что нашли время и усилия, чтобы предоставить код и решение моей проблемы! У меня есть последний запрос: если вы видите мой пример кода, в нем есть переменная Regex, которую я использовал для обеспечения интервала между абзацами при копировании из тега P. (Текст сохраняется с тегами разрыва в БД, поэтому он хорошо отображается, когда я его извлекаю.) Когда я копирую текст в буфер обмена, я хочу очистить все форматирование, кроме интервала между абзацами. Раньше это работало с «Regex»; пробовал, но не могу заставить это работать в вашем сценарии. Пожалуйста помоги. Спасибо!

askjeevs 12.05.2022 15:26

Сделал небольшое изменение в приведенном выше: проверил textContent на innerHTML, чтобы регулярное выражение работало, и использовал символ ascii для разрыва строки, а не строку \r\n - думаю, что это работает, как и ожидалось.

Professor Abronsius 12.05.2022 16:59

Еще раз, @Professor Abronsius, вы гений! Работает как часы! Большое спасибо за то, что сделали мою жизнь проще, за ваше время и усилия. Действительно ценю это! :-)

askjeevs 13.05.2022 17:08

возможно, вы хотели бы принять ответ/+1 и т. д.?

Professor Abronsius 13.05.2022 17:27

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