Frage Kann `document.execommand ('copy');` nicht von der Entwicklerkonsole verwenden


Berufung document.execommand ('copy'); von der Chrome-Entwicklerkonsole zurück false jedes Mal.

Probieren Sie es selbst aus. Öffne die Konsole und führe sie aus, sie ist nie erfolgreich.

Irgendeine Idee warum?

enter image description here


18
2017-10-24 17:21


Ursprung


Antworten:


document.execCommand('copy') muss vom Benutzer ausgelöst werden. Es ist nicht nur von der Konsole, es ist irgendwo, dass nicht in einem Ereignis durch den Benutzer ausgelöst wird. Siehe unten, das click-Ereignis wird true zurückgeben, aber ein Aufruf ohne Ereignis wird nicht ausgeführt und auch ein ausgelöstes Ereignis wird nicht aufgerufen.

console.log('no event', document.execCommand('bold'));

document.getElementById('test').addEventListener('click', function(){
    console.log('user click', document.execCommand('copy'));
});

document.getElementById('test').addEventListener('fakeclick', function(){
    console.log('fake click', document.execCommand('copy'));
});


var event = new Event('fakeclick')

document.getElementById('test').dispatchEvent(event) ;
<div id="test">click</ha>

Siehe hier:https://w3c.github.io/editing/execCommand.html#dfn-the-copy-command

Kopierbefehle, die von document.execommand () ausgelöst werden, haben nur Auswirkungen   der Inhalt der realen Zwischenablage, wenn das Ereignis von einem   Ereignis, das vertrauenswürdig ist und vom Benutzer ausgelöst wird, oder wenn der   Die Implementierung ist so konfiguriert, dass dies möglich ist. Wie Implementierungen sein können   konfiguriert, um Schreibzugriff auf die Zwischenablage zu ermöglichen, liegt außerhalb des Bereichs   dieser Spezifikation.


28
2017-10-24 17:35



Als Alternative verwenden Sie die copy() Befehl, der in den Chrome Dev-Tools integriert ist. Sie können nicht verwenden document.execCommand("copy") weil das eine Benutzeraktion erfordert, um es auszulösen.

Das copy() Mit dem Befehl können Sie eine beliebige Zeichenfolge (oder ein Objekt als JSON) kopieren. Emulieren document.execCommand("copy") Sie können die aktuelle Auswahl mit erhalten getSelection().toString():

copy(getSelection().toString())

screen shot

Wenn Sie tatsächlich testen müssen document.execCommand("copy") speziell (um beispielsweise ein Skript zu debuggen, das es verwendet) und die Verwendung des Debuggers aus irgendeinem Grund nicht ideal ist, können Sie Ihren Code in einen Klick-Handler einfügen und dann auf Ihre Seite klicken:

document.body.addEventListener("click", function() {
    console.log("copy", document.execCommand("copy"));
}, false);

5
2017-10-24 17:25



Ich glaube, copy Befehl muss den Fokus auf den Browser haben, und wenn Sie zu Konsole wechseln und den Befehl ausführen, verliert das aktuelle Fenster den Fokus. Aber könnte andere Gründe haben, wie es funktionierte, wenn ich nachgab setTimeout().


2
2017-10-24 17:24



Diese Methode funktioniert in der neuesten Safari-Version

const copyUrl = (url, cb) => {
  try {
    var input = document.getElementById('copyInput')
    input.value = url
    input.focus()
    input.select()
    if (document.execCommand('copy', false, null)) {
      Message('复制成功')
    } else {
      Message({
        message: '当前浏览器不支持复制操作,请使用Ctrl+c手动复制',
        type: 'warning'
      })
    }
  } catch (e) {
    Message({
      message: `复制出错:${e}`,
      type: 'error'
    })
  }
}

0
2017-07-27 02:25