jQuery .clone (), получая только первый экземпляр класса - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующий код в шаблоне сетевой установки WordPress. Мое намерение состоит в том, чтобы позволить нетехническому пользователю (менеджеру контента, который помогает менеджерам блогов обновлять свой контент и т. Д.) Просматривать всех пользователей роли «пользовательская роль» по блогам, а затем нажать кнопку, чтобы скопировать все адреса электронной почты в текстовое поле. поэтому она может копировать и вставлять их в поле скрытой копии и общаться со всеми текущими пользователями.

Однако сценарий клонирует только первый экземпляр класса «электронные письма». Что мне не хватает? Разве это не должно захватить все экземпляры li.emails?

    <button id="copy">Copy all emails</button>
<textarea id="for-copy"></textarea>

    <?php

    $bcount = get_blog_count();

    global $wpdb;
    $blogs = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE 
    spam = '0' AND deleted = '0' and archived = '0' and public='1'"));
    if(!empty($blogs)){
        foreach($blogs as $blog){
            $details = get_blog_details($blog->blog_id);
            if($details != false){
                $addr = $details->siteurl;
                $name = $details->blogname;
                $id = $details->blog_id;
                $blogusers = get_users( 'blog_id='.$id.'&role=custom-role' );
                if (!empty($blogusers)) {
                    echo '<a href="'.$addr.'">'.$name.'</a>'.'<ul>';
                    foreach ( $blogusers as $user ) {
                    echo '<li class="emails">'.$user->user_email .'</li>';
                    }
                    echo '</ul>';
                }
            }
        }
    }
    ?>

<script>
(function($) {
$('#copy').click(function(e){
var new_list = $(".emails").clone();
$('#for-copy').append(new_list.html()); // also tried val()
});
})( jQuery );
</script>

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я бы порекомендовал НЕ использовать .clone () здесь, а просто захватывать адреса электронной почты. Метод клонирования действительно лучше всего подходит для копирования какого-либо элемента со всеми его дочерними элементами для воссоздания его на странице. Я бы предложил просто перебрать элементы «emails»:

var forcopy = $('#for-copy')
$('.emails').each(function() {
    forcopy.append($(this).text())
}
0 голосов
/ 05 ноября 2018

Из документов jQuery на .html():

Получить содержимое HTML первого элемента в наборе соответствующих элементов или задать содержимое HTML каждого соответствующего элемента.

Так вот почему вы получаете только первый элемент.

Если вы просто хотите, чтобы все адреса электронной почты в строке были вставлены в почтовый клиент, возможно, вы могли бы просто сделать что-то вроде этого:

var emailAddresses = $('.emails').map(function(i, element) {
  return $(element).text();
}).toArray().join(';');

$('#for-copy').text(emailAddresses);

При этом получаются все элементы с классом .emails, итерация по ним с помощью .map() для получения текста, преобразование результата в массив, а затем преобразование его в строку, разделенную точкой с запятой, с помощью .join() , В этом случае фактически нет необходимости клонировать элементы.

...