$ (this) .serialize () — 값을 추가하는 방법?


105

현재 다음이 있습니다.

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize(),
});

이것은 잘 작동하지만 데이터에 값을 추가하고 싶으므로 시도했습니다.

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize() + '&=NonFormValue' + NonFormValue,
});

그러나 그것은 올바르게 게시되지 않았습니다. 직렬화 문자열에 항목을 추가하는 방법에 대한 아이디어가 있습니까? 이것은 특정 양식이 아닌 전역 페이지 변수입니다.


"올바르게 게시하지 않았다"는 의미를 명확히 할 수 있습니까? 어떻게 된 거예요? 서버는 무엇을 받았습니까?
matt b

6
그럴까요 '&NonFormValue=' + NonFormValue?
Wesley Murch 2011-06-30

답변:


103

대신에

 data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

당신은 아마 원합니다

 data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

값에 NonFormValue특수 문자가 포함되어있는 경우 URL 인코딩에주의해야합니다 .


1
에 특수 문자가 encodeURIComponent없는지 확인하기 위해 사용NonFormValue
Yahya Uddin

197

matt b의 답변이 작동하지만을 사용 .serializeArray()하여 양식 데이터에서 배열을 가져 와서 수정하고을 사용 jQuery.param()하여 URL 인코딩 양식으로 변환 할 수도 있습니다. 이런 식으로 jQuery는 추가 데이터의 직렬화를 처리합니다.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});

14
이것은 확실히 최선의 선택입니다. 직렬화를 jQuery에 전적으로 맡기면서 양식에서 검색된 값에 새 값을 추가 할 수있는 기능을 계속 보유합니다.
jcsanyi 2013

5
이 할 수있는 가장 좋은 방법, 문자열없이 연주하다
브렛 그렉 슨

이것은 받아 들여진 대답이어야합니다. 깨끗하고 올바른 방법
Mike Aron

7

첫째로해서는 안됩니다

data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

있다

data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

둘째로 당신은 사용할 수 있습니다

url: this.action + '?NonFormValue=' + NonFormValue,

또는 조치에 이미 매개 변수가 포함 된 경우

url: this.action + '&NonFormValue=' + NonFormValue,

두 번째 답변은 질문이 요청한 것과 동일한 효과가 없습니다. NonFormValuePOST 된 데이터가 아닌 URL 매개 변수로 전송됩니다. 이는 a) 서버 측에서 실행중인 것이 POST (예 : Django request.POST대신 사용)를 예상하는 request.REQUEST경우 또는 b) NonFormValue보안상의 이유로 또는 기록에 URL 표시 줄이나 기록에 표시되지 않아야 하는 경우 이상적이지 않을 수 있습니다. 일시적인 값입니다.
Leigh Brenecki 2013

6

먼저 항목을 추가 한 다음 직렬화합니다.

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});

1
나에게도 효과가 없었습니다. 개체를 확장하지만 예상대로 작동하지 않았습니다.
punitcse

5

항상 할 수 있다는 것을 잊지 마십시오.

<input type="hidden" name="NonFormName" value="NonFormValue" />

실제 형식으로, 경우에 따라 코드에 더 좋을 수 있습니다.


2

우리는 다음과 같이 할 수 있습니다.

data = $form.serialize() + "&foo=bar";

예를 들면 :

var userData = localStorage.getItem("userFormSerializeData");
var userId = localStorage.getItem("userId");

$.ajax({
    type: "POST",
    url: postUrl,
    data: $(form).serialize() + "&" + userData + "&userId=" + userId,
    dataType: 'json',
    success: function (response) {
        //do something
    }
});

0

양식 데이터를 처리하는 추가 함수를 작성할 수 있으며 양식의 데이터 값으로 비 형식 데이터를 추가해야합니다.

<form method="POST" id="add-form">
    <div class="form-group required ">
        <label for="key">Enter key</label>
        <input type="text" name="key" id="key"  data-nonformdata="hai"/>
    </div>
    <div class="form-group required ">
        <label for="name">Ente Name</label>
        <input type="text" name="name" id="name"  data-nonformdata="hello"/>
    </div>
    <input type="submit" id="add-formdata-btn" value="submit">
</form>

그런 다음 양식 처리를 위해이 jquery를 추가하십시오.

<script>
$(document).onready(function(){
    $('#add-form').submit(function(event){
        event.preventDefault();
        var formData = $("form").serializeArray();
        formData = processFormData(formData);
        // write further code here---->
    });
});
processFormData(formData)
{
    var data = formData;
    data.forEach(function(object){
        $('#add-form input').each(function(){
            if(this.name == object.name){
                var nonformData = $(this).data("nonformdata");
                formData.push({name:this.name,value:nonformData});
            }
        });
    });
    return formData;
}


0

이게 더 좋습니다.

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')

이것이 더 나은 접근 방식 인 이유에 대한 자세한 설명을 추가하십시오.
Mark

한 줄 코드로 더 많은 매개 변수에 json 객체를 사용할 수 있습니다.
eugene
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.