Gửi biểu mẫu bằng cách nhấn enter mà không có nút gửi


322

Vâng, tôi đang cố gắng gửi một biểu mẫu bằng cách nhấn enter nhưng không hiển thị nút gửi. Tôi không muốn truy cập JavaScript nếu có thể vì tôi muốn mọi thứ hoạt động trên tất cả các trình duyệt (cách duy nhất mà tôi biết là với các sự kiện).

Ngay bây giờ hình thức trông như thế này:

<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>

Mà hoạt động khá tốt. Nút gửi hoạt động khi người dùng nhấn enter và nút này không hiển thị trong Firefox, IE, Safari, Opera và Chrome. Tuy nhiên, tôi vẫn không thích giải pháp vì thật khó để biết liệu nó có hoạt động trên tất cả các nền tảng với tất cả các trình duyệt hay không.

Bất cứ ai có thể đề nghị một phương pháp tốt hơn? Hoặc điều này là tốt như nó được?


7
Điểm nhỏ có thể loại bỏ một vài ký tự khỏi CSS của bạn và thường sẽ được thực hiện tự động là công cụ khai thác - bạn không cần các đơn vị cho các phép đo độ dài bằng không. 0px = 0pt = 0em = 0em, v.v.
pwdst

@pwdst cảm ơn vì đã chỉ ra điều này - Tôi đến từ thế giới Python, vì vậy "rõ ràng là tốt hơn ngầm" và thực sự tự hỏi liệu đây có phải là trường hợp trong CSS hay người tạo CSS có thành ngữ khác không?
ericmjl

2
Không là ngoại lệ cho quy tắc ở đây @ericmjl - 0px == 0em == 0% == 0vh == 0vh, v.v. Trong các phép đo độ dài (khác không), nó không chỉ thực hành xấu mà còn chống lại các tiêu chuẩn không chỉ định đơn vị và bạn sẽ thấy các hành vi khác nhau trong các tác nhân người dùng (trình duyệt). Xem developer.mozilla.org/en-US/docs/Web/CSS/lengthdự thảo.csswg.org/css
values

2
Nếu nghi ngờ, hãy đặt một đơn vị độ dài rõ ràng bằng các từ khác.
pwdst

3
Mặc dù việc thêm đơn vị bằng 0 chắc chắn không gây hại gì, nhưng không có bất kỳ giá trị nào phải hợp lệ 100% bất kể ngôn ngữ, thực tế là tất cả các cách trở lại trừu tượng toán học. OTOH, một cách sử dụng hữu ích so với việc không có chúng là để truyền tải thông điệp cho dù tài sản đã cho là "thực sự có nghĩa là 0, và giữ nguyên như vậy" (không có đơn vị), so với "điều đó bây giờ bằng không," nhưng có thể được điều chỉnh theo sở thích; hoặc bất cứ điều gì ... "(với đơn vị).
Sz.

Câu trả lời:


237

Thử:

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

Điều đó sẽ đẩy nút waaay sang trái, ra khỏi màn hình. Điều tuyệt vời với điều này là, bạn sẽ có được sự xuống cấp duyên dáng khi CSS bị vô hiệu hóa.

Cập nhật - Cách giải quyết cho IE7

Theo đề xuất của Bryan Downing + với tabindexđể ngăn tab chạm tới nút này (bởi Ates Goral):

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

9
Chỉ cần thử giải pháp này trong IE7 với kết quả tương tự như Erebus. Đoạn mã sau sửa nó:position: absolute; width: 1px; height: 1px; left: -9999px;
Bryan Downing

84
Thật là một vụ hack khủng khiếp :( tại sao HTML lại như thế này ngay từ đầu? Có lý do chính đáng nào để nhập không hoạt động trong trường hợp này không?
nornagon

28
@nornagon: Nếu bạn cảm thấy rằng vụ hack này thật kinh khủng, hãy thoải mái đề xuất một cách ít kinh khủng hơn. HTML chính là ...
Ates Goral

13
@MooseFactorytabindex="-1"
Ates Goral

14
"Điều tốt đẹp là ... sự xuống cấp duyên dáng khi CSS bị vô hiệu hóa"?! Ý tôi là chắc chắn, điều này hoạt động rất tốt, nhưng phần "xuống cấp duyên dáng" chỉ là chiến thuật tiếp thị. Tôi thậm chí đã không nghe về nó cho đến khi tôi tìm thấy trang này từ năm 2002 . Đúng vậy, kết quả Google duy nhất trên trang đầu tiên cho "css bị vô hiệu hóa trong trình duyệt" là từ 10 năm trước (hoặc 7 xem xét câu trả lời này đã được đưa ra vào năm 2009).
Vicky Chijwani

97

Tôi nghĩ bạn nên đi theo con đường Javascript, hoặc ít nhất là tôi sẽ:

<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
tốt đẹp, thử nghiệm và làm việc tốt. Nhưng trước khi thử một cái gì đó như thế này, hãy nhớ rằng việc gửi biểu mẫu qua Javascript sẽ không khiến một số trình duyệt cung cấp công cụ lưu mật khẩu.
andyk

3
Điều này sẽ khiến nút gửi xuất hiện trong giây lát (cho đến khi trang tải và JS chạy).
nornagon

15
Một phím nhấn cũng được kích hoạt cho một lựa chọn từ tự động hoàn thành, tức là nếu người dùng đang nhập địa chỉ email và anh ấy / cô ấy chọn một địa chỉ được cung cấp trước đó từ trình duyệt tự động hoàn tất bằng cách nhấn enter, thì biểu mẫu của bạn sẽ được gửi. Không phải những gì người dùng của bạn sẽ mong đợi.
cburgmer

2
Tôi đã chuyển sang keydowntừ keypressđể được hỗ trợ rộng hơn, nhưng bạn cũng cần thêm e.preventDefault();trước ifnếu bạn muốn hỗ trợ Chrome.
Campbeln

1
@Campbeln bạn có thể sử dụng .on('keypress'...)thay thế. Các tài liệu cho .on()giống như nó thực hiện .preventDefault()cuộc gọi cho bạn.
jinglểula

79

Bạn đã thử điều này?

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

Vì hầu hết các trình duyệt đều hiểu visibility:hiddenvà nó không thực sự hoạt động như vậy display:none, nên tôi đoán rằng nó sẽ ổn thôi. Không thực sự tự kiểm tra nó, vì vậy CMIIW.


3
chỉ có một điều về visibility: hidden: như bạn có thể đọc trong w3schools , tính trực quan : không có gì vẫn ảnh hưởng đến bố cục. Nếu bạn muốn tránh khoảng trắng này, giải pháp với định vị tuyệt đối có vẻ tốt hơn đối với tôi.
loybert

8
Bạn có thể kết hợp cả hai giải pháp:<input type="submit" style="visibility: hidden; position: absolute;" />
VaclavSir

2
Chết tiệt, cái này không hoạt động trong IE8 (nó không gửi biểu mẫu), vì vậy giải pháp từ bên trên chiến thắng:position: absolute; left: -100px; width: 1px; height: 1px;
VaclavSir

31

Một giải pháp khác không có nút gửi:

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
Kỳ lạ. Rằng bạn thực hiện nút của bạn vào một hộp văn bản! Nhưng vì thủ thuật này hoạt động cho tất cả các trình duyệt, tôi đã ghi có cho bạn!
Lá Jenna

cảm ơn @JennaLeaf ;-) Dù sao tôi nghĩ rằng nó không quá kỳ lạ - rất nhiều hình thức trực tuyến sử dụng như gửi "kích hoạt" đơn giản của khóa phím. Một ví dụ có thể là thanh tìm kiếm google (có lẽ họ không sử dụng chính xác mã này, nhưng có lẽ là một cái gì đó tương tự).
damoiser 17/05/2016

16

Đối với bất kỳ ai nhìn vào câu trả lời này trong tương lai, HTML5 sẽ triển khai một thuộc tính mới cho các thành phần của biểu mẫu hidden, sẽ tự động áp dụng display:nonecho phần tử của bạn.

ví dụ

<input type="submit" hidden />

Mặc dù có vẻ như hoạt động với Chrome trên máy tính để bàn nhưng dường như nó không hoạt động với Chrome hoặc Safari trên iPhone.
Ulf Adams

@UlfAdams Nó hoạt động với Chrome và Safari trên iPhone 12.1.2.
Matthew Campbell

13

Sử dụng mã sau, điều này đã khắc phục sự cố của tôi trong cả 3 trình duyệt (FF, IE và Chrome):

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

Thêm dòng trên là dòng đầu tiên trong mã của bạn với giá trị tên và giá trị phù hợp.


7

Thay vì hack mà bạn hiện đang sử dụng để ẩn nút, việc đặt visibility: collapse;thuộc tính style sẽ đơn giản hơn nhiều . Tuy nhiên, tôi vẫn khuyên bạn nên sử dụng một chút Javascript đơn giản để gửi biểu mẫu. Theo tôi hiểu, hỗ trợ cho những thứ như vậy là phổ biến hiện nay.


7

Chỉ cần đặt thuộc tính ẩn thành true:

<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
Thuộc tính ẩn sẽ vô hiệu hóa trình bằng cách nhấn enter.
66Ton99

@ 66Ton99 Chỉ cần thử nghiệm trong FF. Nó không vô hiệu hóa đệ trình
Eugen Konkov

1
"Nó hoạt động trên máy của tôi";) có nhiều trình duyệt hơn firefox. người ta có thể muốn một giải pháp hoạt động đáng tin cậy trên nhiều trình duyệt.
Félix Gagnon-Grenier

Hoạt động trên Chrome 63
piotr_cz

Không hoạt động trong Chrome hoặc Safari trên iPhone tại thời điểm này.
Ulf Adams

7

Cách thức thanh lịch nhất để thực hiện việc này là giữ nút gửi, nhưng đặt đường viền, phần đệm và cỡ chữ thành 0.

Điều này sẽ làm cho kích thước nút 0x0.

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

Bạn có thể tự mình thử điều này và bằng cách đặt phác thảo cho phần tử bạn sẽ thấy một dấu chấm, đó là đường viền bên ngoài "bao quanh" phần tử 0x0 px.

Không cần tầm nhìn: ẩn, nhưng nếu nó khiến bạn ngủ vào ban đêm, bạn cũng có thể ném nó vào hỗn hợp.

Fiddle


5

IE không cho phép nhấn phím ENTER để gửi biểu mẫu nếu nút gửi không hiển thị và biểu mẫu có nhiều trường. Cung cấp cho nó những gì nó muốn bằng cách cung cấp hình ảnh trong suốt 1x1 pixel dưới dạng nút gửi. Tất nhiên nó sẽ chiếm một pixel của bố cục, nhưng hãy nhìn những gì bạn phải làm để ẩn nó.

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

4

Đây là giải pháp của tôi, đã được thử nghiệm trong Chrome, Firefox 6 và IE7 +:

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

Có vẻ như IE8 không thích vị trí: tuyệt đối, nó không gửi.
maxxyme

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

Điều này hoạt động tốt và nó là phiên bản rõ ràng nhất về những gì bạn đang cố gắng đạt được.

Lưu ý rằng có một sự khác biệt giữa display:nonevisibility:hiddencho các yếu tố hình thức khác.


4

Giải pháp HTML5

<input type="submit" hidden />

Tương tự như trên - không hoạt động với Chrome hoặc Safari trên iPhone.
Ulf Adams


2

Đối với những người có vấn đề với IE và cho những người khác.

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

Tôi vẫn sẽ sử dụng vị trí: tuyệt đối, float ảnh hưởng đến bố cục.
SuperDuck

Có vẻ như IE8 không thích vị trí: tuyệt đối, nó không gửi. Tôi sử dụng:
maxxyme

Tương tự cho float: left;, khi loại bỏ, nó gửi.
maxxyme

2

Bạn cũng có thể thử cái này

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

Bạn có thể bao gồm một hình ảnh với width / height = 0 px


1
QUAN TRỌNG: bạn PHẢI sử dụng URL hình ảnh hợp lệ hoặc Firefox sẽ hiển thị văn bản "Gửi truy vấn" trên trang của bạn
PH.

2
Nếu bạn thêm một hình ảnh tồn tại và đặt chiều cao và chiều rộng bằng 0 hoặc thêm một hình ảnh không tồn tại thì trình duyệt sẽ phải thực hiện một yêu cầu GET lãng phí cho tài nguyên.
pwdst

2

Tôi làm việc với một loạt các khung UI. Nhiều người trong số họ có một lớp tích hợp mà bạn có thể sử dụng để ẩn trực quan mọi thứ.

Bootstrap

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

Vật liệu góc

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

Những bộ óc thông minh đã tạo ra những khung này đã định nghĩa những phong cách này như sau:

.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

Tôi đã thêm nó vào một chức năng trên tài liệu đã sẵn sàng. Nếu không có nút gửi trên biểu mẫu (tất cả Biểu mẫu hộp thoại Jquery của tôi không có nút gửi), hãy thêm nó vào.

$(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);
    });
}

0
input.on('keypress', function(event) {
    if ( event.which === 13 ) {
        form.submit();
        return false;
    }
});

-2

Tôi đã sử dụng:

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

và:

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

trong tệp .css. Nó làm việc kỳ diệu cho tôi quá. :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.