Metin kutusundaki Enter tuşunda JavaScript ile bir düğme tıklamasını tetikleme


1292

Bir metin girişi ve bir düğme var (aşağıya bakın). Nasıl için JavaScript kullanabilirsiniz düğmenin tıklama etkinliğini tetiklemek zaman Enteranahtar metin kutusunun içine basılır?

Geçerli sayfamda zaten farklı bir gönderme düğmesi var, bu yüzden düğmeyi bir gönderme düğmesi yapamıyorum. Ve sadeceEnter bu tek bir metin kutusundan basılırsa anahtarın bu düğmeyi tıklamasını istiyorum, başka bir şey yok.

<input type="text" id="txtSearch" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />

1
Benim gibi çaylaklar için önemli not: Bu sorunun temel kısmı, sayfada zaten bir formun olması ve zaten bir gönderme düğmesinin bulunmasıdır. JQuery yanıtı çapraz tarayıcı uyumlu ve iyi bir çözümdür.
Joshua Dance

2
@JoshuaDance, zaten bir form / gönderiye sahip olmak sorun değil. Bir sayfanın, her biri kendi gönderimi olan birçok formu olabilir (ancak iç içe değil). Her formun her alanı yalnızca o formun gönderilmesini tetikler. Bu cevapta belirtildiği gibi .
Frédéric

Yanıtlar:


1426

JQuery'de aşağıdakiler işe yarar:

$("#id_of_textbox").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#id_of_button").click();
    }
});

$("#pw").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#myButton").click();
    }
});

$("#myButton").click(function() {
  alert("Button code executed.");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Username:<input id="username" type="text"><br>
Password:&nbsp;<input id="pw" type="password"><br>
<button id="myButton">Submit</button>

Veya açık JavaScript'te aşağıdakiler işe yarar:

document.getElementById("id_of_textbox")
    .addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("id_of_button").click();
    }
});

document.getElementById("pw")
    .addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("myButton").click();
    }
});

function buttonCode()
{
  alert("Button code executed.");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Username:<input id="username" type="text"><br>
Password:&nbsp;<input id="pw" type="password"><br>
<button id="myButton" onclick="buttonCode()">Submit</button>


12
Event.whCo veya event.charCode'dan daha fazla olayı sorgulamak daha iyi bir uygulamadır, bkz. Developer.mozilla.org/en/DOM/event.charCode#Notes
William Niu

25
keydownkeyupkullanmak daha iyi bir olay değil . Ayrıca, asp.net kullanıyorsanız return false, sonunda asp.net'in hala olayı durdurmasını durdurmak zorunda kalacaksınız .
maxp

144
Kullanmayla ilgili sorun, keydownenter tuşuna basılı tutmanın olayı tekrar tekrar tetiklemesidir. keyupetkinliğe eklerseniz , yalnızca anahtar bırakıldığında etkinleşir.
Steve Paulo

26
Ben ekleyerek kodunuzu değişiklikler yaptık event.preventDefault();çağırmadan önce click();benim sayfa form sahipken fonksiyonu ve ben geçtik keyupile keypressbenim için tek çalışan işleyici olarak, her durumda, kod düzgün parça için teşekkürler!
Adrian K.

7
Adil olmak gerekirse, bu cevap gönderildiğinde jQuery JS ile eşanlamlıydı. Ama şimdi jQuery'den tamamen kaçınan birçoğumuz (React gibi bir şey kullandığınızda sadece bir kb israfı olduğu için) JS sorularının cevaplarını aradığımızda rahatsız oluyoruz ve genellikle ilk gelen kitap güvenmek istemiyorum.
Andy

402

Sonra sadece kod!

<input type = "text"
       id = "txtSearch" 
       onkeydown = "if (event.keyCode == 13)
                        document.getElementById('btnSearch').click()"    
/>

<input type = "button"
       id = "btnSearch"
       value = "Search"
       onclick = "doSomething();"
/>

5
Evet neredeyse yaptım. Sanırım bu sadece kişisel bir tercih meselesi ... Daha modüler yaklaşımı seviyorum. ;)
kdenney

9
form gönderimini durdurmanız gerekiyorsa: onkeydown = "if (event.keyCode == 13) {document.getElementById ('btnSubmit'). tıklayın (); event.returnValue = false; event.cancel = true;}"
Gabriel Chung

3
Bu benim için işe yaradı çünkü inline yöntemi, içinde benzer kod ile fonksiyon çağırmak yerine, çağrıda yanlış döndürmek ve geri gönderme önlemek sağlar. Benim durumumda "click" yöntemi __doPostback zaman uyumsuz çağrısını çağırır ve "return false;" sadece sayfayı yeniden yükler.
Dave

3
Sam ile aynı fikirdeyim, bu satır içi JS kodlu bu kod cehennem gibi çirkin. HTML ve JavaScript kodlarını her zaman ayırmalısınız.
Sk8erPeter

9
@Sam Bilgeliğinizi asla kuklalardan almayın . Acı korkuya yol açar ve korku zihin katilidir. Korku, tamamen yok olan küçük ölümdür. Korkumla yüzleşeceğim. Benim üstümden ve benim içimden geçmesine izin vereceğim. Ve geçtiğinde yolunu görmek için iç gözü çevireceğim. Korkunun gittiği yerde hiçbir şey olmayacak. Belki satır içi olay işleyicileri hariç. Evet, lütfen bu yanıtın yaptığı gibi etkinlik işleyicilerinizi görünümünüzden / işaretlemenizden ayırın . ; ^)
Aralık'ta 17

179

Bunu anladım:

<input type="text" id="txtSearch" onkeypress="return searchKeyPress(event);" />
<input type="button" id="btnSearch" Value="Search" onclick="doSomething();" />

<script>
function searchKeyPress(e)
{
    // look for window.event in case event isn't passed in
    e = e || window.event;
    if (e.keyCode == 13)
    {
        document.getElementById('btnSearch').click();
        return false;
    }
    return true;
}
</script>

22
e = e || window.event; // etkinlik almanın en kısa yolu
Victor

2
En iyi düz JavaScript seçeneği. HTML'de bir özellik olarak JavaScript eklendi, jQuery sadece jQuery'dir (uyumluluk garanti edilmez). Çözüm için teşekkürler!
boxspah

ve if içinde false değerini döndürürseniz, anahtarın daha fazla işlenmesini önleyebilirsiniz: <input type = "text" id = "txtSearch" onkeypress = "searchKeyPress (event);" /> <girdi türü = "düğme" id = "btnSearch" Değer = "Ara" onclick = "doSomething ();" /> <script> işlevi searchKeyPress (e) {// olay e = e'de geçmediği takdirde window.event dosyasını arar || window.event; eğer (e.keyCode == 13) {document.getElementById ('btnSearch'). click (); yanlış döndür; } gerçek dön; } </script>
Jose Gómez

83

Düğmeyi bir gönderme öğesi yapın, böylece otomatik olur.

<input type = "submit"
       id = "btnSearch"
       value = "Search"
       onclick = "return doSomething();"
/>

<form>Bu işi yapmak için giriş alanlarını içeren bir öğeye ihtiyacınız olacağını unutmayın (teşekkürler Sergey Ilinsky).

Standart davranışı yeniden tanımlamak iyi bir uygulama değildir, Enteranahtar her zaman formdaki gönder düğmesini çağırmalıdır.


30
Beyler! Bütün sorusunu okuyun. Sayfada zaten başka bir gönder düğmesi var, bu yüzden onun için işe yaramaz.
skybondsor

5
Eğlenceli gerçek, ben son zamanlarda bunu SharePoint'te yapmaya çalıştım. Ancak SharePoint'in zaten tüm içeriğinizi saran bir formu vardır ve tüm <form>etiketler aksi takdirde liberal HTML ayrıştırıcısı tarafından atılır. Bu yüzden keypresses veya büstü kaçırmak zorunda. (BTW, SharePoint'te Enter tuşuna basmak herhangi bir nedenle Düzenleme modunu başlatır. Sanırım şerit aynı formu kullanıyor.)

1
A <button type="submit" onclick="return doSomething(this)">Value</button>çalışır. İpucu, returnanahtar kelime
Gus

77

Henüz kimse kullanmadığından addEventListener, benim versiyonum. Öğeler göz önüne alındığında:

<input type = "text" id = "txt" />
<input type = "button" id = "go" />

Aşağıdakileri kullanırdım:

var go = document.getElementById("go");
var txt = document.getElementById("txt");

txt.addEventListener("keypress", function(event) {
    event.preventDefault();
    if (event.keyCode == 13)
        go.click();
});

Bu, HTML'yi temiz tutarken etkinlik türünü ve eylemini ayrı olarak değiştirmenize olanak tanır.

Bunun dışında <form>kaldığından emin olmanın faydalı olduğunu unutmayın , çünkü bu öğeleri onlara eklediğimde Enter tuşuna basarak formu gönderdikten sonra sayfayı yeniden yükledim. Keşfetmem için birkaç kez yanıp söndü.

Ek : @ruffin tarafından yapılan bir yorum sayesinde, eksik olay işleyicisini ekledim ve preventDefaultbu kodun (muhtemelen) bir form içinde çalışmasına izin vermek için. (Bunu test etmeye başlayacağım, bu noktada parantez içindeki içeriği kaldıracağım.)


14
JQeuery cevabının neden daha fazla oy verdiğini gerçekten anlamıyorum. Web geliştirme topluluğu için ağlıyorum.
David

1
Gerçekten eksik olan şey, tuşa basma işleyicinizdeki bir argüman ve e.preventDefault()formlarla çalışmasını sağlamaktır. Bkz benim (yeni) cevabı .
Aralık'ta

5
kullanıcılarınızı gerçekten herhangi bir veri girme niyetinde değilseniz, gerçekten böyle bir şey yapmalısınızif (event.keyCode == 13) { event.preventDefault(); go.click();}
senkronize olmayan

1
Sadece bu küçük şey için jQuery kullanmak işe yaramaz. Ayrıca CSP ile çok kolay çalışır ve yüklenmesi daha az zaman alır. Yapabiliyorsanız bunu kullanın.
Avamander

59

Açık JavaScript'te,

if (document.layers) {
  document.captureEvents(Event.KEYDOWN);
}

document.onkeydown = function (evt) {
  var keyCode = evt ? (evt.which ? evt.which : evt.keyCode) : event.keyCode;
  if (keyCode == 13) {
    // For Enter.
    // Your function here.
  }
  if (keyCode == 27) {
    // For Escape.
    // Your function here.
  } else {
    return true;
  }
};

Yanıtın sadece jQuery'de verildiğini fark ettim, bu yüzden düz JavaScript'te bir şey vermeyi düşündüm.


20
document.layers? Hala Netscape'i destekliyor musunuz? !!
Victor

6
Hayır, Netscape'i desteklemenize gerek yok. blog.netscape.com/2007/12/28/…
kingdango

7
netscape.com artık mevcut değil (aol.com'a yönlendiriyor) ve hala nescape'i destekleyen şaşırtıcı insanlar var.
LeartS

6
evt.which ? evt.which : evt.keyCodeeşittirevt.which || evt.keyCode
kullanici

3
@LeartS Bahse girerim çünkü hala Netscape kullanan insanlar var .
SantiBailors

23

Tam olarak bahsetmediğim, bunun için kullanabileceğiniz temel bir numara. Bir ajax eylemi veya Enter'da başka bir çalışma yapmak istiyorsanız, ancak aslında bir form göndermek istemiyorsanız bunu yapabilirsiniz:

<form onsubmit="Search();" action="javascript:void(0);">
    <input type="text" id="searchCriteria" placeholder="Search Criteria"/>
    <input type="button" onclick="Search();" value="Search" id="searchBtn"/>
</form>

Eylemi ayarlama = "javascript: void (0);" Bu, temelde varsayılan davranışı önlemek için bir kısayoldur. Bu durumda enter tuşuna basar veya tıklarsanız bir yöntem çağrılır ve bazı verileri yüklemek için bir ajax çağrısı yapılır.


Bu, mobil cihaz desteği için daha iyi bir çözümdür. Otomatik olarak Android cihazlardaki klavyeyi gizler ve ayrıca iOS eklersen searchCriteria.blur();için onsubmit.
Aaron Gillion

Sayfada başka bir gönderme düğmesi olduğundan bu çalışmaz.
Jose Gómez

@ JoseGómez, bir sayfada yalnızca ilgili alanlar tarafından tetiklenen geliştiricinin istediği kadar gönderme düğmesi olabilir. Her alan / teslim grubu için sadece farklı formların olması gerekir. Bir sayfa yalnızca tek bir formla sınırlı değildir.
Frédéric

@Frederic: sorudan (yanlış?) Diğer gönderme düğmesinin aynı biçimde olduğunu anladım: "Geçerli sayfamda zaten farklı bir gönderme düğmesi var, bu yüzden düğmeyi bir gönderme düğmesi yapamıyorum."
Jose Gómez

1
Özel eylemlere izin verdiğinden, ancak bir grup süslü geçersiz kılma koduna duyulan ihtiyacı ortadan kaldırdığı için bu harika bir cevaptır.
Beejor

16

Dene:

<input type="text" id="txtSearch"/>
<input type="button" id="btnSearch" Value="Search"/>

<script>             
   window.onload = function() {
     document.getElementById('txtSearch').onkeypress = function searchKeyPress(event) {
        if (event.keyCode == 13) {
            document.getElementById('btnSearch').click();
        }
    };

    document.getElementById('btnSearch').onclick =doSomething;
}
</script>

15

Enter tuşuna her basıldığında bir arama başlatmak için şunu kullanın:

$(document).keypress(function(event) {
    var keycode = (event.keyCode ? event.keyCode : event.which);
    if (keycode == '13') {
        $('#btnSearch').click();
    }
}

14
onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {document.getElementById('btnSearch').click();}};"

Bu biraz yeni bir projeden aldığım bir şey ... Bunu internette buldum ve eski JavaScript'te daha iyi bir yol olup olmadığı hakkında hiçbir fikrim yok.


14

Kullanım keypressve event.key === "Enter"çağdaş JS ile!

const textbox = document.getElementById("txtSearch");
textbox.addEventListener("keypress", function onEvent(event) {
    if (event.key === "Enter") {
        document.getElementById("btnSearch").click();
    }
});

Mozilla Belgeleri

Desteklenen Tarayıcılar


13

Her ne kadar, formda sadece bir alan ve bir gönderme düğmesi olduğu sürece, enter tuşuna basmak, sayfada başka bir form olsa bile formu göndermelidir.

Daha sonra formu js ile gönderme formunu yakalayabilir ve istediğiniz doğrulama veya geri çağrıları yapabilirsiniz.


13

Kimse bir süredir kullanılabilen html özenli "erişim anahtarını" fark etmedi.

Bu klavye kısayolları malzeme için bir javascript yolu değildir.

accesskey_browsers

Accesskey MDN'deki kısayolları ilişkilendirir

Bunun gibi kullanılması amaçlanmıştır. Html özelliğinin kendisi yeterlidir, tarayıcı ve işletim sistemine bağlı olarak yer tutucuyu veya diğer göstergeleri nasıl değiştirebiliriz. Senaryo, bir fikir vermek için test edilmemiş bir çizik yaklaşımdır. Küçük bowser gibi bir tarayıcı kütüphane dedektörü kullanmak isteyebilirsiniz

let client = navigator.userAgent.toLowerCase(),
    isLinux = client.indexOf("linux") > -1,
    isWin = client.indexOf("windows") > -1,
    isMac = client.indexOf("apple") > -1,
    isFirefox = client.indexOf("firefox") > -1,
    isWebkit = client.indexOf("webkit") > -1,
    isOpera = client.indexOf("opera") > -1,
    input = document.getElementById('guestInput');

if(isFirefox) {
   input.setAttribute("placeholder", "ALT+SHIFT+Z");
} else if (isWin) {
   input.setAttribute("placeholder", "ALT+Z");
} else if (isMac) {
  input.setAttribute("placeholder", "CTRL+ALT+Z");
} else if (isOpera) {
  input.setAttribute("placeholder", "SHIFT+ESCAPE->Z");
} else {'Point me to operate...'}
<input type="text" id="guestInput" accesskey="z" placeholder="Acces shortcut:"></input>


1
Erişim iki s.
Kaiser

3
OP'nin özel anahtar durumu etrafındaki soruyu cevaplamıyor gibi görünüyor = ENTER
Ozan Bellik

12

Bu, tüm YUI sevenler için bir çözümdür :

Y.on('keydown', function() {
  if(event.keyCode == 13){
    Y.one("#id_of_button").simulate("click");
  }
}, '#id_of_textbox');

Bu özel durumda, düğme işlevselliği ile enjekte edilen DOM nesnelerini tetiklemek için YUI kullanarak daha iyi sonuçlar elde ettim - ama bu başka bir hikaye ...


12

In Angular2 :

(keyup.enter)="doSomething()"

Düğmede görsel bir geri bildirim istemiyorsanız, düğmeye başvurmamak, doğrudan denetleyiciyi çağırmak iyi bir tasarımdır.

Ayrıca, kimliğe gerek yok - görünüm ve model arasında ayrım yapmanın başka bir NG2 yolu.



10

Bu durumda, Giriş düğmesini sunucuya girin ve Js komut dosyasını yürütmek istediğinizde enter düğmesini de devre dışı bırakın.

<input type="text" id="txtSearch" onkeydown="if (event.keyCode == 13)
 {document.getElementById('btnSearch').click(); return false;}"/>
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />

9

Bu değişim girişimi yakındır, ancak tarayıcıya göre ileri ve geri hareket eder (Safari 4.0.5 ve Firefox 3.6.3'te), bu yüzden sonuçta tavsiye etmem.

<input type="text" id="txtSearch" onchange="doSomething();" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />

Ayrıca odaklanmayı tetiklediğini de belirtmeliyim.
FluorescentGreen5

8
event.returnValue = false

Olayı işlerken veya olay işleyicinizin çağırdığı işlevde kullanın.

En azından Internet Explorer ve Opera'da çalışır.


8

Jquery mobile için yapmak zorundaydım

$('#id_of_textbox').live("keyup", function(event) {
    if(event.keyCode == '13'){
    $('#id_of_button').click();
    }
});

2
.livejQuery 1.7'de kullanımdan kaldırılmıştır. JQuery Mobile'da hala iyi kabul ediliyor mu?
Barmar

8

Ele tamamen düz bir JavaScript çözümü eklemek için form gönderiminde icedwater sorununun @ , burada tam bir çözüm ileform .

NOT: Bu, IE9 + dahil olmak üzere "modern tarayıcılar" içindir. IE8 sürümü çok daha karmaşık değildir ve buradan öğrenilebilir .


Keman: https://jsfiddle.net/rufwork/gm6h25th/1/

HTML

<body>
    <form>
        <input type="text" id="txt" />
        <input type="button" id="go" value="Click Me!" />
        <div id="outige"></div>
    </form>
</body>

JavaScript

// The document.addEventListener replicates $(document).ready() for
// modern browsers (including IE9+), and is slightly more robust than `onload`.
// More here: https://stackoverflow.com/a/21814964/1028230
document.addEventListener("DOMContentLoaded", function() {
    var go = document.getElementById("go"),
        txt = document.getElementById("txt"),
        outige = document.getElementById("outige");

    // Note that jQuery handles "empty" selections "for free".
    // Since we're plain JavaScripting it, we need to make sure this DOM exists first.
    if (txt && go)    {
        txt.addEventListener("keypress", function (e) {
            if (event.keyCode === 13)   {
                go.click();
                e.preventDefault(); // <<< Most important missing piece from icedwater
            }
        });

        go.addEventListener("click", function () {
            if (outige) {
                outige.innerHTML += "Clicked!<br />";
            }
        });
    }
});

1
Açıklamasız downvotes endişelerinizi gidermeyi zorlaştırır. Neyin doğru görünmediğini bana bildirin, takip etmekten memnuniyet duyarım.
ruffin

7

Modern, tanımlanmamış (olmadan keyCodeveya onkeydown) Javascript:

<input onkeypress="if(event.key == 'Enter') {console.log('Test')}">

Bence bu işi yapan en basit cevap. Benim kullanım durumunda, onkeypress = "inputKeyPressed (event)" 'e yükselttim ve sonra fonksiyonun kendisinde event.which parametresini ele aldım. Örneğin Enter tuşu olayı döndürür. 13 olarak.
ak93

5
document.onkeypress = function (e) {
 e = e || window.event;
 var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
 if (charCode == 13) {

        // Do something here
        printResult();
    }
};

Benim iki sentim. Windows 8 için bir uygulama üzerinde çalışıyorum ve Enter düğmesine bastığımda düğmenin bir tıklama etkinliği kaydetmesini istiyorum. Bunu JS'de yapıyorum. Birkaç öneri denedim, ancak sorunları vardı. Bu gayet iyi çalışıyor.


Olay işleyiciyi belgeye yerleştirmek için gereğinden fazla doldurma. Başka bir charCodeyerde 13 tane olsaydı , kovuyorsun printResult().
Aralık'ta ruffin

5

JQuery ile yapmak için:

$("#txtSearch").on("keyup", function (event) {
    if (event.keyCode==13) {
        $("#btnSearch").get(0).click();
    }
});

Normal JavaScript ile yapmak için:

document.getElementById("txtSearch").addEventListener("keyup", function (event) {
    if (event.keyCode==13) { 
        document.getElementById("#btnSearch").click();
    }
});

5

Kısalık ve modern js yaklaşımını sevenler için.

input.addEventListener('keydown', (e) => {if (e.keyCode == 13) doSomething()});

Burada girdi , girdi öğenizi içeren bir değişkendir.


1

Modern JS keyCodekullanımdan kaldırıldığında, keybunun yerine

searchInput.onkeyup = function (e) {
    if (e.key === 'Enter') {
        searchBtn.click();
    }
}

0

JQuery'de kullanabilirsiniz event.which==13. Eğer varsa form, kullanabilirsiniz $('#formid').submit()(söz konusu formun gönderilmesine doğru olay dinleyicileri eklenmiş olarak).

$('#textfield').keyup(function(event){
   if(event.which==13){
       $('#submit').click();
   }
});
$('#submit').click(function(e){
   if($('#textfield').val().trim().length){
      alert("Submitted!");
   } else {
    alert("Field can not be empty!");
   }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="textfield">
Enter Text:</label>
<input id="textfield" type="text">
<button id="submit">
Submit
</button>



-4

Bu, iyi çalışan küçük bir JavaScript işlevi de yardımcı olabilir:

<script type="text/javascript">
function blank(a) { if(a.value == a.defaultValue) a.value = ""; }

function unblank(a) { if(a.value == "") a.value = a.defaultValue; }
</script> 
<input type="text" value="email goes here" onfocus="blank(this)" onblur="unblank(this)" />

Bu sorunun çözüldüğünü biliyorum, ama sadece başkaları için yararlı olabilecek bir şey buldum.


5
Soru, metin kutusundaki enter tuşuyla bir düğmeyi tıklatmaktı. Çözümünüz "filigran" türü işlevsellik içindir.
kdenney
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.