IT

완성 화 자바 펼쳐 양식 (프레임 워크 없음)

lottoking 2020. 7. 21. 07:40
반응형

완성 화 자바 펼쳐 양식 (프레임 워크 없음)


jquery 또는 프레임 워크 양식을 사용 화하고 생성 화 된 버전에 액세스 할 수있는 프레임 워크가없는 자바 확장 기능이?


소형 소형화 라이브러리 는 프레임 워크에 의존하지 않습니다. 이와 같은 것 외에 추가 화 기능을 직접 구현해야합니다. (무게 1.2 킬로바이트이지만 사용하지 않는 보장겠습니까?)


순수한 JavaScript 접근 방식은 다음과 가변적입니다.

var form = document.querySelector('form');
var data = new FormData(form);
var req = new XMLHttpRequest();
req.send(data);

POST 요청 만 작동하는 것입니다.

https://developer.mozilla.org/en-US/docs/Web/API/FormData


최신 브라우저 만

URLSearchParamsAPI ( 가장 최근 브라우저 ) 및 생성자FormData(formElement) ( 가장 최근 브라우저 제외 ) 를 지원하는 브라우저를 대상으로하는 경우 다음을 사용하십시오.

new URLSearchParams(new FormData(formElement)).toString()

IE를 보유한 모든 곳

생성자 를 지원 URLSearchParams하지만 지원 하지 않는 브라우저의 경우이 FormData polyfill 및이 코드를 사용하십시오 (IE를 제외한 모든 곳에서 작동).FormData(formElement)

new URLSearchParams(Array.from(new FormData(formElement))).toString()

var form = document.querySelector('form');
var out = document.querySelector('output');

function updateResult() {
  try {
    out.textContent = new URLSearchParams(Array.from(new FormData(form)));
    out.className = '';
  } catch (e) {
    out.textContent = e;
    out.className = 'error';
  }
}

updateResult();
form.addEventListener('input', updateResult);
body { font-family: Arial, sans-serif; display: flex; flex-wrap: wrap; }
input[type="text"] { margin-left: 6px; max-width: 30px; }
label + label { margin-left: 10px; }
output { font-family: monospace; }
.error { color: #c00; }
div { margin-right: 30px; }
<!-- FormData polyfill for older browsers -->
<script src="https://unpkg.com/formdata-polyfill@3.0.17/formdata.min.js"></script>
<div>
  <h3>Form</h3>
  <form id="form">
    <label>x:<input type="text" name="x" value="1"></label>
    <label>y:<input type="text" name="y" value="2"></label>
    <label>
    z:
    <select name="z">
      <option value="a" selected>a</option>
      <option value="b" selected>b</option>
    </select>
  </label>
  </form>
</div>
<div>
  <h3>Query string</h3>
  <output for="form"></output>
</div>

IE 10과 호환

구형 브라우저 (예 : IE 10)의 경우 FormData polyfill , Array.from필요한 경우 polyfill 및이 코드를 사용하십시오.

Array.from(
  new FormData(formElement),
  e => e.map(encodeURIComponent).join('=')
).join('&')

function serialize (form) {
    if (!form || form.nodeName !== "FORM") {
            return;
    }
    var i, j, q = [];
    for (i = form.elements.length - 1; i >= 0; i = i - 1) {
        if (form.elements[i].name === "") {
            continue;
        }
        switch (form.elements[i].nodeName) {
            case 'INPUT':
                switch (form.elements[i].type) {
                    case 'text':
                    case 'tel':
                    case 'email':
                    case 'hidden':
                    case 'password':
                    case 'button':
                    case 'reset':
                    case 'submit':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'checkbox':
                    case 'radio':
                        if (form.elements[i].checked) {
                                q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        }                                               
                        break;
                }
                break;
                case 'file':
                break; 
            case 'TEXTAREA':
                    q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                    break;
            case 'SELECT':
                switch (form.elements[i].type) {
                    case 'select-one':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'select-multiple':
                        for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
                            if (form.elements[i].options[j].selected) {
                                    q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
                            }
                        }
                        break;
                }
                break;
            case 'BUTTON':
                switch (form.elements[i].type) {
                    case 'reset':
                    case 'submit':
                    case 'button':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                }
                break;
            }
        }
    return q.join("&");
}

출처 : http://code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.js


TibTibs의 약간 수정 된 버전은 다음과 가변적입니다.

function serialize(form) {
    var field, s = [];
    if (typeof form == 'object' && form.nodeName == "FORM") {
        var len = form.elements.length;
        for (i=0; i<len; i++) {
            field = form.elements[i];
            if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {
                if (field.type == 'select-multiple') {
                    for (j=form.elements[i].options.length-1; j>=0; j--) {
                        if(field.options[j].selected)
                            s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].value);
                    }
                } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
                    s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value);
                }
            }
        }
    }
    return s.join('&').replace(/%20/g, '+');
}

인코딩 된 필드는 버리고 이름도 URL로 인코딩됩니다. % 20 문자의 정규식은 번만 발생하기 전에 한 번만 발생합니다.

쿼리는 jQuery의 $ .serialize () 메소드의 결과와 동일한 형식입니다.


나는 Johndave Decano의 답변으로 시작했습니다.

이것은 그의 기능에 대한 답변에서 언급 된 몇 가지 문제를 해결해야합니다.

  1. % 20을 + 기호로 바꿉니다.
  2. / 단추 유형은 클릭하여 양식을 신청하는 경우에 처음 출시됩니다.
  3. 리셋 버튼은 무시됩니다.
  4. 어떤 유형에 관계없이 코드가 동일한 작업을 수행하기 때문에 필드 유형에 상관없이 있습니다. 'tel'과 'email'과 같은 HTML5 필드 유형과의 비 전화에도 말할 것도없고 스위치 문으로 대부분의 세부 사항을 제거했습니다.

이름 값이없는 버튼 유형은 여전히 ​​무시됩니다.

function serialize(form, evt){
    var evt    = evt || window.event;
    evt.target = evt.target || evt.srcElement || null;
    var field, query='';
    if(typeof form == 'object' && form.nodeName == "FORM"){
        for(i=form.elements.length-1; i>=0; i--){
            field = form.elements[i];
            if(field.name && field.type != 'file' && field.type != 'reset'){
                if(field.type == 'select-multiple'){
                    for(j=form.elements[i].options.length-1; j>=0; j--){
                        if(field.options[j].selected){
                            query += '&' + field.name + "=" + encodeURIComponent(field.options[j].value).replace(/%20/g,'+');
                        }
                    }
                }
                else{
                    if((field.type != 'submit' && field.type != 'button') || evt.target == field){
                        if((field.type != 'checkbox' && field.type != 'radio') || field.checked){
                            query += '&' + field.name + "=" + encodeURIComponent(field.value).replace(/%20/g,'+');
                        }   
                    }
                }
            }
        }
    }
    return query.substr(1);
}

이것이 현재이 기능을 사용하는 방법입니다.

<form onsubmit="myAjax('http://example.com/services/email.php', 'POST', serialize(this, event))">

json 형식의 POST를 사용하여 "myForm"을 사용하여 다음을 수행 할 수 있습니다.

const formEntries = new FormData(myForm).entries();
const json = Object.assign(...Array.from(formEntries, ([x,y]) => ({[x]:y})));
fetch('/api/foo', {
  method: 'POST',
  body: JSON.stringify(json)
});

두 번째 줄은 다음과 같은 배열에서 변환됩니다.

[["firstProp", "firstValue"], ["secondProp", "secondValue"], ...and so on... ]

... 다음과 같은 일반 객체로

{"firstProp": "firstValue", "secondProp": "secondValue", ...and so on ... }

... mapFn을 Array.from ()에 전달하여이 변환을 수행합니다. 이 mapFn은 각 [ "a", "b"] 쌍에 적용되어 { "a": "b"}로 변환되어 배열에 하나의 속성 만있는 많은 객체가 포함됩니다. mapFn은 "파괴"를 사용하여 쌍의 첫 번째 부분과 두 부분의 이름을 가져오고 ES6 "ComputedPropertyName"을 사용하여 mapFn이 반환 한 속성 이름을 설정합니다 (이것이 "[x] :"x : 무엇인가 "가 아닌"뭔가 ".

이 모든 단일 속성은 모든 단일 속성 개체를 가진 모든 속성을 가진 단일 개체로 병합하는 Object.assign () 함수의 인수로 전달됩니다.

Array.from () : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

매개 변수의 파괴 : https://simonsmith.io/destructuring-objects-as-function-parameters-in-es6/

: 자세한 내용은 여기 계산 된 속성 이름에 자바 객체 리터럴에서 속성 이름과 변수?


모든 브라우저에서 작동합니다.

const formSerialize = formElement => {
  const values = {};
  const inputs = formElement.elements;

  for (let i = 0; i < inputs.length; i++) {
    values[inputs[i].name] = inputs[i].value;
  }
  return values;
}

const dumpValues = form => () => {
  
  const r = formSerialize(form);
  console.log(r);
  console.log(JSON.stringify(r));
}

const form = document.querySelector('form');

dumpValues(form)();

form.addEventListener('change',dumpValues(form));
<form action="/my-handling-form-page" method="post">
  <div>
    <label for="name">Name:</label>
    <input type="text" id="name" name="user_name" value="John">
  </div>
  <div>
    <label for="mail">E-mail:</label>
    <input type="email" id="mail" name="user_mail" value="john@jonhson.j">
  </div>
  <div>
    <label for="interests">Interest:</label>
    <select required=""  id="interests" name="interests">
      <option value="" selected="selected">- None -</option>
      <option value="drums">Drums</option>
      <option value="js">Javascript</option>
      <option value="sports">Sports</option>
      <option value="trekking">Trekking</option>
    </select>
  </div>
  <div>
    <label for="msg">Message:</label>
    <textarea id="msg" name="user_message">Hello My Friend</textarea>
  </div>
</form>


이벤트의 입력을 입력 화하려는 경우. 여기에 내가 사용하는 순수한 JavaScript가 있습니다.

// serialize form
var data = {};
var inputs = [].slice.call(e.target.getElementsByTagName('input'));
inputs.forEach(input => {
  data[input.name] = input.value;
});

데이터는 입력의 JavaScript 객체입니다.


약간 변수를 사용하고 forEach루프 속도 ( fors 보다 약간 빠름 ) 약간을 이용하는 코드 @SimonSteinberger의 리팩토링 된 버전

function serialize(form) {
    var result = [];
    if (typeof form === 'object' && form.nodeName === 'FORM')
        Array.prototype.slice.call(form.elements).forEach(function(control) {
            if (
                control.name && 
                !control.disabled && 
                ['file', 'reset', 'submit', 'button'].indexOf(control.type) === -1
            )
                if (control.type === 'select-multiple')
                    Array.prototype.slice.call(control.options).forEach(function(option) {
                        if (option.selected) 
                            result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(option.value));
                    });
                else if (
                    ['checkbox', 'radio'].indexOf(control.type) === -1 || 
                    control.checked
                ) result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(control.value));
        });
        return result.join('&').replace(/%20/g, '+');
}

HTMLElement.prototype.serialize = function(){
    var obj = {};
    var elements = this.querySelectorAll( "input, select, textarea" );
    for( var i = 0; i < elements.length; ++i ) {
        var element = elements[i];
        var name = element.name;
        var value = element.value;

        if( name ) {
            obj[ name ] = value;
        }
    }
    return JSON.stringify( obj );
}

이렇게 사용 된 광고

var dataToSend = document.querySelector("form").serialize();

도움이 되셨기를 바랍니다.


나는 TibTibs 답변을 훨씬 더 명확하게 리팩토링했습니다. 80 자 너비와 약간의 주석으로 인해 조금 더 경쟁합니다.

또한 빈 필드 이름과 빈 값은 무시합니다.

// Serialize the specified form into a query string.
//
// Returns a blank string if +form+ is not actually a form element.
function $serialize(form, evt) {
  if(typeof(form) !== 'object' && form.nodeName !== "FORM")
    return '';

  var evt    = evt || window.event || { target: null };
  evt.target = evt.target || evt.srcElement || null;
  var field, query = '';

  // Transform a form field into a query-string-friendly
  // serialized form.
  //
  // [NOTE]: Replaces blank spaces from its standard '%20' representation
  //         into the non-standard (though widely used) '+'.
  var encode = function(field, name) {
    if (field.disabled) return '';

    return '&' + (name || field.name) + '=' +
           encodeURIComponent(field.value).replace(/%20/g,'+');
  }

  // Fields without names can't be serialized.
  var hasName = function(el) {
    return (el.name && el.name.length > 0)
  }

  // Ignore the usual suspects: file inputs, reset buttons,
  // buttons that did not submit the form and unchecked
  // radio buttons and checkboxes.
  var ignorableField = function(el, evt) {
    return ((el.type == 'file' || el.type == 'reset')
        || ((el.type == 'submit' || el.type == 'button') && evt.target != el)
        || ((el.type == 'checkbox' || el.type == 'radio') && !el.checked))
  }

  var parseMultiSelect = function(field) {
    var q = '';

    for (var j=field.options.length-1; j>=0; j--) {
      if (field.options[j].selected) {
        q += encode(field.options[j], field.name);
      }
    }

    return q;
  };

  for(i = form.elements.length - 1; i >= 0; i--) {
    field = form.elements[i];

    if (!hasName(field) || field.value == '' || ignorableField(field, evt))
      continue;

    query += (field.type == 'select-multiple') ? parseMultiSelect(field)
                                               : encode(field);
  }

  return (query.length == 0) ? '' : query.substr(1);
}

@moison answer 및 MDN 에서 formData의 항목 () 메소드를 가져 왔습니다 .

FormData.entries () 메서드는 객체에 포함 된 모든 키 / 값을 통과 할 수있는 반복 반환합니다. 각 쌍의 키는 USVString 객체입니다. USVString 또는 Blob 값입니다.

그러나 유일한 문제는 모바일 브라우저 (android 및 safari는 지원되지 않음)와 IE 및 Safari 데스크톱도

그러나 기본적으로 여기에 내 접근 방식이 있습니다.

let theForm =  document.getElementById("contact"); 

theForm.onsubmit = function(event) {
    event.preventDefault();

    let rawData = new FormData(theForm);
    let data = {};

   for(let pair of rawData.entries()) {
     data[pair[0]] = pair[1]; 
    }
    let contactData = JSON.stringify(data);
    console.warn(contactData);
    //here you can send a post request with content-type :'application.json'

};

코드는 여기 에서 사용할 수 있습니다


  // supports IE8 and IE9 
  function serialize(form) {
    var inputs = form.elements;
    var array = [];
    for(i=0; i < inputs.length; i++) {
      var inputNameValue = inputs[i].name + '=' + inputs[i].value;
      array.push(inputNameValue);
    }
    return array.join('&');
  }
 //using the serialize function written above
 var form = document.getElementById("form");//get the id of your form. i am assuming the id to be named form.
 var form_data = serialize(form);
 var xhr = new XMLHttpRequest();
 xhr.send(form_data);

 //does not work with IE8 AND IE9
 var form = document.querySelector('form');
 var data = new FormData(form);
 var xhr = new XMLHttpRequest();
 xhr.send(data);

JavaScript reduce 함수를 사용하면 IE9가 모든 브라우저에서 트릭을 수행해야합니다.

Array.prototype.slice.call(form.elements) // convert form elements to array
    .reduce(function(acc,cur){   // reduce 
        var o = {type : cur.type, name : cur.name, value : cur.value}; // get needed keys
        if(['checkbox','radio'].indexOf(cur.type) !==-1){
            o.checked = cur.checked;
        } else if(cur.type === 'select-multiple'){{
            o.value=[];
            for(i=0;i<cur.length;i++){
                o.value.push({
                    value : cur.options[i].value,
                    selected : cur.options[i].selected
                });
            }
        }
        acc.push(o);
        return acc;
 },[]);

라이브 예는 다음과 가변적입니다.

var _formId = document.getElementById('formId'),
    formData = Array.prototype.slice.call(_formId.elements).reduce(function(acc,cur,indx,arr){
        var i,o = {type : cur.type, name : cur.name, value : cur.value};
        if(['checkbox','radio'].indexOf(cur.type) !==-1){
            o.checked = cur.checked;
        } else if(cur.type === 'select-multiple'){
            o.value=[];
            for(i=0;i<cur.length;i++){
                o.value.push({
                    value : cur.options[i].value,
                    selected : cur.options[i].selected
                });
            }
        }
        acc.push(o);
        return acc;
    },[]);

// view
document.getElementById('formOutput').innerHTML = JSON.stringify(formData, null, 4);
<form id="formId">
    <input type="text" name="texttype" value="some text">
    <select>
        <option value="Opt 1">Opt 1</option>
        <option value="Opt 2" selected>Opt 2</option>
        <option value="Opt 3">Opt 3</option>
    </select>
    <input type="checkbox" name="checkboxtype" value="Checkbox 1" checked> Checkbox 1
    <input type="checkbox" name="checkboxtype" value="Checkbox 2"> Checkbox 2
    <input type="radio" name="radiotype" value="Radio Btn 1"> Radio Btn 1
    <input type="radio" name="radiotype" value="Radio Btn 2" checked> Radio Btn 2
    <select multiple>
        <option value="Multi 1" selected>Multi 1</option>
        <option value="Multi 2">Saab</option>
        <option value="Multi 3" selected>Multi 3</option>
    </select>
</form>
<pre><code id="formOutput"></code></pre>


document.serializeForm = function (selector) {
     var dictionary = {};
     var form = document.querySelector(selector);
     var formdata = new FormData(form);
     var done = false;
     var iterator = formdata.entries();
     do {
         var prop = iterator.next();
         if (prop.done && !prop.value) {
             done = true;
         }
         else {
             dictionary[prop.value[0]] = prop.value[1];
         }

     } while (!done);
     return dictionary;
}

필요한 목적으로 도움이 될 수 있습니다.

function print_form_data(form) {
    const form_data = new FormData(form);

    for (const item of form_data.entries()) {
        console.log(item);
    }

    return false;
}

이것이 효과가 있기 때문입니다.

var serializeForm = (formElement) => {
  const formData = {};
  const inputs = formElement.elements;

  for (let i = 0; i < inputs.length; i++) {
    if(inputs[i].name!=="")
        formData[inputs[i].name] = inputs[i].value;
  }
  return formData;
}

나는 미쳤을 수있는 답변이 심각하게 부풀어 오른 것을 발견했습니다. 여기 내 해결책이 있습니다.

function serialiseForm(form) {
  var input = form.getElementsByTagName("input");
  var formData = {};
  for (var i = 0; i < input.length; i++) {
    formData[input[i].name] = input[i].value;
  }
  return formData = JSON.stringify(formData);
}

참고 URL : https://stackoverflow.com/questions/11661187/form-serialize-javascript-no-framework

반응형