нельзя использовать document.execCommand('copy') с файлом типа ввода

не может скопировать содержимое текстовой области в буфер обмена, используя приведенный ниже код.



    <script>
    function copyText()
    {
    document.getElementById('in').click();
    call();
    }
    function call()
    {
    if(getComputedStyle(document.getElementById('butt')).opacity>0.5)
    {setTimeout(call,100);return;}

    var ta=window.document.createElement("textarea");
    window.document.body.appendChild(ta);
    ta.value="this text should be in clipboard";
    ta.focus();
    ta.selectionStart=0;
    ta.selectionEnd=ta.value.length;
    ta.addEventListener('keypress', function(){window.document.execCommand('copy');});
    var event = new Event('keypress');
    ta.dispatchEvent(event) ;
    }
    </script>
    <button id='butt' onClick='copyText()'>copy text</button>
    <input id='in' type='file' style='display:none;'/>
    <style>
    #butt
    {opacity:0.5;}
    #butt:hover
    {opacity:1;}
    </style>

в то время как если я добавлю alert() после setTimeout(call,100) в блоке if перед оператором return.
Текст копируется.
попробовал на chrome,opera и firefox, все браузеры ответили одинаково.
Я использую приведенную выше структуру для копирования закодированного в base64 текста файла, открытого пользователем.


person vaibhav3027    schedule 30.01.2016    source источник


Ответы (1)


Большинство браузеров таким образом копируют текст в буфер обмена только из Javascript, который был непосредственно инициирован реальным пользовательским событием (например, щелчком или нажатием клавиши), а не из setTimeout(). Итак, если ваш код идет по пути setTimeout(), то, скорее всего, копирование текста в буфер обмена работать не будет. Вы не можете просто создать событие нажатия клавиши — весь смысл этого ограничения в том, чтобы требовать реального пользовательского события, а не созданного кодом.

Если вам интересно, вот проверенная функция для копирования текста в буфер обмена в этот ответ. У него те же ограничения, что и у любого другого кода — он должен инициироваться из Javascript, который вызывается реальным пользовательским событием, и работает в современных версиях Chrome, Firefox и IE, но не в Safari.

person jfriend00    schedule 30.01.2016