“Kiểm soát biểu mẫu không hợp lệ” chỉ trong Google Chrome


106

Đoạn mã dưới đây hoạt động tốt trong Safari nhưng trong Chrome và Firefox, biểu mẫu sẽ không gửi. Bảng điều khiển Chrome ghi lại lỗi An invalid form control with name='' is not focusable. Bất kỳ ý tưởng?

Lưu ý rằng mặc dù các điều khiển bên dưới không có tên, chúng phải có tên tại thời điểm gửi, được điền bởi Javascript bên dưới. Biểu mẫu KHÔNG hoạt động trong Safari.

<form method="POST" action="/add/bundle"> 
<p> 
    <input type="text" name="singular" placeholder="Singular Name" required> 
    <input type="text" name="plural" placeholder="Plural Name" required> 
</p> 
<h4>Asset Fields</h4> 
<div class="template-view" id="template_row" style="display:none"> 
    <input type="text" data-keyname="name" placeholder="Field Name" required> 
    <input type="text" data-keyname="hint" placeholder="Hint"> 
    <select data-keyname="fieldtype" required> 
        <option value="">Field Type...</option> 
        <option value="Email">Email</option> 
        <option value="Password">Password</option> 
        <option value="Text">Text</option> 
    </select>    
    <input type="checkbox" data-keyname="required" value="true"> Required
    <input type="checkbox" data-keyname="search" value="true"> Searchable
    <input type="checkbox" data-keyname="readonly" value="true"> ReadOnly
    <input type="checkbox" data-keyname="autocomplete" value="true"> AutoComplete
    <input type="radio" data-keyname="label" value="label" name="label"> Label
    <input type="radio" data-keyname="unique" value="unique" name="unique"> Unique
    <button class="add" type="button">+</button> 
    <button class="remove" type="button">-</button> 
</div> 

<div id="target_list"></div> 
    <p><input type="submit" name="form.submitted" value="Submit" autofocus></p> 
</form>

<script> 
function addDiv()
{
    var pCount = $('.template-view', '#target_list').length;
    var pClone = $('#template_row').clone();
    $('select, input, textarea', pClone).each(function(idx, el){
        $el = $(this);
        if ((el).type == 'radio'){
            $el.attr('value', pCount + '_' + $el.data('keyname'));
        }
        else {
            $el.attr('name', pCount + '_' + $el.data('keyname'));
        };
    });
    $('#target_list').append(pClone);
    pClone.show();
}

function removeDiv(elem){
    var pCount = $('.template-view', '#target_list').length;
    if (pCount != 1)
    {
        $(elem).closest('.template-view').remove();
    }
};

$('.add').live('click', function(){
    addDiv();
});

$('.remove').live('click', function(){
    removeDiv(this);
});

$(document).ready(addDiv);

</script>

Chỉ những điều khiển thành công mới được gửi đi. Để thành công, điều khiển phải có tên. Có những yêu cầu khác nữa (xem liên kết).
RobG

Các nút radio có tên. Mọi thứ khác được đặt tên thông qua JavaScript.
MFB

Câu trả lời:


247

Chrome muốn tập trung vào một điều khiển được yêu cầu nhưng vẫn trống để nó có thể bật lên thông báo 'Vui lòng điền vào trường này'. Tuy nhiên, nếu điều khiển bị ẩn tại thời điểm Chrome muốn bật lên thông báo, tức là tại thời điểm gửi biểu mẫu, thì Chrome không thể tập trung vào điều khiển vì nó bị ẩn, do đó biểu mẫu sẽ không được gửi.

Vì vậy, để giải quyết vấn đề, khi một điều khiển bị ẩn bởi javascript, chúng ta cũng phải xóa thuộc tính 'bắt buộc' khỏi điều khiển đó.


9
A, thật tệ. Mặc dù vậy, tôi đoán cũng có lý, trình duyệt không thể đoán được cách nó muốn giao diện của bạn đối phó với các thông báo lỗi xác thực nếu trường bị ẩn (có thể là dạng tab ...).
Wesley Murch 12/12/12

12
Cảm ơn, điều này hoạt động. Tuy nhiên, thật đáng tiếc khi Chrome làm điều này, nó sẽ bỏ qua trường này.
472084

Tôi gặp sự cố này trong Chrome dành cho vùng văn bản khi độ dài văn bản trong vùng văn bản là hơn 4100 chữ cái, không có trường bắt buộc ẩn. Khi độ dài văn bản <4000, mọi thứ đều hoạt động, nếu không trong bảng điều khiển, tôi có thể thấy thông báo đó và không thể gửi biểu mẫu
ikos23

Nếu trường không được yêu cầu khi nó bị ẩn, thì thay vào đó, tắt nó có hợp lý hơn không? ( stackoverflow.com/a/22753533/421243 )
David Cook

3
Điều gì sẽ xảy ra nếu lỗi này vẫn xảy ra trên Chrome nhưng trường không trống? Bạn có bất kỳ ý tưởng làm thế nào để giải quyết điều này?
Leah

12

Nó sẽ hiển thị thông báo đó nếu bạn có mã như sau:

<form>
  <div style="display: none;">
    <input name="test" type="text" required/>
  </div>

  <input type="submit"/>
</form>

giải pháp cho vấn đề này sẽ phụ thuộc vào cách trang web sẽ hoạt động

Ví dụ: nếu bạn không muốn gửi biểu mẫu trừ khi trường này là bắt buộc, bạn nên tắt nút gửi

vì vậy mã js để hiển thị div cũng nên bật nút gửi

bạn cũng có thể ẩn nút (nên bị vô hiệu hóa và ẩn vì nếu nó bị ẩn nhưng không bị vô hiệu hóa, người dùng có thể gửi biểu mẫu với người khác theo cách giống như nhấn entertrong bất kỳ trường nào khác nhưng nếu nút bị tắt thì điều này sẽ không xảy ra

nếu bạn muốn biểu mẫu gửi nếu div bị ẩn, bạn nên tắt bất kỳ đầu vào bắt buộc nào bên trong nó và bật các đầu vào trong khi bạn đang hiển thị div

nếu ai đó cần mã để làm điều đó, bạn nên cho tôi biết chính xác những gì bạn cần


Vâng .. bạn có thể vui lòng cho biết giải pháp cho điều này?
Rex Rex

@RexRex Tôi chỉnh sửa câu trả lời xem điều này có giúp được gì cho bạn không hoặc cho tôi biết chính xác bạn cần gì
Robert

@KaziMasumBillah tôi không hiểu bạn bạn có thể viết ví dụ trong câu trả lời xin vui lòng
Robert

9

Nếu bạn không quan tâm đến xác thực HTML5 (có thể bạn đang xác thực trong JS hoặc trên máy chủ), bạn có thể thử thêm "novalidate" vào biểu mẫu hoặc các phần tử đầu vào.


1
người không bao giờ nên làm những việc như rằng ông nên làm cho công việc js mã của mình với html5 html5 không chỉ đóng vì anh ta không thể đối phó với nó
Robert

Tôi không đồng ý. Bạn chỉ cần một lý do chính đáng để làm mọi việc khác đi. Vẫn còn rất nhiều thư viện xác thực mạnh mẽ. Xác thực HTML5 dễ dàng, thiết lập nhanh chóng. Và trên hết nó là tốt để tuân theo các tiêu chuẩn. Nhưng điều đó không có nghĩa rằng đó là giải pháp "tốt nhất". Không bao giờ nói không bao giờ. Nó luôn luôn phụ thuộc. Mặc dù tôi đồng ý rằng bạn nên "không bao giờ" bỏ qua hoàn toàn xác thực ứng dụng. ;-)

5

cố gắng sử dụng các thẻ thích hợp cho các điều khiển HTML5 Giống như cho Số (số nguyên)

<input type='number' min='0' pattern ='[0-9]*' step='1'/>

cho Số thập phân hoặc float

 <input type='number' min='0' step='Any'/>

step = 'Bất kỳ' Nếu không có điều này, bạn không thể gửi biểu mẫu của mình nhập bất kỳ giá trị thập phân hoặc thực nào như 3,5 hoặc 4,6 vào trường trên.

Hãy thử sửa mẫu, nhập cho các điều khiển HTML5 để khắc phục sự cố này.


bạn đã giải quyết vấn đề của tôi. Nhưng chú ý rằng patterndường như không thể chấp nhận được phổ biến trong type="number"lĩnh vực
João Ferreira Pimentel

3

Tôi đã gặp lỗi này và xác định rằng nó thực sự nằm trên một trường không bị ẩn.

Trong trường hợp này, đó là một type="number"trường, bắt buộc phải có. Khi không có giá trị nào được nhập vào trường này, thông báo lỗi sẽ hiển thị trong bảng điều khiển và biểu mẫu không được gửi. Nhập một giá trị rồi xóa giá trị đó có nghĩa là lỗi xác thực được hiển thị như mong đợi.

Tôi tin rằng đây là một lỗi trong Chrome: cách giải quyết của tôi lúc này là đưa ra giá trị ban đầu / mặc định.


Lỗi có thể xảy ra trong Chrome. Cũng xảy ra với tôi. +1
gamliela

1

Tôi đã gặp lỗi:

Điều khiển biểu mẫu không hợp lệ với name = 'telefono' không thể lấy tiêu điểm.

Điều này xảy ra bởi vì tôi đã không sử dụng trường bắt buộc một cách chính xác, trường này đã bật và tắt khi nhấp vào bộ kiểm tra. Giải pháp là loại bỏ requiredthuộc tính bất cứ khi nào hộp kiểm không được đánh dấu và đánh dấu nó theo yêu cầu khi hộp kiểm được đánh dấu.

var telefono = document.getElementById("telefono");  
telefono.removeAttribute("required");

1

Tôi phải làm điều gì đó như thế này để sửa lỗi, vì tôi có một số lỗi type="number"với min="0.00000001":

HTML:

<input type="number" min="0.00000001" step="0.00000001" name="price" value="[%price%]" />

JS:

$('input[type="submit"]').click(function(e) {
    //prevent chrome bug
    $("input:hidden").val(null);
});

Nếu tôi không đặt tất cả trường nhập ẩn thành nullchrome sẽ vẫn cố gắng xác thực đầu vào.


1

Không có xác thực sẽ thực hiện công việc.

<form action="whatever" method="post" novalidate>

0

Tôi gặp sự cố này khi có class = "hidden" trên các trường đầu vào vì tôi đang sử dụng các nút thay vì dấu đầu dòng radio - và thay đổi trạng thái "hoạt động" qua JS.

Tôi chỉ cần thêm một phần trường đầu vào vô tuyến bổ sung của cùng một nhóm mà tôi muốn tin nhắn xuất hiện:

<input type="radio" id="thenorm" name="ppoption" value=""  required style="opacity:0"/>

2 viên đạn hoạt động còn lại là ẩn, viên đạn này thì không và viên đạn này kích hoạt thông báo xác thực và không có lỗi bảng điều khiển - hơi bị hack nhưng những ngày này thì không ..



0

Tôi nhận được thông báo lỗi này khi nhập một số (999999) nằm ngoài dải ô mà tôi đã đặt cho biểu mẫu.

<input type="number" ng-model="clipInMovieModel" id="clipInMovie" min="1" max="10000">

-2
$("...").attr("required"); and $("...").removeAttr("required"); 

không hiệu quả với tôi cho đến khi tôi đặt tất cả mã jQuery của mình vào giữa:

$(document).ready(function() {
    //jQuery code goes here
});

-5

thay thế requiredbằng yêu cầu = "bắt buộc"


2
Bắt buộc là một thuộc tính HTML5 và "bắt buộc" có cùng ý nghĩa với Bắt buộc = 'bắt buộc' vì nó không có sẵn các thuộc tính khác.
İlter
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.