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?
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?
Yanıtlar:
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.
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)
keydown
ve keyup
işleyicileri document
? $(".no-copy-paste").keydown
İşleyicide Ctrl tuşunu test edebilirsiniz . Ayrıca, e.keyCode || e.which
bite gerek yok : e.keyCode
çalışan tüm tarayıcılarda e.which
çalışır, bu yüzden e.which
asla kullanılmayacaktır. Belki de bir keypress
olaydan 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.
e.metaKey
ya da e.ctrlKey
olmak daha iyi olacağını düşünüyorum true
.
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/
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.ctrlKey
Mac 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.ctrlKey
sonra eg c olayında kullanmaktır . Ctrlbasılı tutun. Ben de ikame ettik ctrlKey
ile metaKey
Mac'ler için.
Bu yöntemin sınırlamaları:
edit
-> copy
örn Firefox'ta menü öğesi hala kopyalama / yapıştırma izin verebilir.: Bunu yapmanın bir başka yolu onpaste
, oncopy
ve oncut
bu 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 Edit
menü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 .
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!');
}
});
});
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;
}
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.
}
}
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.
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();
});
Başka bir yaklaşım (eklenti gerekmez), yalnızca geçirilen olay nesnesininctrlKey
özelliğini kullanmasıdır . OlayCtrl sırasında basıldığını gösterir , şöyle:
$(document).keypress("c",function(e) {
if(e.ctrlKey)
alert("Ctrl+C was pressed!!");
});
Ayrıca bkz. Jquery: keypress, ctrl + c (veya bunun gibi birleşik) .
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
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ı.
paste
sürüm 3'ten önce tüm Firefox sürümlerini içeren bir olayı olmayan tarayıcılarda çalışmaz . İkincisi, window.clipboardData
sadece IE ve IE'de varsayılan olarak devre dışı olduğuna inanıyorum . Üçüncü olarak, keydown
Ctrl 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.