2010-06-09 72 views
82

我正在寫一些JavaScript(一個greasemonkey/userscript),它將在網站上的表單中插入一些輸入字段。停止提交表單中的輸入字段

事情是,我不希望那些輸入字段以任何方式影響表單,我不希望它們在提交表單時提交,我只希望我的javascript能夠訪問它們的值。

有什麼方法可以將一些輸入字段添加到表單的中間,並且在表單提交時沒有提交它們?

顯然,理想的情況是輸入字段不在表單元素中,但是我希望我的結果頁面的佈局使我插入的輸入字段出現在原始表單的元素之間。

+2

什麼問題如果他們提交?您可以選擇以服務器端語言處理哪些字段。 – Sarfraz 2010-06-09 17:01:30

+4

我不相信提交表單時出現了未命名的表單元素 - 如果您可以編寫您的JS以通過ID引用它們,則可以將它們的名稱留空,從而有效地阻止它們提交。 – 2010-06-09 17:02:17

+1

將name屬性字段留空 – deostroll 2010-06-09 17:03:27

回答

122

你可以插入輸入字段沒有「name」屬性:

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

或者一旦形式(jQuery中)提交的,你可以簡單地刪除它們:

$("form").submit(function() { 

    $(this).children('#in-between').remove(); 

}); 
+7

忽略名稱會阻止提交它?很酷,我不知道。這是否適用於所有瀏覽器?它是一個標準的一部分,還是一個實現的怪癖? – BlairHippo 2010-06-09 17:12:20

+0

如果沒有名稱屬性的輸入元素沒有提交,那麼這是一個非常簡單的完美解決方案!這是跨瀏覽器兼容嗎?有人可以確認嗎? – Acorn 2010-06-09 17:14:51

+2

@Acorn我不完全確定,但值得一讀。本質上,如果您省略「name」屬性值,則無法通過任何方法訪問該值......因此,該值可能僅由瀏覽器丟棄。如果對你來說很關鍵,那就去jquery/javascript選項(注意,當javascript被禁用時,這些字段將被提交 - 所以不要依賴你的任何安全機制)。 – Gal 2010-06-09 17:23:29

41

最簡單的做法是插入具有disabled屬性的元素。

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

這樣你仍然可以作爲窗體的子項訪問它們。

已禁用字段的缺點是用戶根本無法與其交互 - 所以如果您有disabled文本字段,用戶將無法選擇文本。如果您有disabled複選框,則用戶無法更改其狀態。

你也可以在表單提交時寫入一些JavaScript來消除你不想提交的字段。

+0

這個想法是爲了我插入的字段是可用的,以便用戶可以更改複選框等,然後將它們提交給我的JavaScript – Acorn 2010-06-09 17:05:04

+0

那麼,然後禁用不會爲你工作:) – Johrn 2010-06-09 17:24:01

+2

殘疾人可以仍然工作,如果你只禁用提交或基於選中複選框的字段。這樣你就不會丟掉'name'屬性,如果你希望稍後使用它,你可能想保留這個屬性。 – JMTyler 2013-03-15 14:55:33

0

處理表單提交在一個函數中通過onSubmit()並執行類似下面的操作來刪除表單元素: 使用getElementById()的DOM,然後使用[object].parentNode.removeChild([object])

假設有問題的領域有一個id屬性「my_removable_field」 代碼:

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

這將讓你你在尋找什麼。

0

你甚至需要它們作爲輸入元素嗎?您可以使用Javascript動態創建div或段落或列表項目或任何包含您想要呈現的信息的內容。

但是,如果交互式元素很重要,並且將這些元素放置在<form>塊之外是個痛處,那麼應該可以在提交頁面時從表單中刪除這些元素。

+0

是的,我確實需要它們作爲輸入元素,因爲我試圖獲取用戶輸入。 – Acorn 2010-06-09 17:23:43

7

您可以編寫一個onsubmit的事件處理函數,該函數從所有您希望不包含在表單提交中的輸入字段中移除name屬性。

這裏有一個快速的未經測試的例子:

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

我知道這個帖子是古老的,但無論如何,我會回答。我找到的最簡單/最好的方法就是簡單地將名稱設置爲空白。前

將這個您的提交:

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

所有在所有提交功能,可能是這樣的:

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

這仍然將提交表單與所有其他領域,而將不要提交沒有名字的人。

+0

簡單而直接。我喜歡! – pbarney 2017-08-23 16:50:44

6

簡單嘗試從輸入元素中刪除名稱屬性。
所以它看起來像

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

這應該是答案:)) – 2016-11-06 17:16:19

+0

這適用於複選框。 但請注意,這將打破與單選按鈕一起使用時另一個單選按鈕的自動取消選擇。 – anre 2017-02-24 19:28:11

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

不幸的是,表單屬性在IE/Edge中不起作用。 http://caniuse.com/#search=form%20attribute – 2016-07-01 16:15:01

0

您需要在您的表單中添加的onsubmit:

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

和腳本會是這樣:

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

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

這對我的作品每次:)

2

輸入添加禁用=「禁用」和jQuery的同時去除

當你想使用.removeAttr提交它禁用(「禁用」)屬性

HTML:

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

的jQuery:

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

4

我只是想增加一個額外的選項:在你輸入添加表單標籤,並指定不網頁上的存在形式的名稱:

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

雖然這可能有效(未測試),除非您實際上在其他地方定義了「fakeForm」(無需提交),這會導致無效的HTML。 – 2017-05-11 10:22:25

+0

如果您不想添加javascript,並且您需要與用戶交互的表單內的輸入。從我的角度來看,這是迄今爲止最簡單的解決方案。 – yannisalexiou 2017-10-29 20:11:01