bagaimana cara memblokir atau membatasi karakter khusus dari kolom input dengan jquery?

115

Bagaimana cara memblokir karakter khusus agar tidak diketik ke dalam kolom input dengan jquery?

Nerd Stalker
sumber
Gunakan plugin jQuery Validation , dan izinkan hanya karakter alfanumerik.
Tomas Aschan

Jawaban:

133

Contoh sederhana menggunakan ekspresi reguler yang dapat Anda ubah untuk mengizinkan / melarang apa pun yang Anda suka.

$('input').on('keypress', function (event) {
    var regex = new RegExp("^[a-zA-Z0-9]+$");
    var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
    if (!regex.test(key)) {
       event.preventDefault();
       return false;
    }
});
Lembah
sumber
49
Ini tidak berfungsi untuk teks yang ditempel & juga dapat mencegah pengguna dari penekanan tombol non-teks seperti spasi mundur, tombol panah, dll.
bendytree
6
Ini tidak akan mengizinkan backspace di firefox
Alex
Tidak berfungsi untuk kata-kata bahasa Spanyol seperti: avión (pesawat), árbol (pohon), dll.
nikoskip
Tidak berfungsi di browser firefox terbaru, tetapi berfungsi dengan baik di chrome
Phoenix
Solusi ini berfungsi untuk saya pada elemen Bootstrap-TagsInput. Untuk mengatasi masalah paste, Anda cukup menambahkan "paste" ke daftar parameter event seperti ini: $ ('input'). On ('keypress, paste' ', () => ........
Jim22150
60

Saya mencari jawaban yang membatasi masukan hanya untuk karakter alfanumerik, tetapi masih diperbolehkan untuk penggunaan karakter kontrol (misalnya, spasi mundur, hapus, tab) dan salin + tempel. Tak satu pun dari jawaban yang diberikan yang saya coba memenuhi semua persyaratan ini, jadi saya datang dengan yang berikut menggunakan inputacara tersebut.

$('input').on('input', function() {
  $(this).val($(this).val().replace(/[^a-z0-9]/gi, ''));
});

Sunting:
Seperti yang ditunjukkan rinogo di komentar, potongan kode di atas memaksa kursor ke akhir masukan saat mengetik di tengah teks masukan. Saya yakin potongan kode di bawah ini menyelesaikan masalah ini.

$('input').on('input', function() {
  var c = this.selectionStart,
      r = /[^a-z0-9]/gi,
      v = $(this).val();
  if(r.test(v)) {
    $(this).val(v.replace(r, ''));
    c--;
  }
  this.setSelectionRange(c, c);
});
rexmac
sumber
1
+1 Saya menggulir ke bawah jawaban mencari jawaban seperti ini atau saya akan mengirimkan jawaban saya sendiri. Jawaban ini langsung menyaring karakter yang tidak diizinkan! Bagus!
emilhem
2
+1 Berfungsi untuk teks yang ditempel, tidak mengganggu ruang belakang FF dan tombol hapus, dan tidak bergantung pada event.whichatau event.keycode! Seandainya aku bisa +10!
rinogo
3
... TETAPI di Chrome dan IE, saat Anda mengetik karakter baru atau menggunakan spasi mundur dan tombol hapus di tengah teks masukan , kursor dipindahkan ke akhir teks ...: / Apakah ada solusi yang mudah untuk ini? Aku sangat ingin ini berhasil!
rinogo
Hampir saja ... kode ini memiliki perilaku yang sangat aneh di Chrome Seluler. Kursor melompat-lompat pada huruf pertama yang diketik dan pada spasi mundur juga.
Juliano
2
@Juliano Menarik, tampaknya selectionStart selalu mengembalikan 0 di Chrome Seluler terlepas dari posisi kursor / tanda sisipan saat ini. Saya tidak yakin (belum) apakah ini bug atau perilaku yang dimaksudkan. Saya sedang meneliti masalah ini dan akan memperbarui jawaban atau komentar saya di sini ketika saya mempelajari lebih lanjut.
rexmac
48

Jawaban singkat: cegah acara 'penekanan tombol':

$("input").keypress(function(e){
    var charCode = !e.charCode ? e.which : e.charCode;

    if(/* Test for special character */ )
        e.preventDefault();
})

Jawaban panjang: Gunakan plugin seperti jquery.alphanum

Ada beberapa hal yang perlu dipertimbangkan saat memilih solusi:

  • Teks ditempel
  • Karakter kontrol seperti backspace atau F5 dapat dicegah oleh kode di atas.
  • é, í, ä dll
  • Arab atau Cina ...
  • Kompatibilitas Lintas Browser

Saya pikir area ini cukup kompleks untuk menjamin penggunaan plugin pihak ketiga. Saya mencoba beberapa plugin yang tersedia tetapi menemukan beberapa masalah dengan masing-masing plugin sehingga saya melanjutkan dan menulis jquery.alphanum . Kodenya terlihat seperti ini:

$("input").alphanum();

Atau untuk kontrol yang lebih halus, tambahkan beberapa pengaturan:

$("#username").alphanum({
    allow      : "€$£",
    disallow   : "xyz",
    allowUpper : false
});

Semoga membantu.

KevSheedy
sumber
1
Hal-hal yang mengagumkan, kawan. Saya hanya perlu menambahkan opsi untuk mengaktifkan / menonaktifkan slash char ('/') karena tidak berfungsi saat meletakkannya di allowpengaturan. Tapi itulah keindahan plugin jquery, fakta bahwa Anda dapat memodifikasinya sesuai dengan kebutuhan Anda. Terima kasih!
Adrian Marinica
Terima kasih Adrian. Btw, saya baru saja mencoba mengaktifkan garis miring menggunakan allowopsi dan berfungsi dengan baik bagi saya menggunakan kode ini: $('#firstName').alphanum({allow: "/"});Adakah kemungkinan Anda dapat memberikan info lebih lanjut? Jika ada bug atau masalah dengan dokumen, alangkah baiknya untuk memperbaikinya. Cheers
KevSheedy
Halo KevSheedy, terima kasih telah meluangkan waktu untuk menguji ini. Maaf saya tidak membuatnya cukup jelas. Masalahnya adalah saya juga pernah allowOtherCharSets: falsedan allowCaseless: false. Ini mengganggu pengaturan yang ditetapkan allow. Dari sudut pandang saya, menurut saya allowopsi tersebut harus memveto semua opsi lain (seperti allowOtherCharSetsatau allowCaseless). Jadi jika Anda menentukan karakter dalam allowopsi, itu harus diizinkan terlepas dari opsi lain yang disetel dalam objek konfigurasi. Hal yang sama berlaku untuk disallow. Tapi ini hanya pendapat saya. :) Bersulang lagi! :)
Adrian Marinica
Poin bagus Adrian. Saya telah melanjutkan dan menerbitkan perbaikan di V1.0.6 untuk dibuat allowdan disallowmemiliki prioritas yang lebih tinggi. Ini masuk masalah # 7 . Semoga membantu
KevSheedy
6
"jadi saya melanjutkan dan menulis jquery.alphanum" Luar biasa!
Felix
14

Gunakan atribut input pola HTML5!

<input type="text" pattern="^[a-zA-Z0-9]+$" />
keepitreal
sumber
11
Meskipun solusi ini mencegah karakter yang tidak diinginkan untuk dikirimkan, ini tidak mencegah karakter yang tidak diinginkan untuk dimasukkan ke dalam field input.
rexmac
1
Ada juga risiko bahwa pengguna tidak menggunakan browser HTML5.
Kapten Kenpachi
Dari pengalaman UX, satu hal yang paling dibenci oleh banyak orang daripada dibatasi dalam apa yang dapat mereka ketik adalah diberitahu bahwa Anda salah melakukannya setelahnya. - Paksaan input adalah untuk mengurangi pesan kesalahan dan notifikasi tidak valid.
Julix
1
@ Julix Ini kasus per kasus. Ada beberapa bidang yang hanya dapat berupa angka (harga atau jumlah mata uang apa pun, dll) yang tidak memungkinkan untuk mendengarkan masukan karakter alfabet. Tapi ya, saya bukanlah solusi untuk masalah OP tetapi cara yang bagus dan mudah untuk membantu masalah UX.
keepitreal
13

Kotak teks Anda:

<input type="text" id="name">

Javascript Anda:

$("#name").keypress(function(event) {
    var character = String.fromCharCode(event.keyCode);
    return isValid(character);     
});

function isValid(str) {
    return !/[~`!@#$%\^&*()+=\-\[\]\\';,/{}|\\":<>\?]/g.test(str);
}
pedagang lilin
sumber
@Bhargav Rao, saya menghapus postingan duplikat lainnya dan memposting ulang yang ini karena yang ini lebih sesuai, terima kasih telah menunjukkannya
chandler
11

Gunakan regex untuk mengizinkan / melarang apa pun. Selain itu, untuk versi yang sedikit lebih kuat daripada jawaban yang diterima, mengizinkan karakter yang tidak memiliki nilai kunci yang terkait dengannya (spasi mundur, tab, tombol panah, hapus, dll.) Dapat dilakukan dengan terlebih dahulu melewati peristiwa penekanan tombol dan periksa kunci berdasarkan kode kunci, bukan nilai.

$('#input').bind('keydown', function (event) {
        switch (event.keyCode) {
            case 8:  // Backspace
            case 9:  // Tab
            case 13: // Enter
            case 37: // Left
            case 38: // Up
            case 39: // Right
            case 40: // Down
            break;
            default:
            var regex = new RegExp("^[a-zA-Z0-9.,/ $@()]+$");
            var key = event.key;
            if (!regex.test(key)) {
                event.preventDefault();
                return false;
            }
            break;
        }
});
James Mart
sumber
11

Lihatlah plugin alfanumerik jQuery. https://github.com/KevinSheedy/jquery.alphanum

//All of these are from their demo page
//only numbers and alpha characters
$('.sample1').alphanumeric();
//only numeric
$('.sample4').numeric();
//only numeric and the .
$('.sample5').numeric({allow:"."});
//all alphanumeric except the . 1 and a
$('.sample6').alphanumeric({ichars:'.1a'});
RSolberg
sumber
Apakah ada satu untuk surat? Biasanya saya hanya menggunakan nan untuk nomor saja (seperti kode pos atau telepon)
3

Tulis beberapa kode javascript pada acara onkeypress dari textbox. sesuai persyaratan mengizinkan dan membatasi karakter di kotak teks Anda

function isNumberKeyWithStar(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 42)
        return false;
    return true;
}
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
function isNumberKeyForAmount(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 46)
        return false;
    return true;
}

Pratik 1020
sumber
1
Ini berfungsi jika saya mengetik secara manual. Tetapi saya dapat menempelkan karakter khusus yang disalin.
Sunil Garg
3

Saya menggunakan kode ini memodifikasi orang lain yang saya lihat. Hanya grand untuk pengguna menulis jika tombol yang ditekan atau ditempelkan teks lulus tes pola (cocok) (contoh ini adalah input teks yang hanya memungkinkan 8 digit)

$("input").on("keypress paste", function(e){
    var c = this.selectionStart, v = $(this).val();
    if (e.type == "keypress")
        var key = String.fromCharCode(!e.charCode ? e.which : e.charCode)
    else
        var key = e.originalEvent.clipboardData.getData('Text')
    var val = v.substr(0, c) + key + v.substr(c, v.length)
    if (!val.match(/\d{0,8}/) || val.match(/\d{0,8}/).toString() != val) {
        e.preventDefault()
        return false
    }
})
Pablo Padron
sumber
mengapa !e.charCode ? e.which : e.charCodedan tidak sederhana e.charCode ? e.charCode : e.which?
Massimiliano Kraus
perubahan apa yang perlu dilakukan untuk penerimaan bilangan desimal?
ubm
2

ini adalah contoh yang mencegah pengguna mengetik karakter "a"

$(function() {
$('input:text').keydown(function(e) {
if(e.keyCode==65)
    return false;

});
});

refence kode kunci di sini:
http://www.expandinghead.net/keycode.html


sumber
Saya akan berpikir bahwa semua kode kunci yang tidak ingin Anda izinkan bisa sangat melelahkan untuk dicoba dan dikelola.
RSolberg
Jika Anda ingin membatasi seseorang untuk hanya dapat memasukkan angka 1 sampai 5, Anda harus mengatur 5 kode kunci dalam kode Anda.
RSolberg
2
Sebenarnya bukan rencana yang buruk jika AlphaNumeric bukan plugin untuk Anda. Saya membuatnya bekerja dengan pernyataan switch / case. Contoh ini melarang karakter yang tidak diperbolehkan dalam nama direktori: $ ('input [type =' text '], textarea'). Keydown (function (ev) {switch (ev.keyCode) {case 47: case 92: case 63: kasus 37: kasus 42: kasus 59: kasus 124: kasus 34: kasus 60: kasus 62: return false;};});
M Miller
@ user434917, kode Anda tidak berfungsi saat saya mengujinya dengan browser chrome seluler android. apakah Anda punya solusi untuk itu ..?
Pranesh Janarthanan
2
$(function(){
      $('input').keyup(function(){
        var input_val = $(this).val();
        var inputRGEX = /^[a-zA-Z0-9]*$/;
        var inputResult = inputRGEX.test(input_val);
          if(!(inputResult))
          {     
            this.value = this.value.replace(/[^a-z0-9\s]/gi, '');
          }
       });
    });
Ranjith Rana
sumber
1

Ya, Anda dapat melakukannya dengan menggunakan jQuery sebagai:

<script>
$(document).ready(function()
{
    $("#username").blur(function()
    {
        //remove all the class add the messagebox classes and start fading
        $("#msgbox").removeClass().addClass('messagebox').text('Checking...').fadeIn("slow");
        //check the username exists or not from ajax
        $.post("user_availability.php",{ user_name:$(this).val() } ,function(data)
        {
          if(data=='empty') // if username is empty
          {
            $("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('Empty user id is not allowed').addClass('messageboxerror').fadeTo(900,1);
            });
          }
          else if(data=='invalid') // if special characters used in username
          {
            $("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('Sorry, only letters (a-z), numbers (0-9), and periods (.) are allowed.').addClass('messageboxerror').fadeTo(900,1);
            });
          }
          else if(data=='no') // if username not avaiable
          {
            $("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('User id already exists').addClass('messageboxerror').fadeTo(900,1);
            });     
          }
          else
          {
            $("#msgbox").fadeTo(200,0.1,function()  //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('User id available to register').addClass('messageboxok').fadeTo(900,1); 
            });
          }

        });

    });
});
</script>
<input type="text" id="username" name="username"/><span id="msgbox" style="display:none"></span>

dan skrip untuk user_availability.php Anda adalah:

<?php
include'includes/config.php';

//value got from the get method
$user_name = trim($_POST['user_name']);

if($user_name == ''){
    echo "empty";
}elseif(preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $user_name)){
    echo "invalid";
}else{
    $select = mysql_query("SELECT user_id FROM staff");

    $i=0;
    //this varible contains the array of existing users
    while($fetch = mysql_fetch_array($select)){
        $existing_users[$i] = $fetch['user_id'];
        $i++;
    }

    //checking weather user exists or not in $existing_users array
    if (in_array($user_name, $existing_users))
    {
        //user name is not availble
        echo "no";
    } 
    else
    {
        //user name is available
        echo "yes";
    }
}
?>

Saya mencoba menambahkan untuk / dan \ tetapi tidak berhasil.


Anda juga dapat melakukannya dengan menggunakan javascript & kode akan menjadi:

<!-- Check special characters in username start -->
<script language="javascript" type="text/javascript">
function check(e) {
    var keynum
    var keychar
    var numcheck
    // For Internet Explorer
    if (window.event) {
        keynum = e.keyCode;
    }
    // For Netscape/Firefox/Opera
    else if (e.which) {
        keynum = e.which;
    }
    keychar = String.fromCharCode(keynum);
    //List of special characters you want to restrict
    if (keychar == "'" || keychar == "`" || keychar =="!" || keychar =="@" || keychar =="#" || keychar =="$" || keychar =="%" || keychar =="^" || keychar =="&" || keychar =="*" || keychar =="(" || keychar ==")" || keychar =="-" || keychar =="_" || keychar =="+" || keychar =="=" || keychar =="/" || keychar =="~" || keychar =="<" || keychar ==">" || keychar =="," || keychar ==";" || keychar ==":" || keychar =="|" || keychar =="?" || keychar =="{" || keychar =="}" || keychar =="[" || keychar =="]" || keychar =="¬" || keychar =="£" || keychar =='"' || keychar =="\\") {
        return false;
    } else {
        return true;
    }
}
</script>
<!-- Check special characters in username end -->

<!-- in your form -->
    User id : <input type="text" id="txtname" name="txtname" onkeypress="return check(event)"/>
PHP Ferrari
sumber
2
Bung, Anda telah memasukkan sejumlah besar kode berlebih yang mungkin tidak membantu. Bisakah Anda memotongnya seminimal mungkin? Dan dia bertanya tentang jQuery, saya tidak yakin apakah PHP itu relevan.
Simon East
@PHP Ferrari: Saya menggunakan kode javascript, Kode Anda berfungsi dengan baik, Bagaimana cara menampilkan pesan sembulan peringatan jika pelanggan memasukkan karakter khusus. Pesan seperti "Karakter Khusus Tidak Diizinkan".
Permata
1

angkanya saja:

$ ('input.time'). keydown (function (e) {if (e.keyCode> = 48 && e.keyCode <= 57) {return true;} else {return false;}});

atau untuk waktu termasuk ":"

$ ('input.time'). keydown (function (e) {if (e.keyCode> = 48 && e.keyCode <= 58) {return true;} else {return false;}});

juga termasuk delete dan backspace:

$ ('input.time'). keydown (function (e) {if ((e.keyCode> = 46 && e.keyCode <= 58) || e.keyCode == 8) {return true;} else {return Salah; } });

sayangnya tidak membuatnya berfungsi di iMAC

Jonathan Joosten
sumber
1

Ingin mengomentari komentar Alex atas jawaban Dale. Tidak mungkin (pertama perlu berapa banyak "rep"? Itu tidak akan terjadi segera .. sistem aneh.) Jadi sebagai jawaban:

Backspace dapat ditambahkan dengan menambahkan \ b ke definisi regex seperti ini: [a-zA-Z0-9 \ b]. Atau Anda cukup mengizinkan seluruh rentang Latin, termasuk karakter "tidak eksotis" apa pun (juga mengontrol karakter seperti spasi mundur): ^ [\ u0000- \ u024F \ u20AC] + $

Hanya karakter unicode asli di luar latin ada tanda euro (20ac), tambahkan apa pun yang mungkin Anda butuhkan.

Untuk juga menangani masukan yang dimasukkan melalui salin & tempel, cukup ikat juga ke acara "ubah" dan periksa juga masukan di sana - menghapusnya atau melucuti / memberikan pesan kesalahan seperti "karakter tidak didukung" ..

if (!regex.test($j(this).val())) {
  alert('your input contained not supported characters');
  $j(this).val('');
  return false;
}
tanda hubung
sumber
1

Batasi karakter spesial saat tombol ditekan. Berikut adalah halaman uji untuk kode kunci: http://www.asquare.net/javascript/tests/KeyCode.html

var specialChars = [62,33,36,64,35,37,94,38,42,40,41];

some_element.bind("keypress", function(event) {
// prevent if in array
   if($.inArray(event.which,specialChars) != -1) {
       event.preventDefault();
   }
});

Di Angular, saya membutuhkan format mata uang yang tepat di bidang teks saya. Solusi saya:

var angularApp = angular.module('Application', []);

...

// new angular directive
angularApp.directive('onlyNum', function() {
    return function( scope, element, attrs) {

        var specialChars = [62,33,36,64,35,37,94,38,42,40,41];

        // prevent these special characters
        element.bind("keypress", function(event) {
            if($.inArray(event.which,specialChars) != -1) {
                prevent( scope, event, attrs)
             }
        });

        var allowableKeys = [8,9,37,39,46,48,49,50,51,52,53,54,55,56
            ,57,96,97,98,99,100,101,102,103,104,105,110,190];

        element.bind("keydown", function(event) {
            if($.inArray(event.which,allowableKeys) == -1) {
                prevent( scope, event, attrs)
            }
        });
    };
})

// scope.$apply makes angular aware of your changes
function prevent( scope, event, attrs) {
    scope.$apply(function(){
        scope.$eval(attrs.onlyNum);
        event.preventDefault();
    });
    event.preventDefault();
}

Di html tambahkan direktif

<input only-num type="text" maxlength="10" id="amount" placeholder="$XXXX.XX"
   autocomplete="off" ng-model="vm.amount" ng-change="vm.updateRequest()">

dan dalam pengontrol sudut yang sesuai, saya hanya mengizinkan hanya ada 1 periode, ubah teks menjadi angka dan tambahkan pembulatan angka pada 'blur'

...

this.updateRequest = function() {
    amount = $scope.amount;
    if (amount != undefined) {
        document.getElementById('spcf').onkeypress = function (e) {
        // only allow one period in currency
        if (e.keyCode === 46 && this.value.split('.').length === 2) {
            return false;
        }
    }
    // Remove "." When Last Character and round the number on blur
    $("#amount").on("blur", function() {
      if (this.value.charAt(this.value.length-1) == ".") {
          this.value.replace(".","");
          $("#amount").val(this.value);
      }
      var num = parseFloat(this.value);
      // check for 'NaN' if its safe continue
      if (!isNaN(num)) {
        var num = (Math.round(parseFloat(this.value) * 100) / 100).toFixed(2);
        $("#amount").val(num);
      }
    });
    this.data.amountRequested = Math.round(parseFloat(amount) * 100) / 100;
}

...
Ivor Scott
sumber
1

Untuk mengganti karakter khusus, spasi dan ubah ke huruf kecil

$(document).ready(function (){
  $(document).on("keyup", "#Id", function () {
  $("#Id").val($("#Id").val().replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '').toLowerCase());
 }); 
});
GirishBabuC
sumber
0
[User below code to restrict special character also    

$(h.txtAmount).keydown(function (event) {
        if (event.shiftKey) {
            event.preventDefault();
        }
        if (event.keyCode == 46 || event.keyCode == 8) {
        }
        else {
            if (event.keyCode < 95) {
                if (event.keyCode < 48 || event.keyCode > 57) {
                    event.preventDefault();
                }
            }
            else {
                if (event.keyCode < 96 || event.keyCode > 105) {
                    event.preventDefault();
                }
            }
        }


    });]
Govind Pant
sumber
4
Jawaban kode saja tidak terlalu berguna tanpa penjelasan.
Vemonus
0

Izinkan hanya angka di TextBox (Batasi Huruf dan Karakter Khusus)

        /*code: 48-57 Numbers
          8  - Backspace,
          35 - home key, 36 - End key
          37-40: Arrow keys, 46 - Delete key*/
        function restrictAlphabets(e){
            var x=e.which||e.keycode;
            if((x>=48 && x<=57) || x==8 ||
                (x>=35 && x<=40)|| x==46)
                return true;
            else
                return false;
        }
pengguna3354817
sumber
0
/**
     * Forbids special characters and decimals
     * Allows numbers only
     * */
    const numbersOnly = (evt) => {

        let charCode = (evt.which) ? evt.which : evt.keyCode;
        if (charCode === 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }

        let inputResult = /^[0-9]*$/.test(evt.target.value);
        if (!inputResult) {
            evt.target.value = evt.target.value.replace(/[^a-z0-9\s]/gi, '');
        }

        return true;
    }
Pengembang RedBonzai
sumber