JQuery kullanarak metin seçimi nasıl devre dışı bırakılır?


198

JQuery veya jQuery-UI, belirli belge öğeleri için metin seçimini devre dışı bırakma işlevine sahip mi?



@John: Yukarıdaki bağlantı sorunuzu cevaplıyor mu? Değilse, durumunuzun nasıl farklı olduğu konusunda biraz daha ayrıntılı bilgi vermek isteyebilirsiniz.
Jørn Schou-Rode

1
Evet öyle. Ancak cevap aynı olsa da, bu soru çok spesifiktir, bu yüzden çoğu kişi (daha önce yaptığım gibi) daha genel bir soruya sahip olan cevabı kaçırabilir.
Dawid Ohia

@Jhon: Diğer sorunun da jQuery çözümü var.
Omar Abid

Yanıtlar:


274

JQuery 1.8'de bu aşağıdaki gibi yapılabilir:

(function($){
    $.fn.disableSelection = function() {
        return this
                 .attr('unselectable', 'on')
                 .css('user-select', 'none')
                 .on('selectstart', false);
    };
})(jQuery);

1
JavaScript alternatifi yalnızca IE için çalışır. "onselectstart" diğer tarayıcılar için mevcut değildir
Omar Abid

13
@Omar: Bunun farkındayım.
SLaks


11
Bunun için teşekkürler. Sürükleme kaydırıcısı üzerinde çalışıyordum ve metin sürecinde seçilmeyecek bir yol gerekiyordu.
Spencer Ruport

35
Metin seçimini (veya bu konuda SO'da başka bir şeyi) devre dışı bırakmak için "sadece yapma" diyenlere, zihinlerinizi biraz açın. Çoğu zaman insanlar, içindeki bir etiketin çift tıklanmasıyla metin seçiminden kaçınmak gibi estetik nedenlerden dolayı devre dışı bırakırlar. sadece genel bir fikir çizmeyin.
dudewad

102

JQuery kullanıcı arabirimi kullanıyorsanız, bunun için bir yöntem vardır, ancak yalnızca fare seçimini işleyebilir (yani CTRL+ Ahala çalışıyor):

$('.your-element').disableSelection(); // deprecated in jQuery UI 1.9

JQuery kullanıcı arabirimini kullanmak istemiyorsanız, kod gerçekten basittir:

$(el).attr('unselectable','on')
     .css({'-moz-user-select':'-moz-none',
           '-moz-user-select':'none',
           '-o-user-select':'none',
           '-khtml-user-select':'none', /* you could also put this in a class */
           '-webkit-user-select':'none',/* and add the CSS class here instead */
           '-ms-user-select':'none',
           'user-select':'none'
     }).bind('selectstart', function(){ return false; });

1
jquery ui işlevi harika olurdu, ancak aynı düzeyde koruma sunmuyor, bir şeyleri doğrudan seçmeyi engellemiyor, ancak başka bir dom nesnesinden bir seçim yapıyorsanız, css kurallarına da ihtiyacınız var - işlev heres = function () {return this.bind (($ .support.selectstart? "selectstart": "mousedown") + ".ui -ctivSelection", işlev (olay) {event.preventDefault ();}); }
chrismarx

2
CopySelection () yönteminin jQuery UI 1.9
mar10

Ayrıca tarayıcınıza bağlı olarak .on ('mousedown', false) işlevini de gerektirebilir. Hovewer, varsayılan olarak fareyle üzerine gelme olaylarını öldürmek tehlikelidir çünkü bu muhtemelen mevcut işlevselliği frenleyebilir
Dan

1
Arg. Amortismana tabi olmak can sıkıcı bir durum. Bunu meşru bir şekilde istediğinizde çok zaman var.
Chuck Le Butt

Bazı bağlantı metninde sağ tıklama bağlam menüsü oluşturuyorum ve metnin tıklandığında seçilmesini istemiyorum. Evet, @Monk, bu meşru bir örnek olarak nitelendirilir.
Wayne Smallman

75

Bu cevabı ( Metin Tablosunun Vurgulamasını Önle ) en yararlı buldum ve belki de IE uyumluluğu sağlamanın başka bir yolu ile birleştirilebilir.

#yourTable
{
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  user-select: none;
}

Chrome, -webkit-user-select kullanır
tim

3
Genel olarak jQuery veya JS kullanmak yerine her zaman CSS yöntemini takdir edin. Tıpkı jQuery animasyonları ve CSS geçişleri gibi, tarayıcıda oluşturulan yol her zaman en iyi ve en verimli olacak.
Brian Leishman

17

Bağlantı kesme seçimi ve bazı kısayol tuşlarının iptal edilmesi için daha kapsamlı bir çözüm ( Ctrl+ ave Ctrl+ gibi c. Test: Cmd + ave Cmd+ c)

(function($){

  $.fn.ctrlCmd = function(key) {

    var allowDefault = true;

    if (!$.isArray(key)) {
       key = [key];
    }

    return this.keydown(function(e) {
        for (var i = 0, l = key.length; i < l; i++) {
            if(e.keyCode === key[i].toUpperCase().charCodeAt(0) && e.metaKey) {
                allowDefault = false;
            }
        };
        return allowDefault;
    });
};


$.fn.disableSelection = function() {

    this.ctrlCmd(['a', 'c']);

    return this.attr('unselectable', 'on')
               .css({'-moz-user-select':'-moz-none',
                     '-moz-user-select':'none',
                     '-o-user-select':'none',
                     '-khtml-user-select':'none',
                     '-webkit-user-select':'none',
                     '-ms-user-select':'none',
                     'user-select':'none'})
               .bind('selectstart', false);
};

})(jQuery);

ve çağrı örneği:

$(':not(input,select,textarea)').disableSelection();

jsfiddle.net/JBxnQ/

Bu aynı zamanda FireFox'un eski sürümleri için yeterli olmayabilir (hangisini söyleyemem). Tüm bunlar işe yaramazsa aşağıdakileri ekleyin:

.on('mousedown', false)

3
Neden attr('unselectable', 'on')iki kez araıyorsun? Bir yazım hatası mı yoksa yararlı mı?
KajMagnus

Bu benim için harika çalıştı, ancak ".each (function () {$ (this) .attr ('seçilemez', 'on') .bind ('selectstart', function () {return false;} );}); " belirli web uygulaması (JQuery Mobile) için bölüm, sadece herkese yardımcı olur ..
Anthony

13

Aşağıdakiler, tüm yaygın tarayıcılarda (IE, Chrome, Mozilla, Opera ve Safari) tüm sınıf 'öğesi' seçimini devre dışı bırakır:

$(".item")
        .attr('unselectable', 'on')
        .css({
            'user-select': 'none',
            'MozUserSelect': 'none'
        })
        .on('selectstart', false)
        .on('mousedown', false);

1
Karmaşık değil - Mükemmel! Teşekkür ederim. Engelliler için; Ben ( 'özürlü', 'sakat') .attr addded
özgür irade

Güncelleme: .attr ('devre dışı', 'devre dışı') yerine .attr ('salt okunur', 'salt okunur') kullandım. Devre Dışı, model değişkenimi MVC'de göndermeyi engeller (model değişkeni null). Readonly hala bakmayı devre dışı bıraktı (bootstrap kullanıyorum) ve öğe değerini yayınlamaya izin veriyor
freewill

Mükemmel bro i değiştirmek için bu kodu kullanarak "işaretçi-olayları: none;", yani 11. Saygılarımızla IE değil çalışma
Shortys Oberto Dutari

8
        $(document).ready(function(){
            $("body").css("-webkit-user-select","none");
            $("body").css("-moz-user-select","none");
            $("body").css("-ms-user-select","none");
            $("body").css("-o-user-select","none");
            $("body").css("user-select","none");
        });

Koda ek olarak cevabın kısa bir özetini yazabilir misiniz?
jonsca

6

Bu, JavaScript kullanılarak kolayca yapılabilir Bu, tüm Tarayıcılar için geçerlidir

<script type="text/javascript">

/***********************************************
* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/

function disableSelection(target){
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false}
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox
    target.style.MozUserSelect="none"
else //All other route (For Opera)
    target.onmousedown=function(){return false}
target.style.cursor = "default"
}
 </script>

Bu işlevi çağırın

<script type="text/javascript">
   disableSelection(document.body)
</script>

Bu harika! Fakat "odaklanmayı" nasıl durdurabiliriz?
mutanic

3
Bu cevabın 2013
Dan

6

Bu aslında çok basit. Metin seçimini devre dışı bırakmak (ve ayrıca metni sürüklemek için tıklayın (örneğin Chrome'da bir bağlantı)), aşağıdaki jQuery kodunu kullanmanız yeterlidir:

$('body, html').mousedown(function(event) {
    event.preventDefault();
});

Tüm bunlar, farenizle ( mousedown()) tıkladığınızda varsayılanınbody ve htmletiketlerinde . Çok kolayca sadece (iki tırnak arasına-örneğin değişikliği metnini değiştirerek eleman değiştirebilir $('body, html')için $('#myUnselectableDiv')yapmak myUnselectableDivdiv, iyi, unselectable olmak.

Bunu size göstermek / kanıtlamak için hızlı bir snippet:

$('#no-select').mousedown(function(event) {
  event.preventDefault();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="no-select">I bet you can't select this text, or drag <a href="#">this link</a>, </span>
<br/><span>but that you can select this text, and drag <a href="#">this link</a>!</span>

Bu efektin mükemmel olmadığını ve tüm pencereyi seçilemez hale getirirken en iyisini gerçekleştirdiğini lütfen unutmayın. Ayrıca eklemek isteyebilirsiniz

bazı kısayol tuşlarının iptal edilmesi ( Ctrl+ave gibi Ctrl+c. Test: Cmd+a veCmd+c )

ayrıca Vladimir'in cevabının yukarıdaki bölümünü kullanarak. (görevinden almak burada )


1

KROM için 1 hat çözümü:

body.style.webkitUserSelect = "none";

ve FF:

body.style.MozUserSelect = "none";

IE "seçilemez" özniteliğinin ayarlanmasını gerektirir (ayrıntılar alt kısımdadır).

Bunu Chrome'da test ettim ve işe yarıyor. Bu özellik devralınır, böylece gövde öğesinde ayarlanması tüm belgenizdeki seçimi devre dışı bırakır.

Ayrıntılar burada: http://help.dottoro.com/ljrlukea.php

Closure kullanıyorsanız, şu işlevi çağırmanız yeterlidir:

goog.style.setUnselectable(myElement, true);

Tüm tarayıcıları şeffaf bir şekilde yönetir.

IE olmayan tarayıcılar şu şekilde işlenir:

goog.style.unselectableStyle_ =
    goog.userAgent.GECKO ? 'MozUserSelect' :
    goog.userAgent.WEBKIT ? 'WebkitUserSelect' :
    null;

Burada tanımlanmıştır: http://closure-library.googlecode.com/svn/!svn/bc/4/trunk/closure/goog/docs/closure_goog_style_style.js.source.html

IE kısmı şu şekilde ele alınır:

if (goog.userAgent.IE || goog.userAgent.OPERA) {
// Toggle the 'unselectable' attribute on the element and its descendants.
var value = unselectable ? 'on' : '';
el.setAttribute('unselectable', value);
if (descendants) {
  for (var i = 0, descendant; descendant = descendants[i]; i++) {
    descendant.setAttribute('unselectable', value);
  }
}

1

Bu kodun tüm tarayıcılarda çalıştığını ve en az ek yükü gerektirdiğini düşünüyorum . Gerçekten yukarıdaki tüm cevapların bir melezi. Bir hata bulursanız bana bildirin!

CSS ekle:

.no_select { user-select: none; -o-user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -ms-user-select:none;}

JQuery ekle:

(function($){
    $.fn.disableSelection = function() 
    {       
        $(this).addClass('no_select');              
        if($.browser.msie)
        {
            $(this).attr('unselectable', 'on').on('selectstart', false);            
        }
    return this;            
};
})(jQuery);

İsteğe bağlı: Tüm alt öğeler için de seçimi devre dışı bırakmak için IE bloğunu şu şekilde değiştirebilirsiniz:

$(this).each(function() {
    $(this).attr('unselectable','on')
    .bind('selectstart',function(){ return false; });
});

Kullanımı:

$('.someclasshere').disableSelection();

1

Tüm yaklaşımları denedim ve bu benim için en basit çünkü IWebBrowser2 kullanıyorum ve 10 tarayıcı ile uğraşmak yok:

document.onselectstart = new Function('return false;');

Benim için mükemmel çalışıyor!


0

Bunun bir çözümü, uygun durumlar <button>için, seçilmesini istemediğiniz metin için a kullanmaktır . Bir clickmetin bloğundaki olaya bağlama yapıyorsanız ve bu metnin seçilebilir olmasını istemiyorsanız, bunu bir düğme olarak değiştirmek anlambilimi iyileştirecek ve metnin seçilmesini engelleyecektir.

<button>Text Here</button>

-1

En iyi ve en basit şekilde buldum, ctrl + c'yi önler, sağ tıklama. Bu durumda her şeyi engelledim, bu yüzden hiçbir şey belirtmem gerekmiyor.

$(document).bind("contextmenu cut copy",function(e){
    e.preventDefault();
    //alert('Copying is not allowed');
});
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.