양식의 입력 필드가 제출되지 않도록 중지


114

웹 사이트의 양식에 일부 입력 필드를 삽입하는 자바 스크립트 (greasemonkey / userscript)를 작성 중입니다.

문제는 이러한 입력 필드가 어떤 식 으로든 양식에 영향을 미치고 양식이 제출 될 때 제출되는 것을 원하지 않으며 내 자바 스크립트가 해당 값에 액세스 할 수 있기를 원한다는 것입니다.

양식 중간에 일부 입력 필드를 추가하고 양식을 제출할 때 제출하지 않을 수있는 방법이 있습니까?

분명히 이상적인 것은 입력 필드가 양식 요소에 있지 않는 것이지만 결과 페이지의 레이아웃에서 삽입 된 입력 필드가 원래 양식의 요소 사이에 나타나기를 원합니다.


2
그들이 제출되면 문제는 무엇입니까? 서버 측 언어로 처리 할 필드를 선택할 수 있습니다.
Sarfraz

6
양식이 제출 될 때 이름이 지정되지 않은 양식 요소가 표시되지 않는다고 생각합니다. JS를 작성하여 ID로 참조 할 수 있다면 이름을 비워 두어 제출을 효과적으로 방지 할 수 있습니다.
gddc 2010 년

2
이름 속성 필드를 비워 두십시오
2010 년

@Sarfraz Ahmed : greasemonkey 스크립트를 작성 중이므로 웹 사이트를 제어 할 수 없습니다.
Acorn

11
w3에 따르면 : 양식 제출에 포함됩니다. 필드 (양식 요소)는 양식 요소 내에 정의되어야하며 이름 속성이 있어야합니다. 이름이 없거나 양식에 포함되지 않은 요소는 서버에 제출되지 않습니다.
kennebec 2010 년

답변:


159

"name"속성없이 입력 필드를 삽입 할 수 있습니다.

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

또는 양식이 제출되면 (에서 jQuery) 간단히 제거 할 수 있습니다 .

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

7
이름을 생략하면 제출할 수 없습니까? 멋지다, 나는 그것을 몰랐다. 모든 브라우저에서 작동합니까? 표준의 일부입니까, 아니면 구현상의 문제입니까?
BlairHippo 2010 년

2
@Acorn 나는 완전히 확실하지 않지만 읽을 가치가 있습니다. 기본적으로 "name"속성 값을 생략하면 어떤 방법으로도 해당 값에 액세스 할 수 없으므로 브라우저에서 값을 단순히 버릴 수 있습니다. 안전이 중요하다면 jquery / javascript 옵션을 선택하십시오 (JavaScript가 쉽게 비활성화 될 때 필드가 제출된다는 점에 유의하십시오. 따라서 보안 메커니즘에 의존하지 마십시오).
Gal

17
크롬, 파이어 폭스, 사파리에서 이름 속성을 제외하고 테스트했는데 양식 필드가 이름에 대한 빈 문자열로 서버에 제출되는 것 같습니다. WebScarab을 사용하여 게시물 데이터를 검사 한 결과 데이터가 전송되고 있음을 발견했습니다. 지금은 필드가 제출되지 않도록 비활성화해야한다고 생각합니다.
kldavis4 2012-08-07

1
@ kldavis4-스트라이프 (stripe.js)와 Braintree (braintree.js) [link] braintreepayments.com/docs/python/guide/getting_paid 는 데이터가 서버에 도달하는 것을 막기 위해 "leaving out the name"속성 개념을 사용하는 것 같습니다. 따라서 "PCI"컴플라이언스의 필요성이 줄어 듭니다. "데이터"가 전송되고 있다고 말하면 오류가 있습니까?
Rahul Dighe 2013 년


57

가장 쉬운 방법은 disabled속성이 있는 요소를 삽입하는 것 입니다.

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

이렇게하면 양식의 하위로 계속 액세스 할 수 있습니다.

비활성화 된 필드는 사용자가 필드와 전혀 상호 작용할 수 없다는 단점이 있습니다. 따라서 disabled텍스트 필드 가있는 경우 사용자가 텍스트를 선택할 수 없습니다. disabled확인란 이있는 경우 사용자는 상태를 변경할 수 없습니다.

제출하지 않으려는 필드를 제거하기 위해 양식 제출시 실행되는 자바 스크립트를 작성할 수도 있습니다.


아이디어는 사용자가 확인란 등을 변경 한 다음 내 javascript에 제출할 수 있도록 삽입 된 필드를 사용할 수 있도록하는 것입니다.
Acorn

3
Disabled는 제출시 또는 선택된 확인란에 따라 필드를 비활성화하는 경우에도 작동 할 수 있습니다. 그런 식으로 name재산을 버리는 것이 아니라 나중에 사용하기를 원할 경우 보유하고 싶을 수 있습니다.
JMTyler 2013 년

이것은 AJAX를 사용하여 양식을 제출해야하고 양식에서 입력을 제거하거나 해당 name속성 을 제거하고 싶지 않을 때 유용 합니다.
Nolonar 2014-08-12

15

입력 요소에서 이름 속성 을 제거해보십시오 .
그래서 그것은

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

이 대답 :))이어야한다
최대 Alekz

1
이것은 확인란에서 작동합니다. 그러나 이것은 라디오 버튼과 함께 사용될 때 다른 라디오 버튼의 자동 선택 해제를 깨뜨립니다.
anre

10

추가 옵션을 추가하고 싶었습니다. 입력에 양식 태그를 추가하고 페이지에 존재하지 않는 양식의 이름을 지정하십시오.

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

1
실제로 fakeForm다른 곳에서 정의하지 않는 한 (제출할 필요가 없음)이 결과는 유효하지 않은 HTML이됩니다.
Brian H.

1
자바 스크립트를 추가하고 싶지 않고 사용자 상호 작용을 통해 양식 내부에 입력이 필요한 경우. 이것은 내 관점에서 가장 간단한 해결책입니다.
yannisalexiou

1
참고 :이 솔루션 은 IE에서 작동하지 않습니다 . 여기
Harvey 19

@Harvey Yikes! 알림 주셔서 감사합니다!
Joshua Pinter

9

양식 제출에 포함하지 않으려는 모든 입력 필드에서 속성 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;

2

이 게시물이 오래된 것임을 알고 있지만 어쨌든 답장을 드리겠습니다. 내가 찾은 가장 쉽고 / 가장 좋은 방법은 단순히 이름을 공백으로 설정하는 것입니다.

제출하기 전에 다음을 입력하십시오.

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

모든 제출 기능은 다음과 같습니다.

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

이렇게하면 다른 모든 필드와 함께 양식이 제출되지만 이름이없는 필드는 제출되지 않습니다.


간단하고 간단합니다. 나는 그것을 좋아한다!
pbarney

2

입력에 disabled = "disabled" 를 추가 하고 jquery는 .removeAttr ( 'disabled')를 사용하여 제출하려는 경우 비활성화 된 속성을 제거합니다.

HTML :

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

jquery :

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


2

위의 모든 답변은 양식 컨트롤의 이름을 지정하거나 실제로 양식을 제출하기 전에 프로그래밍 방식으로 제거하는 것에 대한 모든 것을 이미 언급했습니다.

내 연구를 통해이 게시물에서 언급하지 않은 다른 솔루션을 찾았지만
처리되지 않거나 보내지 않으려는 양식 컨트롤을 캡슐화하면 속성 <form>이없는 또 다른 태그 안에 (그리고 분명히 제출 유형 컨트롤이 없습니다) 버튼이나 그 안에 중첩 된 입력 제출)과 같은 경우 상위 양식을 제출하면 캡슐화 된 양식 컨트롤이 포함되지 않습니다.methodpath

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

[name = "notSent"] 제어 값은 처리되지 않고 서버 POST 끝점으로 전송되지 않지만 [name = "sent"]의 값은 처리됩니다.

이 솔루션은 일 화일 수 있지만 여전히 후손을 위해 남겨두고 있습니다 ...


흥미로운 관찰이지만 다양한 브라우저에서 이것을 테스트 했습니까? 디자인에 의한 것인지, 사양에 의한 것인지 아니면 브라우저 동작의 특이한 것인지 궁금합니다. 브라우저가 변화함에 따라 미래에도 신뢰할 수있는 방법이 될까요?
scipilot

1

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>블록 외부에 배치하는 것이 골칫거리 인 경우 페이지가 제출 될 때 양식에서 해당 요소를 제거 할 수 있어야합니다.


예, 사용자 입력을 얻으려고하기 때문에 입력 요소가 필요합니다.
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>

불행히도 양식 속성은 IE / Edge에서 작동하지 않습니다. caniuse.com/#search=form%20attribute
조지 Helyar

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

이것은 매번 나를 위해 작동합니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.