ส่งแบบฟอร์มโดยการกดปุ่ม Enter โดยไม่ต้องกดปุ่มส่ง


322

ฉันพยายามส่งแบบฟอร์มโดยกด Enter แต่ไม่แสดงปุ่มส่ง ฉันไม่ต้องการเข้าใช้ JavaScript ถ้าเป็นไปได้เพราะฉันต้องการให้ทุกอย่างทำงานบนเบราว์เซอร์ทั้งหมด (วิธีเดียวที่ฉันรู้คือ JS กับกิจกรรม)

ตอนนี้แบบฟอร์มมีลักษณะดังนี้:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" style="height: 0px; width: 0px; border: none; padding: 0px;" hidefocus="true" />
</form>

ซึ่งใช้งานได้ดีทีเดียว ปุ่มส่งทำงานได้เมื่อผู้ใช้กด Enter และปุ่มจะไม่แสดงใน Firefox, IE, Safari, Opera และ Chrome อย่างไรก็ตามฉันยังคงไม่ชอบวิธีแก้ปัญหาเนื่องจากยากที่จะทราบว่าจะใช้งานได้กับทุกแพลตฟอร์มกับเบราว์เซอร์ทั้งหมดหรือไม่

ทุกคนสามารถแนะนำวิธีที่ดีกว่าได้ไหม หรือสิ่งนี้เกี่ยวกับดีเท่าที่ได้รับ?


7
จุดเล็ก ๆ ที่อาจโกน CSS ของคุณออกไปเล็กน้อยและโดยทั่วไปจะทำโดยอัตโนมัติเป็นตัวขยาย - คุณไม่จำเป็นต้องใช้หน่วยสำหรับการวัดความยาวศูนย์ 0px = 0pt = 0em = 0em เป็นต้น
pwdst

@ pwdst ขอบคุณที่ชี้ให้เห็น - ฉันมาจากโลก Python ดังนั้น "ชัดเจนดีกว่าโดยปริยาย" และแท้จริงสงสัยว่าเป็นกรณีนี้ใน CSS หรือผู้สร้าง CSS มีสำนวนที่แตกต่างกันอย่างไร
ericmjl

2
Zero เป็นข้อยกเว้นของกฎที่นี่ @ericmjl - 0px == 0em == 0% == 0vh == 0vh ฯลฯ ในการวัดความยาวอื่น ๆ (ไม่เป็นศูนย์) ไม่เพียง แต่เป็นการปฏิบัติที่ไม่ดี แต่เทียบกับมาตรฐานที่ไม่ระบุหน่วยและ คุณจะเห็นพฤติกรรมที่แตกต่างกันในตัวแทนผู้ใช้ (เบราว์เซอร์) ดูdeveloper.mozilla.org/en-US/docs/Web/CSS/lengthและdrafts.csswg.org/css-values-3/#lengths
pwdst

2
หากมีข้อสงสัยให้ใส่หน่วยความยาวอย่างชัดเจนในคำอื่น ๆ
pwdst

3
ในขณะที่มันไม่เจ็บที่จะเพิ่มหน่วยด้วย 0 แต่ไม่ควรมี 100% ที่ถูกต้องโดยไม่คำนึงถึงภาษาในความเป็นจริงทุกอย่างกลับไปสู่นามธรรมทางคณิตศาสตร์ OTOH การใช้อย่างมีประโยชน์ของการมีและไม่มีพวกมันคือการสื่อข้อความว่าทรัพย์สินที่ให้นั้นเป็น "จริง ๆ แล้วหมายถึงเป็น 0 และอยู่ในลักษณะนั้น" (ไม่มีหน่วย), และ "สิ่งนี้เกิดขึ้นเป็นศูนย์ตอนนี้ แต่อาจปรับให้เข้ากับรสนิยมหรืออะไรก็ได้ ... "(พร้อมหน่วย)
Sz.

คำตอบ:


237

ลอง:

<input type="submit" style="position: absolute; left: -9999px"/>

ที่จะกดปุ่ม waaay ไปทางซ้ายออกจากหน้าจอ สิ่งที่ดีในการทำเช่นนี้คือคุณจะได้รับการเสื่อมสลายอย่างงดงามเมื่อปิดการใช้งาน CSS

ปรับปรุง - วิธีแก้ปัญหาสำหรับ IE7

ตามที่แนะนำโดย Bryan Downing + with tabindexเพื่อป้องกันแท็บถึงปุ่มนี้ (โดย Ates Goral):

<input type="submit" 
       style="position: absolute; left: -9999px; width: 1px; height: 1px;"
       tabindex="-1" />

9
เพิ่งลองวิธีแก้ปัญหานี้ใน IE7 ด้วยผลลัพธ์เช่นเดียวกับ Erebus รหัสต่อไปนี้แก้ไขได้:position: absolute; width: 1px; height: 1px; left: -9999px;
Bryan Downing

84
อะไรที่น่ากลัวสับ :( ทำไม HTML ที่เป็นเช่นนี้ในสถานที่แรกคือมีเหตุผลที่ดีสำหรับใส่ไม่ได้ไปทำงานในกรณีนี้หรือไม่?
nornagon

28
@nornagon: หากคุณรู้สึกว่าแฮ็คนี้แย่มากอย่าลังเลที่จะแนะนำแฮ็คที่น่ากลัวน้อยกว่า HTML คือว่ามันคืออะไร ...
Ates กวางผา

13
@MooseFactorytabindex="-1"
Ates Goral

14
"สิ่งที่ดีคือ ... การย่อยสลายที่งดงามเมื่อปิดการใช้งาน CSS"! ฉันหมายความว่ามันใช้งานได้ดี แต่ส่วน "ความเสื่อมโทรมที่สง่างาม" เป็นเพียงกลยุทธ์ทางการตลาด ผมไม่เคยได้ยินแม้แต่ของมันจนกว่าฉันพบหน้านี้จากปี 2002 ปี ถูกต้องแล้วผลลัพธ์ของ Google เพียงรายการเดียวในหน้าแรกของ "css ถูกปิดใช้งานในเบราว์เซอร์" นั้นมาจาก10 ปีที่แล้ว (หรือ 7 เมื่อพิจารณาว่าคำตอบนี้วางในปี 2009)
Vicky Chijwani

97

ฉันคิดว่าคุณควรไปเส้นทาง Javascript หรืออย่างน้อยฉันจะ:

<script type="text/javascript">
// Using jQuery.

$(function() {
    $('form').each(function() {
        $(this).find('input').keypress(function(e) {
            // Enter pressed?
            if(e.which == 10 || e.which == 13) {
                this.form.submit();
            }
        });

        $(this).find('input[type=submit]').hide();
    });
});
</script>


<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" />
</form>

6
เป็นคนดีผ่านการทดสอบและทำงานได้ดี แต่ก่อนที่จะลองทำสิ่งนี้โปรดจำไว้ว่าการส่งแบบฟอร์มผ่าน Javascript จะไม่ทำให้เบราว์เซอร์บางตัวเสนอการบันทึกรหัสผ่าน
andyk

3
สิ่งนี้จะทำให้ปุ่มส่งปรากฏขึ้นชั่วครู่ (จนกว่าหน้าจะโหลดและ JS ทำงาน)
nornagon

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

2
ฉันเปลี่ยนkeydownจากเป็นkeypressเพื่อการสนับสนุนที่กว้างขึ้น แต่คุณต้องเพิ่มe.preventDefault();ก่อนifถ้าคุณหวังว่าจะสนับสนุน Chrome
Campbeln

1
@Campbeln คุณอาจใช้.on('keypress'...)แทนได้ เอกสารที่.on()มีหน้าตาคล้าย ๆ กันจะ.preventDefault()เรียกร้องให้คุณ
jinglesthula

79

คุณเคยลองสิ่งนี้หรือไม่?

<input type="submit" style="visibility: hidden;" />

เนื่องจากเบราว์เซอร์ส่วนใหญ่เข้าใจvisibility:hiddenและใช้งานไม่ได้จริง ๆdisplay:noneฉันจึงเดาว่าน่าจะใช้ได้ ยังไม่ได้ทดสอบด้วยตัวเองจริงๆดังนั้น CMIIW


3
มีเพียงสิ่งหนึ่งที่เกี่ยวกับvisibility: hidden: ในขณะที่คุณสามารถอ่านในw3schools , visibity: ไม่มียังคงส่งผลกระทบต่อรูปแบบ หากคุณต้องการหลีกเลี่ยงช่องว่างนี้ทางออกที่มีตำแหน่งแน่นอนน่าจะดีกว่าสำหรับฉัน
Loybert

8
คุณสามารถรวมโซลูชันทั้งสอง:<input type="submit" style="visibility: hidden; position: absolute;" />
VaclavSir

2
ประณามมันไม่ทำงานใน IE8 (มันไม่ได้ส่งแบบฟอร์ม) ดังนั้นทางออกจากด้านบนชนะ:position: absolute; left: -100px; width: 1px; height: 1px;
VaclavSir

31

โซลูชันอื่นที่ไม่มีปุ่มส่ง:

HTML

<form>
  <input class="submit_on_enter" type="text" name="q" placeholder="Search...">
</form>

jQuery

$(document).ready(function() {

  $('.submit_on_enter').keydown(function(event) {
    // enter has keyCode = 13, change it if you want to use another button
    if (event.keyCode == 13) {
      this.form.submit();
      return false;
    }
  });

});

1
เคล็ดลับแปลก ๆ คุณทำให้ปุ่มของคุณเป็นกล่องข้อความ! แต่เนื่องจากกลอุบายนั้นใช้ได้กับทุกเบราว์เซอร์ฉันจึงให้เครดิตคุณ!
เจนน่าลีฟ

ขอบคุณ @JennaLeaf ;-) อย่างไรก็ตามฉันคิดว่ามันไม่แปลกนัก - มีหลายรูปแบบออนไลน์ที่ใช้ในการส่งเพียงแค่ "ทริกเกอร์" ของ keydown ตัวอย่างอาจเป็น google search-bar (บางทีพวกเขาอาจไม่ได้ใช้รหัสนี้อย่างแน่นอน แต่อาจเป็นสิ่งที่คล้ายกัน)
damoiser

16

สำหรับใครก็ตามที่ดูคำตอบนี้ในอนาคต HTML5 จะใช้คุณสมบัติใหม่สำหรับองค์ประกอบของแบบฟอร์ม hiddenซึ่งจะนำไปใช้โดยอัตโนมัติdisplay:noneไปกับองค์ประกอบของคุณ

เช่น

<input type="submit" hidden />

แม้ว่าดูเหมือนว่าจะทำงานกับเดสก์ท็อป Chrome แต่ดูเหมือนว่าจะไม่ทำงานกับ Chrome หรือ Safari บน iPhone
Ulf Adams

@UlfAdams ใช้งานได้กับ Chrome และ Safari บน iPhone 12.1.2
Matthew Campbell

13

ใช้รหัสต่อไปนี้แก้ไขปัญหาของฉันในเบราว์เซอร์ทั้ง 3 (FF, IE และ Chrome):

<input  type="submit" name="update" value=" Apply " 
    style="position: absolute; height: 0px; width: 0px; border: none; padding: 0px;"
    hidefocus="true" tabindex="-1"/>

เพิ่มบรรทัดด้านบนเป็นบรรทัดแรกในรหัสของคุณด้วยค่าชื่อและค่าที่เหมาะสม


7

แทนที่จะเป็นการแฮ็คที่คุณใช้เพื่อซ่อนปุ่มมันจะง่ายกว่ามากหากตั้งค่าvisibility: collapse;ในลักษณะของสไตล์ อย่างไรก็ตามฉันขอแนะนำให้ใช้ Javascript ง่ายๆเพื่อส่งแบบฟอร์ม เท่าที่ฉันเข้าใจการสนับสนุนสิ่งต่าง ๆ ในปัจจุบันเป็นที่แพร่หลาย


7

เพียงตั้งค่าแอตทริบิวต์ที่ซ่อนไว้เป็นจริง:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" hidden="true" />
</form>

4
แอตทริบิวต์ที่ซ่อนอยู่จะปิดใช้งานการส่งโดยกด Enter
66Ton99

@ 66Ton99 เพียงทดสอบใน FF ไม่ปิดใช้งานการส่ง
Eugen Konkov

1
"ใช้งานได้กับเครื่องของฉัน";) มีเบราว์เซอร์มากกว่า Firefox เยอะ เราสามารถต้องการโซลูชันที่ทำงานข้ามเบราว์เซอร์ได้อย่างน่าเชื่อถือ
Félix Gagnon-Grenier

ใช้งานได้กับ Chrome 63
piotr_cz

ไม่สามารถใช้งานได้ใน Chrome หรือ Safari บน iPhone ในขณะนี้
Ulf Adams

7

วิธีที่ดีที่สุดในการทำเช่นนี้คือการคงปุ่มส่งไว้ แต่ตั้งค่าเป็นขอบการเว้นระยะห่างและขนาดแบบอักษรเป็น 0

สิ่งนี้จะทำให้ขนาดของปุ่ม 0x0

<input type="submit" style="border:0; padding:0; font-size:0">

คุณสามารถลองด้วยตัวคุณเองและโดยการตั้งเค้าร่างให้กับองค์ประกอบคุณจะเห็นจุดซึ่งเป็นเส้นขอบด้านนอก "ล้อม" องค์ประกอบ 0x0 px

ไม่จำเป็นต้องมีทัศนวิสัย: ซ่อนเร้น แต่ถ้ามันทำให้คุณนอนตอนกลางคืนคุณสามารถโยนมันลงไปในส่วนผสมได้เช่นกัน

JS Fiddle


5

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

<input type="image" src="img/1x1trans.gif"/>

4

นี่คือโซลูชันของฉันผ่านการทดสอบใน Chrome, Firefox 6 และ IE7 +:

.hidden{
    height: 1px;
    width: 1px;
    position: absolute;
    z-index: -100;
}

ดูเหมือนว่า IE8 ไม่ชอบตำแหน่ง: แน่นอนไม่ส่ง
maxxyme

4
<input type="submit" style="display:none;"/>

ใช้งานได้ดีและเป็นรุ่นที่ชัดเจนที่สุดของสิ่งที่คุณพยายามจะทำ

โปรดทราบว่ามีความแตกต่างระหว่างdisplay:noneและvisibility:hiddenสำหรับองค์ประกอบรูปแบบอื่น ๆ




2

สำหรับผู้ที่มีปัญหากับ IE และสำหรับคนอื่นด้วย

{
    float: left;
    width: 1px;
    height: 1px;
    background-color: transparent;
    border: none;
}

ฉันยังคงใช้ตำแหน่ง: แน่นอนลอยมีผลต่อรูปแบบ
SuperDuck

ดูเหมือนว่า IE8 ไม่ชอบตำแหน่ง: แน่นอนไม่ส่ง ฉันใช้:
maxxyme

เช่นเดียวกับfloat: left;เมื่อลบจะส่ง
maxxyme

2

คุณสามารถลองสิ่งนี้

<INPUT TYPE="image" SRC="0piximage.gif" HEIGHT="0" WIDTH="0" BORDER="0">

คุณสามารถรวมภาพที่มีความกว้าง / ความสูง = 0 px


1
สำคัญ: คุณต้องใช้ URL รูปภาพที่ถูกต้องมิฉะนั้น Firefox จะแสดงข้อความ "ส่งคำค้นหา" ในหน้าของคุณ
PH

2
หากคุณเพิ่มรูปภาพที่มีอยู่และตั้งค่าความสูงและความกว้างเป็นศูนย์หรือเพิ่มรูปภาพที่ไม่มีอยู่เบราว์เซอร์จะต้องทำการร้องขอ GET ที่สูญเปล่าสำหรับทรัพยากร
pwdst

2

ฉันทำงานกับเฟรมเวิร์ก UI จำนวนมาก หลายคนมีคลาสในตัวคุณสามารถใช้เพื่อซ่อนสิ่งต่าง ๆ ได้

เงินทุน

<input type="submit" class="sr-only" tabindex="-1">

วัสดุเชิงมุม

<input type="submit" class="cdk-visually-hidden" tabindex="-1">

จิตใจที่ยอดเยี่ยมที่สร้างกรอบเหล่านี้ได้กำหนดสไตล์เหล่านี้ดังนี้:

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.cdk-visually-hidden {
    border: 0;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    outline: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
}

1

ฉันเพิ่มไปยังฟังก์ชันในเอกสารพร้อม หากไม่มีปุ่มส่งในแบบฟอร์ม (แบบฟอร์มกล่องโต้ตอบ Jquery ของฉันทั้งหมดไม่มีปุ่มส่ง) ให้ต่อท้าย

$(document).ready(function (){
    addHiddenSubmitButtonsSoICanHitEnter();
});
function addHiddenSubmitButtonsSoICanHitEnter(){
    var hiddenSubmit = "<input type='submit' style='position: absolute; left: -9999px; width: 1px; height: 1px;' tabindex='-1'/>";
    $("form").each(function(i,el){
        if($(this).find(":submit").length==0)
            $(this).append(hiddenSubmit);
    });
}


-2

ฉันเคยใช้:

<input class="hidden" type="submit" value="" 
onclick="document.getElementById('loginform').submit();"/>

และ:

 .hidden {
        border:0;
        padding:0;
        font-size:0;
        width: 0px;
        height: 0px;
    }

ในไฟล์. css มันทำงานได้อย่างน่าอัศจรรย์สำหรับฉันด้วย :)

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