Ngăn không cho gửi trường nhập trong biểu mẫu


113

Tôi đang viết một số javascript (greasemonkey / userscript) sẽ chèn một số trường đầu vào vào một biểu mẫu trên một trang web.

Vấn đề là, tôi không muốn những trường đầu vào đó ảnh hưởng đến biểu mẫu theo bất kỳ cách nào, tôi không muốn chúng được gửi khi biểu mẫu được gửi, tôi chỉ muốn javascript của tôi có quyền truy cập vào các giá trị của chúng.

Có cách nào tôi có thể thêm một số trường đầu vào vào giữa biểu mẫu và không gửi chúng khi biểu mẫu được gửi không?

Rõ ràng điều lý tưởng là để các trường đầu vào không nằm trong phần tử biểu mẫu, nhưng tôi muốn bố cục của trang kết quả có các trường đầu vào được chèn của tôi xuất hiện giữa các phần tử của biểu mẫu ban đầu.


2
có vấn đề gì nếu họ được gửi? Bạn có thể chọn trường nào để xử lý bằng ngôn ngữ phía máy chủ.
Sarfraz

6
Tôi không tin rằng các phần tử biểu mẫu chưa được đặt tên sẽ hiển thị khi một biểu mẫu được gửi - nếu bạn có thể viết JS của mình để tham chiếu đến chúng theo ID, bạn có thể để trống tên của chúng, ngăn chúng gửi một cách hiệu quả.
gddc

2
để trống trường thuộc tính tên
deostroll

@Sarfraz Ahmed: Tôi đang viết tập lệnh Greasemonkey, vì vậy tôi không có quyền kiểm soát trang web.
Acorn

11
Theo w3: Được đưa vào biểu mẫu gửi. một trường (phần tử biểu mẫu) phải được xác định trong phần tử biểu mẫu và phải có một thuộc tính tên. Các phần tử không có tên hoặc không có trong biểu mẫu sẽ không được gửi đến máy chủ.
kennebec

Câu trả lời:


158

Bạn có thể chèn các trường đầu vào mà không có thuộc tính "name":

<input type="text" id="in-between" />

Hoặc bạn có thể chỉ cần xóa chúng sau khi biểu mẫu được gửi (trong jQuery):

$("form").submit(function() {
   $(this).children('#in-between').remove();
});

7
Bỏ qua tên ngăn không cho nó được gửi? Tuyệt, tôi không biết điều đó. Điều này có hoạt động trên tất cả các trình duyệt không? Nó là một phần của tiêu chuẩn, hay nó là một câu hỏi thực hiện?
BlairHippo

2
@Acorn Tôi không hoàn toàn chắc chắn, nhưng nó rất đáng để đọc. Về cơ bản, nếu bạn bỏ qua giá trị thuộc tính "name", bạn không thể truy cập giá trị đó thông qua bất kỳ phương thức nào ... vì vậy, có thể giá trị đó chỉ bị trình duyệt loại bỏ. Nếu điều quan trọng là an toàn cho bạn, hãy chọn tùy chọn jquery / javascript (chỉ cần lưu ý rằng các trường SẼ được gửi khi javascript dễ bị vô hiệu hóa - vì vậy đừng dựa vào bất kỳ cơ chế bảo mật nào của bạn vào nó).
Gal

17
Tôi đã thử nghiệm loại bỏ thuộc tính name với chrome, firefox, safari và có vẻ như các trường biểu mẫu đang được gửi đến máy chủ với một chuỗi trống cho tên. Tôi đã kiểm tra dữ liệu bài đăng bằng cách sử dụng WebScarab và nhận thấy rằng dữ liệu đang được gửi. Hiện tại, tôi đoán mình sẽ phải vô hiệu hóa các trường để ngăn chúng được gửi.
kldavis4

1
@ kldavis4 - có vẻ như cả sọc (sọc.js) và Braintree (braintree.js) [link] braintreepayments.com/docs/python/guide/getting_paid đều sử dụng khái niệm thuộc tính "bỏ qua tên" để ngăn dữ liệu truy cập vào máy chủ do đó giảm nhu cầu tuân thủ "PCI" ... nếu bạn nói rằng "dữ liệu" đang được gửi đi có phải chúng bị lỗi không?
Rahul Dighe


57

Điều dễ dàng nhất để làm là chèn các phần tử có disabledthuộc tính.

<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" />

Bằng cách này, bạn vẫn có thể truy cập chúng khi là con của biểu mẫu.

Các trường bị vô hiệu hóa có nhược điểm là người dùng không thể tương tác với chúng - vì vậy nếu bạn có disabledtrường văn bản, người dùng không thể chọn văn bản. Nếu bạn có một disabledhộp kiểm, người dùng không thể thay đổi trạng thái của nó.

Bạn cũng có thể viết một số javascript để kích hoạt khi gửi biểu mẫu để xóa các trường bạn không muốn gửi.


Ý tưởng là để các trường đã chèn của tôi có thể sử dụng được để người dùng có thể thay đổi các hộp kiểm, v.v. và sau đó gửi chúng tới javascript của tôi.
Acorn

3
Đã tắt vẫn có thể hoạt động, nếu bạn chỉ tắt các trường gửi đi hoặc dựa trên hộp kiểm đang được chọn. Bằng cách đó, bạn không chỉ vứt bỏ nametài sản, mà bạn có thể muốn giữ lại nếu muốn sử dụng sau này.
JMTyler

Điều này thật tuyệt khi bạn phải gửi biểu mẫu bằng AJAX và không muốn xóa đầu vào của mình khỏi biểu mẫu hoặc xóa namethuộc tính của chúng .
Nolonar

15

Đơn giản, hãy thử xóa thuộc tính name khỏi phần tử đầu vào.
Vì vậy, nó phải trông giống như

<input type="checkbox" checked="" id="class_box_2" value="2">

Đây sẽ là câu trả lời :))
Máxima Alekz

1
Điều này hoạt động cho các hộp kiểm. Tuy nhiên, lưu ý rằng điều này sẽ phá vỡ tính năng tự động bỏ chọn của nút radio khác khi được sử dụng với các nút radio.
anre 24/02/17

10

Tôi chỉ muốn thêm một tùy chọn bổ sung: Trong đầu vào của bạn, hãy thêm thẻ biểu mẫu và chỉ định tên của biểu mẫu không tồn tại trên trang của bạn:

<input form="fakeForm" type="text" readonly value="random value" />

1
trong khi điều này có thể hoạt động (chưa được kiểm tra), trừ khi bạn thực sự xác định fakeFormở nơi khác (không cần gửi) điều này dẫn đến HTML không hợp lệ.
Brian H.

1
Nếu bạn không muốn thêm javascript và bạn cần đầu vào bên trong biểu mẫu với sự tương tác của người dùng. Đây là giải pháp đơn giản nhất theo quan điểm của tôi.
yannisalexiou

1
LƯU Ý: Giải pháp này không hoạt động với IE . Kiểm tra ở đây
Harvey

@Harvey Yikes! Cảm ơn cho những người đứng đầu lên!
Joshua Pinter

9

Bạn có thể viết một trình xử lý sự kiện để onsubmitxóa namethuộc tính khỏi tất cả các trường đầu vào mà bạn không muốn đưa vào biểu mẫu gửi.

Đây là một ví dụ nhanh chưa được kiểm tra:

var noSubmitElements = [ 'someFormElementID1', 'someFormElementID2' ]; //...
function submitForm() {
    for( var i = 0, j = noSubmitElements.length; i < j; i++ ) {
        document.getElementById(noSubmitElements[i]).removeAttribute('name');
    }
}
form.onsubmit = submitForm;

2

Tôi biết bài đăng này là cổ xưa, nhưng tôi sẽ trả lời dù sao. Cách dễ nhất / tốt nhất mà tôi đã tìm thấy là chỉ cần đặt tên thành trống.

Đặt cái này trước khi bạn gửi:

document.getElementById("TheInputsIdHere").name = "";

Tất cả trong tất cả chức năng gửi của bạn có thể trông giống như sau:

document.getElementById("TheInputsIdHere").name = "";
document.getElementById("TheFormsIdHere").submit();

Thao tác này sẽ vẫn gửi biểu mẫu với tất cả các trường khác của bạn, nhưng sẽ không gửi biểu mẫu không có tên.


Đơn giản và dễ hiểu. Tôi thích nó!
pbarney

2

Thêm vô hiệu hóa = "bị vô hiệu hóa" vào đầu vào và trong khi jquery xóa thuộc tính bị vô hiệu hóa khi bạn muốn gửi nó bằng cách sử dụng .removeAttr ('bị vô hiệu hóa')

HTML:

<input type="hidden" name="test" value="test" disabled='disabled'/>

jquery:

$("input[name='test']").removeAttr('disabled');


2

Tất cả các câu trả lời ở trên đã nói lên mọi thứ về việc (không) đặt tên cho các điều khiển biểu mẫu hoặc xóa chúng theo chương trình trước khi thực sự gửi biểu mẫu của bạn.

Mặc dù, trong quá trình nghiên cứu, tôi đã tìm thấy một giải pháp khác mà tôi chưa thấy được đề cập trong bài đăng này:
Nếu bạn đóng gói các điều khiển biểu mẫu mà bạn muốn không xử lý / không gửi, bên trong một <form>thẻ khác không có methodthuộc tính cũng như path(và rõ ràng là không có điều khiển loại gửi như một nút hoặc gửi đầu vào được lồng trong đó), thì việc gửi biểu mẫu gốc sẽ không bao gồm các điều khiển biểu mẫu đóng gói đó.

<form method="POST" path="/path">
  <input type="text" name="sent" value="..." />
  <form>
    <input type="text" name="notSent" value="..." />
  </form>
  <input type="submit" name="submit" value="Submit" />
</form>

Giá trị điều khiển [name = "notSent"] sẽ không được xử lý cũng như không được gửi đến điểm cuối POST của máy chủ, nhưng giá trị từ [name = "sent"] sẽ.

Giải pháp này có thể chỉ là một giai thoại nhưng tôi vẫn để lại cho hậu thế ...


Quan sát thú vị nhưng bạn đã thử nghiệm điều này trên các trình duyệt khác nhau chưa? Tôi tự hỏi liệu đó là do thiết kế, do đặc điểm kỹ thuật hay chỉ là một hành vi sai lầm của trình duyệt. Nó sẽ là một phương pháp đáng tin cậy trong tương lai khi trình duyệt thay đổi?
scipilot

1

Xử lý việc gửi biểu mẫu trong một hàm thông qua onSubmit () và thực hiện điều gì đó giống như bên dưới để loại bỏ phần tử biểu mẫu: Sử dụng getElementById()DOM, sau đó sử dụng[object].parentNode.removeChild([object])

giả sử trường của bạn được đề cập có mã thuộc tính id "my_removable_field":

var remEl = document.getElementById("my_removable_field");
if ( remEl.parentNode && remEl.parentNode.removeChild ) {
remEl.parentNode.removeChild(remEl);
}

Điều này sẽ giúp bạn có được chính xác những gì bạn đang tìm kiếm.


0

Bạn thậm chí có cần chúng là các yếu tố đầu vào ngay từ đầu không? Bạn có thể sử dụng Javascript để tạo động các div hoặc đoạn văn hoặc liệt kê các mục hoặc bất cứ thứ gì có chứa thông tin bạn muốn trình bày.

Nhưng nếu yếu tố tương tác là quan trọng và việc đặt những yếu tố đó bên ngoài <form>khối là điều khó khăn, thì bạn sẽ có thể xóa những yếu tố đó khỏi biểu mẫu khi trang được gửi.


Có, tôi cần chúng làm yếu tố đầu vào vì tôi đang cố lấy thông tin đầu vào của người dùng.
Acorn

0
$('#serialize').click(function () {
  $('#out').text(
    $('form').serialize()
  );
});

$('#exclude').change(function () {
  if ($(this).is(':checked')) {
    $('[name=age]').attr('form', 'fake-form-id');
  } else {
    $('[name=age]').removeAttr('form');    
  }
  
  $('#serialize').click();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/">
  <input type="text" value="John" name="name">
  <input type="number" value="100" name="age">
</form>

<input type="button" value="serialize" id="serialize">
<label for="exclude">  
  <input type="checkbox" value="exclude age" id="exclude">
  exlude age
</label>

<pre id="out"></pre>

Rất tiếc, thuộc tính biểu mẫu không hoạt động trong IE / Edge. caniuse.com/#search=form%20attribute
George Helyar

0

Bạn cần thêm onsubmit tại biểu mẫu của mình:

<form action="YOUR_URL" method="post" accept-charset="utf-8" onsubmit="return validateRegisterForm();">

Và kịch bản sẽ như thế này:

        function validateRegisterForm(){
        if(SOMETHING IS WRONG)
        { 
            alert("validation failed");
            event.preventDefault();
            return false;

        }else{
            alert("validations passed");
            return true;
        }
    }

Điều này làm việc cho tôi mọi lúc :)

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.