JS copy функция должна быть нажата дважды, чтобы работать - PullRequest
0 голосов
/ 24 июня 2019

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

Каждый узел выбирается, отмечая флажки, которые пользователь хочет скопировать, и затем нажимая «копировать».Затем скопированные данные можно вставить в Excel или аналогичные.

HTML:

<li id="copy">
   <a title="Copy Contents Of Records" data-source="dbTable" href="#" ng-click="copyRow($event)" ng-class="{'disabled' : ShowLoading}"><i class="fa fa-paste"></i></a>
</li>

JAVASCRIPT:

$scope.copyRow = function ($event) {
    $event.preventDefault();

    let head = [];
    angular.forEach($scope.data.objColumns,
        function (col) {
            head.push(col.strColumnName);
        });

    let rows = [];
    angular.forEach($scope.data.objColumnData,
        function (item) {
            if (item.bolSelected) {
                let row = [];
                angular.forEach(item.columnData,
                    function (data) {
                        row.push(data.strColumnDisplayValue);
                    });
                rows.push(row);
            }
        });

    let virtualTable = document.createElement('table');
    virtualTable.id = "virTab";

    // For table head
    for (let i = 0; i < head.length; i++) {
        let th = document.createElement('th');
        th.innerHTML = head[i];
        virtualTable.appendChild(th);
    }

    // For table body
    for (let i = 0; i < rows.length; i++) {
        console.log(rows[i]);
        let tr = document.createElement('tr');
        for (let j = 0; j < rows[i].length; j++) {
            let td = document.createElement('td');
            td.innerHTML = rows[i][j];
            td.removeAttribute('style');
            tr.appendChild(td);
        }
        tr.removeAttribute('style');
        virtualTable.appendChild(tr);
    }
    virtualTable.removeAttribute('style');
    document.body.appendChild(virtualTable);

    // Invoke copying function
    let textRange;
    if (isIE()) {
        textRange = document.body.createTextRange();
        textRange.moveToElementText(document.getElementById('virTab'));
        textRange.execCommand("copy");
    } else {
        textRange = document.createRange();
        textRange.selectNode(document.getElementById('virTab'));
        window.getSelection().addRange(textRange);
        const success = document.execCommand('copy');
        let msg = success ? 'Success' : 'Failure';
        console.log(msg);
        window.getSelection().removeAllRanges();
    }

1 Ответ

0 голосов
/ 27 июня 2019

Проблема заключалась в том, что выбор должен быть очищен до:

textRange.selectNode(document.getElementById('virTab'));

Решение было добавить

window.getSelection().removeAllRanges();

к началу оператора 'else'.

...