ป้อนกิจกรรมการกดปุ่มใน JavaScript


330

ฉันมีformสองกล่องข้อความหนึ่งเลือกหล่นลงและเป็นหนึ่งปุ่ม เมื่อenterกดปุ่มฉันต้องการเรียกใช้ฟังก์ชัน Javascript (กำหนดโดยผู้ใช้) แต่เมื่อฉันกดมันจะส่งแบบฟอร์ม

ฉันจะป้องกันไม่ให้มีformการส่งเมื่อenterกดปุ่มได้อย่างไร

คำตอบ:


445
if(characterCode == 13)
{
    return false; // returning false will prevent the event from bubbling up.
}
else
{
    return true;
}

เอาล่ะลองจินตนาการว่าคุณมีกล่องข้อความต่อไปนี้ในรูปแบบ:

<input id="scriptBox" type="text" onkeypress="return runScript(event)" />

เพื่อเรียกใช้สคริปต์ "ผู้ใช้กำหนด" จากกล่องข้อความนี้เมื่อกดปุ่ม Enter และไม่ได้ส่งแบบฟอร์มนี่คือตัวอย่างรหัสบางส่วน โปรดทราบว่าฟังก์ชั่นนี้ไม่ได้ทำการตรวจสอบข้อผิดพลาดใด ๆ และส่วนใหญ่แล้วจะใช้งานได้ใน IE เท่านั้น ในการทำสิ่งนี้ให้ถูกต้องคุณจะต้องมีโซลูชันที่มีประสิทธิภาพมากขึ้น แต่คุณจะได้รับแนวคิดทั่วไป

function runScript(e) {
    //See notes about 'which' and 'key'
    if (e.keyCode == 13) {
        var tb = document.getElementById("scriptBox");
        eval(tb.value);
        return false;
    }
}

การคืนค่าของฟังก์ชั่นจะแจ้งเตือนตัวจัดการเหตุการณ์ว่าจะไม่ทำให้เหตุการณ์เกิดขึ้นอีกและจะป้องกันไม่ให้เหตุการณ์การกดปุ่มถูกจัดการเพิ่มเติม

บันทึก:

จะได้รับออกมาชี้ว่าkeyCodeจะเลิกตอนนี้ ทางเลือกที่ดีที่สุดต่อไปwhichได้นอกจากนี้ยังถูกเลิกใช้

แต่น่าเสียดายที่เป็นมาตรฐานได้รับการสนับสนุนkeyซึ่งได้รับการสนับสนุนอย่างกว้างขวางโดยเบราว์เซอร์ที่ทันสมัยมีบางพฤติกรรมหลบใน IE และขอบ สิ่งใดที่เก่ากว่า IE11 ยังจะต้องมีpolyfill

นอกจากนี้ในขณะที่คำเตือนที่เลิกใช้นั้นค่อนข้างเป็นลางสังหรณ์เกี่ยวกับkeyCodeและwhichการลบสิ่งเหล่านั้นจะเป็นตัวแทนของการเปลี่ยนแปลงครั้งใหญ่ในเว็บไซต์มรดกจำนวนมาก ด้วยเหตุนี้จึงไม่น่าที่พวกเขาจะไปทุกที่ในไม่ช้า


4
คุณหมายถึงอะไรโดยผู้ใช้กำหนด? เช่นเดียวกับผู้ใช้พิมพ์สคริปต์บางอย่างในกล่องข้อความและคุณเรียกใช้โดยใช้ Eval () ???
Josh

1
นี่เป็นสถานการณ์ที่สามารถใช้ PreventDefualt ได้หรือไม่

12
@ Stuart.Sklinar - การทำ eval จากการป้อนข้อมูลที่ผู้ใช้พิมพ์ลงในเบราว์เซอร์ทำให้พวกเขาไม่สามารถควบคุมได้มากไปกว่าถ้าพวกเขาเปิดคอนโซลคำสั่งใน Chrome / FF / IE และพิมพ์สคริปต์เอง บุคคลเดียวที่พวกเขาสามารถทำร้ายได้คือตัวเอง ... เว้นแต่แน่นอนว่าคุณไม่ได้บังคับใช้ความปลอดภัยบนเซิร์ฟเวอร์ นั่นเป็นปัญหาอื่นโดยสิ้นเชิง
Josh

1
@SteelBrain - อีกครั้งให้กล่องข้อความกับคนที่พวกเขาสามารถพิมพ์แล้วevalเนื้อหาโดยการกดปุ่มไม่แตกต่างกันถ้าพวกเขาเปิดเครื่องมือนักพัฒนาและทำมัน หากนี่คือสิ่งที่ได้รับการบันทึกลงในฐานข้อมูลและสามารถเปิดได้โดยผู้ใช้รายอื่นก็จะเป็นเรื่องใหญ่ แต่นั่นเป็นปัญหาที่ไม่ขึ้นอยู่กับตัวอย่างเล็ก ๆ น้อย ๆ นี้อย่างสมบูรณ์
Josh


137

ใช้ทั้งevent.whichและevent.keyCode:

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};

11
ทำไมต้องเป็นทั้ง event.which และ event.keyCode?
Alex Spurling

35
เบราว์เซอร์บางคนสนับสนุนการสนับสนุนอื่นwhichkeyCodeเป็นการดีที่จะรวมทั้งสองอย่างไว้ด้วยกัน
user568109

ใช้keydownกิจกรรมแทนkeyupหรือkeypress
manish_s

@Agiagnoc แต่เหตุการณ์นี้ควรจะแนบกับ?
Don Cheadle

2
@ manish, keypress ให้ข้อมูลเพิ่มเติมแก่คุณในการเล่นมากกว่า keydown / up stackoverflow.com/a/9905293/322537
Hermann Ingjaldsson

78

หากคุณใช้ jQuery:

$('input[type=text]').on('keydown', function(e) {
    if (e.which == 13) {
        e.preventDefault();
    }
});

1
ฉันทำงานนี้ไม่ได้ ตัวจัดการยิง แต่preventDefaultดูเหมือนจะไม่หยุดส่งแบบฟอร์มใน Chrome อย่างน้อย
Drew Noakes

19
คุณต้องใช้เหตุการณ์ keydown แทนการคีย์:$('input[type=text]').on('keydown', function(e) { if (e.which == 13) { e.preventDefault(); } });
Petar Donchev Marinov

2
การกดคีย์ถูกไล่ออกหลังจากส่งแล้วจึงไม่สามารถยกเลิกได้
Pierre-Olivier Vares

ทั้งการกดคีย์และการกดแป้นก็ใช้งานได้สำหรับฉัน ฉันไปด้วยปุ่มกด ขอบคุณ!
markiyanm

'keydown'ถูกต้องเนื่องจากผู้แสดงความคิดเห็นคนอื่นระบุ เนื่องจากยังไม่มีการเปลี่ยนแปลงฉันจะอัปเดตคำตอบ ฉันใช้คำตอบนี้และติดอยู่ครู่หนึ่งจนกระทั่งฉันกลับมาและดูความคิดเห็น
Matt K

71

event.key === "Enter"

อื่น ๆ event.keyที่ผ่านมาและทำความสะอาดมากใช้งาน: ใช้ ไม่มีรหัสตัวเลขอื่น ๆ อีกต่อไป!

const node = document.getElementsByClassName(".mySelect")[0];
node.addEventListener("keydown", function(event) {
    if (event.key === "Enter") {
        event.preventDefault();
        // Do more work
    }
});

เอกสาร Mozilla

เบราว์เซอร์ที่รองรับ


กำลังมองหาสิ่งนี้ เห็นคุณสมบัติหลักในบันทึกคอนโซลของ $ event คิดว่าน่าเชื่อถือกว่านี้
tatsu

นี่ไม่ใช่แค่มาโครหรือชื่อแทนใช่ไหม มีประโยชน์ในแง่ของประสิทธิภาพโดยใช้รหัสนี้หรือไม่
clockw0rk

1
keyCodeเลิกใช้แล้ว สิ่งนี้สามารถอ่านได้และบำรุงรักษาได้ดีกว่าจำนวนเต็มวิเศษในรหัสของคุณ
Gibolt


17

แทนที่การonsubmitกระทำของแบบฟอร์มที่จะเรียกใช้ฟังก์ชันของคุณและเพิ่มผลตอบแทนเท็จหลังจากนั้นคือ:

<form onsubmit="javascript:myfunc();return false;" >

ฉันลาดเทแทนที่ onsubmit ที่ฉันมีอีกรูปแบบหนึ่งในการส่งหน้านี้
Shyju

5
ใช่คุณสามารถ. Javascript เป็นภาษาต้นแบบ document.forms ["form_name"]. onsubmit = fucntion () {}
the_drow

ฉันมีขั้นตอนการลบอื่นที่จะทำงานเมื่อมีการส่งแบบฟอร์มดังนั้นฉันต้องการที่จะรักษาตามที่มันเป็น
Shyju

17

สารละลาย js ตอบสนอง

 handleChange: function(e) {
    if (e.key == 'Enter') {
      console.log('test');
    }


 <div>
    <Input type="text"
       ref = "input"
       placeholder="hiya"
       onKeyPress={this.handleChange}
    />
 </div>

9

ดังนั้นอาจเป็นทางออกที่ดีที่สุดในการครอบคลุมเบราว์เซอร์ให้ได้มากที่สุดและเป็นข้อพิสูจน์ในอนาคต

if (event.which === 13 || event.keyCode === 13 || event.key === "Enter")

6

ถ้าคุณต้องการที่จะทำมันโดยใช้จาวาสคริปต์อย่างหมดจดที่นี่เป็นตัวอย่างที่ทำงานได้อย่างสมบูรณ์แบบ

สมมติว่านี่เป็นไฟล์ html ของคุณ

<!DOCTYPE html>
<html>
  <body style="width: 500px">
    <input type="text" id="textSearch"/> 
      <script type="text/javascript" src="public/js/popup.js"></script>
  </body>
</html>

ในไฟล์popup.jsของคุณเพียงแค่ใช้ฟังก์ชั่นนี้

var input = document.getElementById("textSearch");
input.addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        alert("yes it works,I'm happy ");
    }
});

5

โค้ดด้านล่างจะเพิ่มผู้ฟัง ENTERรหัสในทั้งหน้า

สิ่งนี้มีประโยชน์มากในหน้าจอที่มีปุ่มการกระทำเดียวเช่นเข้าสู่ระบบลงทะเบียนส่ง ฯลฯ

<head>
        <!--Import jQuery IMPORTANT -->
        <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

         <!--Listen to Enter key event-->
        <script type="text/javascript">

            $(document).keypress(function (e) {
                if (e.which == 13 || event.keyCode == 13) {
                    alert('enter key is pressed');
                }
            });
        </script>
    </head>

ทดสอบกับเบราว์เซอร์ทั้งหมด


3

โซลูชัน jQuery

ฉันมาที่นี่เพื่อหาวิธีชะลอการส่งแบบฟอร์มจนกระทั่งหลังจากเหตุการณ์ความพร่ามัวของข้อความถูกยิง

$(selector).keyup(function(e){
  /*
   * Delay the enter key form submit till after the hidden
   * input is updated.
   */

  // No need to do anything if it's not the enter key
  // Also only e.which is needed as this is the jQuery event object.
  if (e.which !== 13) {
       return;
  }

  // Prevent form submit
  e.preventDefault();

  // Trigger the blur event.
  this.blur();

  // Submit the form.
  $(e.target).closest('form').submit();
});

คงจะดีถ้าได้รับรุ่นทั่วไปที่ใช้เหตุการณ์ที่ล่าช้าทั้งหมดแทนที่จะส่งแบบฟอร์ม


3

วิธีที่ง่ายและมีประสิทธิภาพมากจากมุมมองของฉันควรจะ:

function onPress_ENTER()
{
        var keyPressed = event.keyCode || event.which;

        //if ENTER is pressed
        if(keyPressed==13)
        {
            alert('enter pressed');
            keyPressed=null;
        }
        else
        {
            return false;
        }
}

2

ใช้ TypeScript และหลีกเลี่ยงการเรียกหลายรายการในฟังก์ชัน

let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;

function SearchListEnter(event: KeyboardEvent) {
    if (event.which !== 13) {
        return;
    }
    // more stuff
}

คำถามนี้มีอายุมากกว่าแปดปี typescript ไม่มีอยู่แล้ว ดังนั้นคุณแน่ใจหรือไม่ว่าคุณไม่ตอบคำถามอื่น
Nico Haase

2

ง่ายนิดเดียว

อย่าส่งแบบฟอร์มโดยกดปุ่ม "Enter":

<form id="form_cdb" onsubmit="return false">

ดำเนินการฟังก์ชั่นบนปุ่มกด "Enter":

<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">

1

native js (เรียก API)

document.onload = (() => {
    alert('ok');
    let keyListener = document.querySelector('#searchUser');
    // 
    keyListener.addEventListener('keypress', (e) => {
        if(e.keyCode === 13){
            let username = e.target.value;
            console.log(`username = ${username}`);
            fetch(`https://api.github.com/users/${username}`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((user)=>{
                console.log(`user = ${user}`);
            });
            fetch(`https://api.github.com/users/${username}/repos`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((repos)=>{
                console.log(`repos = ${repos}`);
                for (let i = 0; i < repos.length; i++) {
                     console.log(`repos ${i}  = ${repos[i]}`);
                }
            });
        }else{
            console.log(`e.keyCode = ${e.keyCode}`);
        }
    });
})();
<input _ngcontent-inf-0="" class="form-control" id="searchUser" placeholder="Github username..." type="text">


เหตุใดจึงมี client_id ฯลฯ รวมอยู่ที่นี่ รหัสถูกต้องหรือไม่
eddyparkinson

1
<form id="form1" runat="server" onkeypress="return event.keyCode != 13;">

เพิ่มรหัสนี้ในหน้า HTML ของคุณ ... มันจะปิดการใช้งาน ... ใส่ปุ่ม ..


0
<div class="nav-search" id="nav-search">
        <form class="form-search">
            <span class="input-icon">
                <input type="text" placeholder="Search ..." class="nav-search-input" id="search_value" autocomplete="off" />
                <i class="ace-icon fa fa-search nav-search-icon"></i>
            </span>
            <input type="button" id="search" value="Search" class="btn btn-xs" style="border-radius: 5px;">
        </form>

</div>

<script type="text/javascript">
    $("#search_value").on('keydown', function(e) {
        if (e.which == 13) {
             $("#search").trigger('click');
            return false;
        }
    });
    $("#search").on('click',function(){
        alert('You press enter');
    });
</script>

0

โซลูชั่นเบราว์เซอร์ข้าม

เบราว์เซอร์รุ่นเก่าบางรุ่นใช้เหตุการณ์การดาวน์คีย์ในลักษณะที่ไม่ได้มาตรฐาน

KeyBoardEvent.keyเป็นวิธีที่ควรนำมาใช้ในเบราว์เซอร์สมัยใหม่

which และ keyCodeเลิกใช้แล้วในปัจจุบัน แต่ก็ไม่เจ็บที่จะตรวจสอบเหตุการณ์เหล่านี้อย่างไรก็ตามรหัสนี้ใช้ได้สำหรับผู้ใช้ที่ยังคงใช้เบราว์เซอร์รุ่นเก่าเช่น IE

isKeyPressedฟังก์ชั่นการตรวจสอบถ้ากดคีย์ก็ใส่และevent.preventDefault()เป็นอุปสรรคต่อรูปแบบจากการส่ง

  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }

ตัวอย่างการทำงานที่น้อยที่สุด

JS

function isKeyPressed(event, expectedKey, expectedCode) {
  const code = event.which || event.keyCode;

  if (expectedKey === event.key || code === expectedCode) {
    return true;
  }
  return false;
}

document.getElementById('myInput').addEventListener('keydown', function(event) {
  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }
});

HTML

<form>
  <input id="myInput">
</form>

https://jsfiddle.net/tobiobeck/z13dh5r2/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.