2015-01-22 4 views
0

Я не уверен на 100%, как описать это, поэтому я просто вставлю три части соответствующего кода.document.execCommand ('copy') на объектах не в DOM?

Я могу это сделать:

var dl = $('<a>',{ 
    style: 'display: none', 
    download: this.name + '.txt', 
    href: window.URL.createObjectURL(data, {type: "octet/stream"})) 
}); 
dl[0].click(); 

и я могу это сделать:

copydeck = $("<textarea>").val(this.list.join("\r\n")); 
$('body').append(copydeck); 
copydeck.select(); 
document.execCommand('copy'); 
copydeck.remove(); 

Но я не могу это сделать:

copydeck = $("<textarea>").val(this.list.join("\r\n")); 
copydeck[0].select(); 
document.execCommand('copy'); 

Почему? Что мне здесь не хватает? Я не могу выбрать или скопировать элементы не в DOM? Есть ли способ сделать это, не добавляя объект в тело?

+0

'document'.execCommand ('copy') должен быть неявным. – Hacketo

+0

Я предполагаю, что вы не можете «копировать» из элементов, которые еще не существуют в DOM. – Cerbrus

+0

'copydeck [0] .remove();' - поскольку вы никогда не добавляли элемент нигде, его некуда удалить. И за исключением очень современных браузеров, вы не хотите этого '[0]'. Вы хотите, чтобы jquery 'remove', а не DOM. Но только если вы действительно положили его в DOM. –

ответ

2

Почему? Что мне здесь не хватает?

textarea не в document, поэтому вызов document.execCommand('copy') не будет работать на нем. Помните, что может быть несколько документов (связанных с различными окнами, например iframes), и до тех пор, пока элемент не будет в документе, он ... не находится в документе.

Возможно, вы можете добавить textarea, выдать команду, а затем удалить ее, не вызывая никаких изменений на дисплее. Тем не менее, для меня, используя Chrome в Linux, ваш код не копирует ничего в буфер обмена (начинаю ли я с textarea в DOM или добавляю его динамически позже), даже если я поместил его в обработчик click (например, непосредственно реагируя на событие пользователя).

+0

Код работает с использованием расширения chrome с разрешениями буфера обмена, для чего он нужен. Блок кода в середине выполняется так же, как вы описали. Почему я могу нажимать объекты не в документе, но не копировать их? – Thirk

+0

@Thirk: Ах, это объясняет вещь в буфере обмена. Так что да, опять же, если вы не добавите элемент в документ, который вы вызываете 'execCommand', документ не знает об этом и не может его скопировать. Поэтому вам придется добавить и удалить его. –

+0

@Thirk: * «Почему я могу щелкнуть объекты не в документе, но не скопировать их?» * Поскольку в сценарии щелчка вы запускаете событие на самом элементе; в сценарии копирования вы вызываете метод 'document', и этот документ, по-видимому, применяет эту команду только к элементам на самом деле в своем дереве. –

Смежные вопросы