JavaScript kullanarak Ctrl + V, Ctrl + C nasıl algılanır?


173

Javascript kullanarak ctrl+ v, ctrl+ nasıl calgılanır?

Benim textareas yapıştırma kısıtlamak gerekir, son kullanıcı içeriği kopyalayıp yapıştırmamalı, kullanıcı sadece textarea metin yazmalısınız.

Bunu nasıl başarabilirim?


3
Bunun amacı ne? Aklıma gelen iki meşru senaryo, parola alanları (yine de kopyalayamazsınız) ve bir yazma hızı testidir. Eminim ki hızlı yazmayı şüpheyle tespit edebilirsiniz.
Paul Butcher

9
@Paul Butcher, @Propeng: Buna ihtiyacınız olan senaryolar var. Çok basit bir örnek: Yabancı dil öğrenmek için bir site. Kelimeleri kopyala ve yapıştır yerine el ile yazarsanız, öğrenme efekti artar.
back2dos

2
Başka bir meşru durum, hataları tespit etmek için çift girişin gerekli olduğu olabilir (örneğin, e-postanızı iki kez yazın, böylece içinde bir yazım hatası olmadığını biliyoruz). Yine de, böyle bir kullanıcı rastgele oluşturulmuş e-posta adreslerinin bir listesini tutabilir (örneğin sneakemail) ve muhtemelen doğruluk için yapıştırmak isteyebilir.
Paul Butcher

40
@Paul Kasap - bu hiç de meşru bir durum değil , bunu yapan sitelerden nefret ediyorum ve her zaman (uzun) e-posta adresimi bir girişten diğerine kopyalayıp yapıştırıyorum. Kopyalama / yapıştırma işleminin kırılması önemli bir kullanılabilirlik sorunudur. Kullanıcıyı gerçekten atar, çünkü zihinsel modelleri için o kadar temeldir ki "sadece çalışmasını" beklerler. Sanki bir kapıyı çekmeye çalıştın ve sana doğru değil, senden uzaklaştı!
EMP

4
Ne zaman böyle bir kopyasını bir sayfada izin vermezse, yaptığım şey, metni başka bir yere yapıştırın (URL çubuğunu kullanıyorum) ve sonra Ctrl + A (url'ye yapıştırılan metni seçin), metni sürükleyip bırakın. Göz atmanın devre dışı bırakıldığı göz atma alanında. Sanırım, bugün itibariyle önlenemeyen bir şey.
Janakiram

Yanıtlar:


180

Bunu sadece ilgisiz yaptım. Yapacağım doğru şey olmadığını kabul ediyorum, ama bence op'un kararı olmalı ... Ayrıca kod kolayca (daha gelişmiş bir pano veya Ctrl+ sbir sunucuyu tetiklemek gibi) almak yerine işlevsellik eklemek için genişletilebilir -Kaydet).

$(document).ready(function() {
    var ctrlDown = false,
        ctrlKey = 17,
        cmdKey = 91,
        vKey = 86,
        cKey = 67;

    $(document).keydown(function(e) {
        if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = true;
    }).keyup(function(e) {
        if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = false;
    });

    $(".no-copy-paste").keydown(function(e) {
        if (ctrlDown && (e.keyCode == vKey || e.keyCode == cKey)) return false;
    });
    
    // Document Ctrl + C/V 
    $(document).keydown(function(e) {
        if (ctrlDown && (e.keyCode == cKey)) console.log("Document catch Ctrl+C");
        if (ctrlDown && (e.keyCode == vKey)) console.log("Document catch Ctrl+V");
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h3>Ctrl+c Ctrl+v disabled</h3>
<textarea class="no-copy-paste"></textarea>
<br><br>
<h3>Ctrl+c Ctrl+v allowed</h3>
<textarea></textarea>

Ayrıca sadece açıklığa kavuşturmak için, bu komut dosyası jQuery kitaplığını gerektirir.

Codepen demosu

DÜZENLEME: Tim Down'ın önerisi sayesinde 3 yedek satır (e.which dahil) kaldırıldı (yorumlara bakın)

EDIT: Mac'ler için destek eklendi ( cmdyerine anahtar ctrl)


4
Neden keydownve keyupişleyicileri document? $(".no-copy-paste").keydownİşleyicide Ctrl tuşunu test edebilirsiniz . Ayrıca, e.keyCode || e.whichbite gerek yok : e.keyCodeçalışan tüm tarayıcılarda e.whichçalışır, bu yüzden e.whichasla kullanılmayacaktır. Belki de bir keypressolaydan nasıl karakter kodu aldığını düşünüyordun ? Son olarak, bu bağlamdaki macunlar veya düzenleme menüleri hakkında hiçbir şey yapmaz, ancak OP'nin doğrudan bu konuda soru sormadığını düşünüyorum.
Tim Down

@Tim: Belgedeki Ctrl anahtar işleyicileri geneldir - çünkü ctrlDown değişkeninin yalnızca kopyala yapıştırmayan giriş (ler) e bağlanmasını istemeyebilirler. Bu belki de OTT. E.which ipucu için teşekkürler - yarım saat beri e.keyCode ve e.which ile keydown () ve keypress () ve ne bir karışıklık (özellikle firefox) farklı kullanım durumlarını araştırmak için geçirdim!
jackocnr

1
jackocnr: Jan Wolter'ın JavaScript anahtar kullanma makalesini öneririm : unixpapa.com/js/key.html Bunu referans için birçok kez kullandım ve bir hata bulamadım.
Tim Down

3
Kanka! Teşekkürler! Bu, kullanıcıların yazdığım bir web uygulamasında bir "öğe" (takvim girdisi) seçebilmelerini sağlamak için gerekli olan şeydi, "kopyalamak" için ctrl + c tuşlarına, ardından "yapıştırmak" için ctrl + v tuşlarına basın. aslında yüce kutsanmış pano ile etkileşime giriyor. ctrl + c Ne tıklandıklarını hatırlıyorum, ctrl + v Çoğaltırım, herkes kazanır.
Dan F

2
Ben bir uzman ya da bir şey değilim, ama muhtemelen sayı değerlerini atamak ve anahtarları test etmek yerine test etmek e.metaKeyya da e.ctrlKeyolmak daha iyi olacağını düşünüyorum true.
sluther

52

Jquery ile fonksiyonu bağlayarak kolayca kopyala, yapıştır, vb.

$("#textA").bind('copy', function() {
    $('span').text('copy behaviour detected!')
}); 
$("#textA").bind('paste', function() {
    $('span').text('paste behaviour detected!')
}); 
$("#textA").bind('cut', function() {
    $('span').text('cut behaviour detected!')
});

Daha fazla bilgi burada: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/


1
Ne yazık ki, bu yöntem yalnızca metin seçilirse Firefox'ta
tetiklenir

44

Bir korsanlıkla mücadele tedbiri olarak kullanıldığında can sıkıcı olsa da, bunun meşru olacağı bazı durumlar olabileceğini görebiliyorum, bu yüzden:

function disableCopyPaste(elm) {
    // Disable cut/copy/paste key events
    elm.onkeydown = interceptKeys

    // Disable right click events
    elm.oncontextmenu = function() {
        return false
    }
}

function interceptKeys(evt) {
    evt = evt||window.event // IE support
    var c = evt.keyCode
    var ctrlDown = evt.ctrlKey||evt.metaKey // Mac support

    // Check for Alt+Gr (http://en.wikipedia.org/wiki/AltGr_key)
    if (ctrlDown && evt.altKey) return true

    // Check for ctrl+c, v and x
    else if (ctrlDown && c==67) return false // c
    else if (ctrlDown && c==86) return false // v
    else if (ctrlDown && c==88) return false // x

    // Otherwise allow
    return true
}

event.ctrlKeyMac OS X Ctrl/ Alt"aşağı" ve "yukarı" olaylarında çoğu tarayıcıda olduğu gibi anahtar kodunu kontrol etmek yerine kullandım , bu nedenle tetiklenmenin tek yolu anahtardan event.ctrlKeysonra eg c olayında kullanmaktır . Ctrlbasılı tutun. Ben de ikame ettik ctrlKeyile metaKeyMac'ler için.

Bu yöntemin sınırlamaları:

  • Opera, sağ tıklama etkinliklerinin devre dışı bırakılmasına izin vermiyor

  • Tarayıcı pencereleri arasında sürükle ve bırak özelliği bildiğim kadarıyla önlenemez.

  • edit-> copyörn Firefox'ta menü öğesi hala kopyalama / yapıştırma izin verebilir.

  • Ayrıca, farklı klavye düzenleri / yerel ayarları olan / kopyala / yapıştır / kes olan yerel kişiler için aynı tuş kodları olduğu garanti edilmez (düzenler genellikle İngilizce ile aynı standardı izler), ancak battaniye "tüm kontrol tuşlarını devre dışı bırak", tüm vb. devre dışı bırakılacak, bence bu yapılması gereken bir uzlaşma.

14

: Bunu yapmanın bir başka yolu onpaste , oncopyve oncutbu olayları iptal Opera olduğunu izin vermez, sadece önemli tarayıcı, olaylar kayıtlı ve (bazı küçük sorunları ile) IE, Firefox, Chrome, Safari iptal edilebilir.

Diğer cevabımda gördüğünüz gibi, Ctrl+ vve Ctrl+ 'nın durdurulması cbirçok yan etkiye sahiptir ve yine de kullanıcıların Firefox Editmenüsünü kullanarak yapıştırmalarını engellemez .

function disable_cutcopypaste(e) {
    var fn = function(evt) {
        // IE-specific lines
        evt = evt||window.event
        evt.returnValue = false

        // Other browser support
        if (evt.preventDefault) 
            evt.preventDefault()
        return false
    }
    e.onbeforepaste = e.onbeforecopy = e.onbeforecut = fn
    e.onpaste = e.oncopy = e.oncut = fn
}

Safari'nin bu yöntemle ilgili bazı küçük sorunları var (varsayılanı önlerken kes / kopyala panosunu temizler), ancak bu hata şimdi Chrome'da düzeltilmiş gibi görünüyor.

Daha fazla bilgi için ayrıca bkz. Http://www.quirksmode.org/dom/events/cutcopypaste.html ve ilgili test sayfası http://www.quirksmode.org/dom/events/tests/cutcopypaste.html .


9

Canlı Demo: http://jsfiddle.net/abdennour/ba54W/

$(document).ready(function() {

    $("#textA").bind({
        copy : function(){
            $('span').text('copy behaviour detected!');
        },
        paste : function(){
            $('span').text('paste behaviour detected!');
        },
        cut : function(){
            $('span').text('cut behaviour detected!');
        }
    });

}); 

8

Kullanıcının bağlam menüsünü kullanmasını, jQuery'de kopyalayıp kesmesini önleyen kısa çözüm:

jQuery(document).bind("cut copy contextmenu",function(e){
    e.preventDefault();
});

Ayrıca CSS'deki metin seçimini devre dışı bırakmak kullanışlı olabilir:

.noselect {  
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
     user-select: none;
}

4

ctrlKeyÖzelliği kullanırsanız, durumu korumanıza gerek yoktur.

   $(document).keydown(function(event) {
      // Ctrl+C or Cmd+C pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 67) {
         // Do stuff.
      }

      // Ctrl+V or Cmd+V pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 86) {
         // Do stuff.
      }

      // Ctrl+X or Cmd+X pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 88) {
         // Do stuff.
      } 
    }

Bu doğru cevap! Olaya bir tuşa basıldığında olayın ctrlKey = true özelliği vardır. Ek bir etkinliğe ihtiyacımız yok.
JanBrus

3

Tuş vuruşlarını yakalayan bir jQuery eklentisi yazdım. İşletim sistemi olmadan (fontlar hariç) html formlarında birden çok dil komut dosyası girişini etkinleştirmek için kullanılabilir. Yaklaşık 300 satır kod, belki bir göz atmak istersiniz:

Genel olarak, bu tür değişikliklere dikkat edin. Eklentiyi bir müşteri için yazdım çünkü diğer çözümler mevcut değildi.


3

Bu kodu , eylemlerini sağ tıklatma, CTRL+ C, CTRL+ V, CTRL+ Xalgılama ve önleme için kullanabilirsiniz

$(document).bind('copy', function(e) {
        alert('Copy is not allowed !!!');
        e.preventDefault();
    }); 
    $(document).bind('paste', function() {
        alert('Paste is not allowed !!!');
        e.preventDefault();
    }); 
    $(document).bind('cut', function() {
        alert('Cut  is not allowed !!!');
        e.preventDefault();
    });
    $(document).bind('contextmenu', function(e) {
        alert('Right Click  is not allowed !!!');
        e.preventDefault();
    });

3

onkeypress yerine onkeydown kullanın.

<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">


0

Unutmayın, Ctrl+ C/ tespit edebilir ve engelleyebilirsiniz V, ancak yine de belirli bir alanın değerini değiştirebilirsiniz.
Bunun en iyi örneği, Chrome'un Öğeyi Denetle işlevidir, bu, bir alanın değer özelliğini değiştirmenize olanak tanır.


0

zaten sorun var ve ben sadece kod kabul .. aşağıdaki kod ile çözüldü

$('#<%= mobileTextBox.ClientID %>').keydown(function(e) {
            ///// e.which Values
            // 8  : BackSpace , 46 : Delete , 37 : Left , 39 : Rigth , 144: Num Lock 
            if (e.which != 8 && e.which != 46 && e.which != 37 && e.which != 39 && e.which != 144
                && (e.which < 96 || e.which > 105 )) {
                return false;
            }
        });

Ctrlkimliği tespit edebilirsine.which == 17


-1

Tuşa basma olayını dinleyebilir ve belirli tuş kodlarıyla eşleşiyorsa varsayılan olayı (metni girerek) durdurabilirsiniz


-1

Önemli Not

e.keyCodeBir süre kullanıyordum ve ctrl+ tuşuna .bastığımda, ascii kodu .46 iken bu özniteliğin 190, yanlış bir sayı döndürdüğünü tespit ettim !

Yani e.key.toUpperCase().charCodeAt(0)yerine kullanmalısınız e.keyCode.


-4

Bunu önlemenin bazı yolları vardır.

Ancak kullanıcı her zaman javascript'i kapatabilir veya sayfanın kaynak koduna bakabilir.

Bazı örnekler (jQuery gerektirir)

/**
* Stop every keystroke with ctrl key pressed
*/
$(".textbox").keydown(function(){
    if (event.ctrlKey==true) {
        return false;
    }
});

/**
* Clear all data of clipboard on focus
*/
$(".textbox").focus(function(){
    if ( window.clipboardData ) {
        window.clipboardData.setData('text','');
    }
});

/**
* Block the paste event
*/
$(".textbox").bind('paste',function(e){return false;});

Düzenleme: Tim Down nasıl dedi, bu işlevlerin hepsi tarayıcı bağımlıları.


2
Bu bir takım sorunlar var: ilk olarak, pastesürüm 3'ten önce tüm Firefox sürümlerini içeren bir olayı olmayan tarayıcılarda çalışmaz . İkincisi, window.clipboardDatasadece IE ve IE'de varsayılan olarak devre dışı olduğuna inanıyorum . Üçüncü olarak, keydownCtrl tuşuna basıldığında tüm olayları devre dışı bırakmak aşırıdır: Ctrl-A (tümünü seç) ve Ctrl-Z (geri al) gibi yararlı klavye kısayollarını önlersiniz. Dördüncüsü, başkaları tarafından belirtildiği gibi, bu gerçekten çok kötü bir şey.
Tim Down

Her tarayıcıda işe yaramıyor. Kimse Ctrl bloğu gerçekten sinir bozucu. Bir istemci "Onay E-postası ve Parolası" alanını engellemek istediğinde bir kez kullanışlıdır.
Gustavo Cardoso
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.