Невозможно скопировать текст с помощью кнопки «Динамически создан» - PullRequest
0 голосов
/ 01 марта 2020

У меня есть следующая функция для копирования строки текста:

function copyText(str) {
    console.log(str);
    let tmp = $('<input type="text">').appendTo(document.body);
    tmp.val(str.toString() );
    tmp.select();
    document.execCommand('copy');
    tmp.remove();
}

Эта функция отлично работает как при вызове из консоли, так и при вызове с помощью нажатия кнопки.

I есть функция, которая копирует цвет:

function copyColor(elm) {
    let hex = $(elm.parentElement).find('span').html();
    console.log('copyText("' + hex + '")' );
    copyText(hex);
}

Эта функция вызывается при нажатии кнопки. Кнопка передает себя в качестве параметра. Я динамически создаю кнопки (каждая представляет новый «элемент цвета»). Вот HTML, который динамически вставляется с jQuery:

'<button class="btn copy-btn no-color" title="Copy" data-toggle="popover" onclick="copyColor(this);"><i class="fas fa-copy"></i></button>'

Все это:

    $('#' + mode + '-modal .modal-body').prepend(
        '<div class="' + mode + '-item color-item">'
    +       '<button class="btn open-btn no-color" title="Open Color" data-toggle="popover" onclick="openColor(this, \'' + mode + '\');"><i class="fas fa-external-link-alt"></i></button>'
    +       '<input class="form-control color-name" type="text" placeholder="Name your color (optional)" value="' + name + '">'
    +       '<br class="mobile-only">'
    +       '<div class="color-preview" style="background-color:' + hex + ';"></div>'
    +       '<span>' + hex + '</span>'
    +       '<button class="btn copy-btn no-color" title="Copy" data-toggle="popover" onclick="copyColor(this);"><i class="fas fa-copy"></i></button>'
    +       '<button class="btn link-btn no-color" title="Get Link" data-toggle="popover" onclick="copyColorLink(this);"><i class="fas fa-link"></i></button>'
    +       '<button class="btn delete-btn no-color" title="Remove" data-toggle="popover" onclick="removeColor(this);"><i class="fas fa-trash"></i></button>'
    +       '<i class="fas fa-arrows-alt" style="cursor:move;" title="Drag to Change Order" data-toggle="popover"></i>'

    // +        '<button onclick="copyText(\'hi\')">hi</button>'

    +   '</div>'
    );

где mode, hex и name все параметры этой функции.

Каждый раз, когда я нажимаю, чтобы скопировать цвет, он вызывает функцию copyColor(), получает правильную строку, вызывает функцию copyText(), получает правильную строку и запускает без ошибок, однако он не может редактировать мой буфер обмена. При вызове этой функции из консоли с точно такой же строкой она работает, и при создании кнопки stati c для копирования цвета, например:

<button onclick="copyText('hi')">hi</button>

затем это тоже хорошо работает. Я также попытался динамически добавить одну из этих кнопок:

+ '<button onclick="copyText(\'hi\')">hi</button>' в мой код, который внедряет HTML, и он не работает.

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

Наконец, я попытался присвоить кнопкам динамические c идентификаторы, например:

'<button id="copy-btn-'+ nextID +'" et c ...

Где nextID - это значение I инкремент, и я немедленно добавляю прослушиватель onclick для этой указанной c кнопки после ее создания:

$('#copy-btn-'+nextID).click(function() {
    copyText('hello');
});
nextID++;

Я попытался создать новую функцию копирования, которая принимает только строку, и вместо передачи элемент Я просто передаю копируемую строку:

function copyColorNew(hex) {
    console.log('copyText("' + hex + '")' );
    copyText(hex);
}

и вот соответствующая часть вставленного кода кнопки:

onclick="copyColorNew(\''+hex+'\');">

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

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

У меня совершенно нет идей, и я тратил несколько часов в день на несколько дней на эту проблему. Я хорошо знаю, как скопировать строку в javascript, я хорошо знаю, как создать кнопку и добавить ее динамически, и я хорошо знаю, как назначить кнопке прослушиватель по щелчку, который передает себя как параметр. У меня не было проблем с этими вещами в прошлом, и я до сих пор не везде в этом коде, как я подробно описал выше.

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

Еще раз, кнопки на странице stati c HTML могут правильно копировать «привет мир», динамически вставленные не могут скопировать «привет мир».

1 Ответ

0 голосов
/ 01 марта 2020

Используя API буфера обмена (предложенный u / elmstfredd ie на Reddit ):

navigator.clipboard.writeText(hex);

Я получил его на работу. Я заменил copyText(hex); на navigator.clipboard.writeText(hex); в моей функции copyColor().

Вот ссылка на документы .

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