Flash olmadan panoya kopyala


90

Panoya kopyalamak için birçok çözüm buldum, ancak hepsi ya flash ile ya da web siteleri için. Otomatik olarak panoya, flash olmadan ve kullanıcı tarafı için yöntem kopyasını arıyorum, bu kullanıcı komutları ve tabii ki çapraz tarayıcı için.


Hiç bulamadım, aynı şeyi arıyordum. Flash'ı kullanmak istediniz mi, bu nedenle oluşturmadan önce bu özellik kaldırıldı.
eugeneK


1
FLASH kullanmadan çeşitli tarayıcılarda yapabileceğinizden şüpheliyim. Ancak, sıfır oklipboard
Rakesh Sankar

Rakesh - "somut çözümünüz" Flash'a dayalıdır. Kullandığım hiçbir tarayıcıda çalışmayacak.
RobG

1
stackoverflow.com/questions/400212/… ' deki @wizztjh yöntemi site tarafı içindir, kullanıcı tarafı için değil @Rakesh zeroclipboard iyidir ancak tamamen Flash olmadan bir yöntem bulmak istiyorum
Black_Sun

Yanıtlar:


31

Flash olmadan çoğu tarayıcıda mümkün değildir. Kullanıcının panosu, parolalar veya kredi kartı numaraları gibi şeyler içerebileceğinden güvenlikle ilgili bir kaynaktır. Bu nedenle, tarayıcılar haklı olarak Javascript erişimine izin vermez (bazıları, kullanıcının onayladığını gösteren bir uyarı ile veya imzalı Javascript kodu ile izin verir, ancak bunların hiçbiri çapraz tarayıcı değildir).


21
Yani belki sayfalar panodan okunmamalı, ama neden yazılmasın? = /
Ajedi32

5
Peki neden sıfır kullanıcı bildirimi ve geri bildirimi içeren gizli bir flaşla gerçekleşmesine izin verelim?
Eric Grange

3
@EricGrange: Çünkü 1990'ların ortalarında Netscape'teki biri, performans nedenleriyle tarayıcı eklentilerinin yerel ikili dosyalar olacağına ve bu nedenle hemen hemen her şeyi yapabileceğine karar verdi. Çevrimiçi dünya o zamanlar çok basit bir yerdi ve güvenlik o kadar da önemli değildi.
Michael Borgwardt

4
Bu cevap 2011'de doğru olsa da, tarayıcılar flash'ı öldürme mücadelesinde uzun bir yol kat ettiler. Lütfen aşağıdaki cevabıma bakın.
Hovis Biddle

25

Flash çözümünü denedim ve ben de beğenmedim. Çok karmaşık ve çok yavaş. Yaptığım şey bir metin alanı oluşturmak, verileri oraya koymak ve tarayıcının "CTRL + C" davranışını kullanmaktı.

JQuery javascript bölümü:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

HTML bölümü:
<textarea id="textArea1"></textarea>

Şimdi, kopyalamak istediğiniz şeyi yazın 'METİNİ KOPYALAMAK İÇİN BURAYA KOYUN. BİR İŞLEV OLABİLİR. ' alan. Benim için iyi çalışıyor. Sadece bir CTRL + C kombinasyonu yapmalısınız. Tek dezavantajı, sitenizde çirkin bir metin alanına sahip olmanızdır. Style = "display: none" kullanırsanız, kopyalama çözümü çalışmayacaktır.


6
Bu, yalnızca Ctrl + C işlevini bir javascript işlevine bağlar ve verileri işletim sistemi panosuna yerleştirmez.
Ishmael

elbette, fikir bu. Tarayıcının sizin için kopyasını yapın. Burada benzer bir çözüm var: knockoutjs.com/examples/clickCounter.html . Çift tıkladığınızda, içerikle javascript ile bir metin alanı oluştururlar.
Julio Saito

osx'te benim için çalışmadı, bu yüzden e.metaKeykeydown karşılaştırmasına ekledim , ancak bazı nedenlerden dolayı kopyalama eylemi tetiklenmiyor. Bu keman görün: jsfiddle.net/gableroux/gta67/1
GabLeRoux

2
@GabLeRoux Safari'de kopyalama işlevi yalnızca metin seçildiğinde etkinleştirilir. Bu daha önce işe yaradı, ancak yakın zamanda safariye yapılan bir güncelleme onu durdurdu. Görünüşe göre tuşa basma olayı çağrıldıktan sonra metni seçmek artık o tarayıcıda kesmiyor. Yine de kromda iyi çalışıyor. Oh pekala, sadece o tarayıcı için flash kullanmaya geri dönmek zorunda kalabilir ....
Aran Mulholland

Bunun gibi. Görmeniz gerekmeyen bir öğeyi gizleyemediğinizde (herhangi bir nedenle), padding-bottom: -1000 gibi başlangıçtan her zaman uzağa koyabilirsiniz.
m3nda



3

İken sabırsızlıkla bekleyen bir Xbrowser desteği için Pano API ...


Bu, Chrome, Firefox, Edge, IE'de güzelce çalışacak

IE , kullanıcıdan Pano'ya yalnızca bir kez erişmesini ister.
Safari (yazma sırasında 5.1) şunları desteklemez execCommand:copy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

(Sadece yazın mim üstesinden gelebiliyor Firefox dışındaki tüm tarayıcılar "plain/text"Ive'sınav kadarıyla) var uygulanmadı Pano API . Yani, Chrome'da pano olayını okumaya çalışıyorum

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

atar: Yakalanmamış TypeError: Illegal yapıcı

Tarayıcılar ve Pano arasında meydana gelen inanılmaz karmaşanın en iyi kaynağı burada görülebilir (caniuse.com) (→ "Notlar" altındaki yorumları takip edin ).
MDN , yanlış olan tüm tarayıcılar için temel desteğin "(EVET)" olduğunu söylüyor, bu da en azından API'nin çalışmasının beklenmesine neden oluyor.


1

HTML sayfasına yerel bir pano kullanabilirsiniz. Bu, HTML sayfası İÇİNDEKİ içeriği kopyalamanıza / kesmenize / yapıştırmanıza izin verir, ancak üçüncü taraf uygulamalarından / uygulamalarından veya iki HTML sayfası arasında değil.

Bunu yapmak için özel bir işlevi şu şekilde yazabilirsiniz (Chrome ve Firefox'ta test edilmiştir):

İşte bunu nasıl yapabileceğinizi gösteren FIDDLE .

Ayrıca referans için kemanı buraya yapıştıracağım.


HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();

Hey mtBrona. Bunun için biraz jsfiddle eklemenin bir yolu var mı? Etkinleştirilemiyor
neoswf

Burada
elemnt

Bu işe yarıyor, sadece aynı içindesin window. Bu var gerçek Pano değil OS ve başka bir tarayıcı sekmesine kullanılabilir. Ayrıca seçim select()basitçe ve kullanılarak da yapılabilirwindow.getSelection()
Roko C. Buljan

0

document.execCommand('copy')ne istersen yapacak. Ancak bu iş parçacığında doğrudan kullanılabilecek hiçbir örnek yoktu, işte burada:

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')

-2

Bunun yolu yok, flaş kullanmak zorundasın. Bir flash (swf) dosyası kullanarak tarayıcılar arası kopyalama ve yapıştırma sağlayan jquery.copy adlı bir JQuery eklentisi var . Bu, blogumdaki sözdizimi işaretleyicinin nasıl çalıştığına benzer.

Jquery.copy.js dosyasına başvurduğunuzda, verileri panoya göndermek için yapmanız gereken tek şey aşağıdakileri çalıştırmaktır:

$.copy("some text to copy");

Güzel ve kolay ;)


Bağlantı kesildi (dosyalar artık indirilemiyor)
SeinopSys
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.