ฉันจะใช้ form.serialize ของ jQuery ได้อย่างไร แต่ไม่รวมช่องว่าง


107

ฉันมีแบบฟอร์มการค้นหาที่มีการป้อนข้อความและรายการแบบเลื่อนลงจำนวนหนึ่งที่ส่งผ่าน GET ฉันต้องการมี URL การค้นหาที่สะอาดกว่าโดยการลบช่องว่างออกจากสตริงคำค้นหาเมื่อทำการค้นหา

var form = $("form");  
var serializedFormStr = form.serialize();  
// I'd like to remove inputs where value is '' or '.' here
window.location.href = '/search?' + serializedFormStr

มีความคิดอย่างไรที่ฉันจะทำสิ่งนี้โดยใช้ jQuery?

คำตอบ:


167

ฉันดูเอกสาร jQueryแล้วและฉันคิดว่าเราสามารถทำได้ในบรรทัดเดียวโดยใช้ตัวเลือก :

$("#myForm :input[value!='']").serialize() // does the job!

เห็นได้ชัดว่า #myForm ได้รับองค์ประกอบที่มี id "myForm" แต่สิ่งที่ไม่ค่อยชัดเจนสำหรับฉันในตอนแรกคือต้องใช้อักขระเว้นวรรคระหว่าง #myForm และ: input เนื่องจากเป็นตัวดำเนินการที่สืบทอดมา

: อินพุตตรงกับองค์ประกอบอินพุตพื้นที่ข้อความเลือกและปุ่มทั้งหมด

[value! = '']เป็นแอตทริบิวต์ที่ไม่เท่ากับตัวกรอง สิ่งที่แปลก (และเป็นประโยชน์) คือทั้งหมด:ประเภทองค์ประกอบอินพุตมีคุณสมบัติค่าแม้กระทั่งเลือกและช่องทำเครื่องหมายเป็นต้น

สุดท้ายยังลบอินพุตที่ค่าคือ "." (ตามที่กล่าวไว้ในคำถาม):

$("#myForm :input[value!=''][value!='.']").serialize()

ในกรณีนี้การตีข่าวคือการวางตัวเลือกแอตทริบิวต์สองตัวติดกันหมายถึง AND การใช้ลูกน้ำหมายถึง OR ขออภัยหากเห็นได้ชัดสำหรับคน CSS!


3
@Mvision นั่นเป็นเพราะมีการละเว้นเล็กน้อย แต่มีนัยสำคัญในคำตอบนี้ สำหรับผิวธรรมดา / ตัวเลือก CSS บริสุทธิ์ใน jQuery 1.8 และก่อนหน้านี้[value]ตรงกับองค์ประกอบใด ๆ กับแอตทริบิวต์value ปัจจุบัน , รวมทั้งผู้ที่มีค่าว่าง (หรือไม่มีเลย) ค่า สาเหตุนี้เกิดจากข้อบกพร่องใน jQuery เวอร์ชันก่อนหน้านี้ที่สร้างความไม่สอดคล้องกันระหว่างรูปแบบบางอย่างinput[value]และ:input[value]. ยกตัวอย่างเช่น<input value="foo"><input value=""><input value><input>; ข้อบกพร่องดังกล่าวแสดงอยู่ในซอนี้
โย

4
สำหรับฉันสิ่งนี้ได้ผล: $form.find(":input[value]")- ไม่ได้เลือกช่องว่าง ไม่ได้ผล: $form.find(":input[value!='']")- เลือกทุกช่อง หวังว่าจะช่วยใครบางคน (jQuery 2.0.0)
Ryan Wheale

1
$form.find(":input[value]")ทำงานให้ฉันด้วย (jQuery 1.11.0)
GSTAR

ใช้ได้เฉพาะเมื่อมีvalueแอตทริบิวต์อยู่แล้ว มันไม่รู้จักมันเป็นอย่างอื่น
starcorn

1
ในบางกรณีที่valueตั้งค่าโดยใช้โปรแกรมจะไม่ทำงาน ( valueจะไม่มีอยู่ในแอตทริบิวต์ HTML แต่จะเป็นแอตทริบิวต์ข้อมูลในอินพุต) $('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()ในกรณีดังกล่าวลองนี้ แก้ไข: เพิ่งเห็นคำตอบของ Rich สำหรับผลกระทบเดียวกัน
Fateh Khalsa

54

ฉันไม่สามารถทำให้โซลูชันของ Tom ทำงานได้ (?) แต่ฉันสามารถทำได้โดยใช้.filter()ฟังก์ชันสั้น ๆ เพื่อระบุช่องว่าง ฉันใช้ jQuery 2.1.1

var formData = $("#formid :input")
    .filter(function(index, element) {
        return $(element).val() != '';
    })
    .serialize();

2
ไม่สามารถรับคำตอบที่ได้รับการอนุมัติในการทำงาน แต่มันใช้งานได้ดี ขอบคุณ!
bfritz

ตอบคำถามของฉันเอง: " :inputโดยทั่วไปตัวเลือกจะเลือกตัวควบคุมฟอร์มทั้งหมดเลือกองค์ประกอบอินพุตพื้นที่ข้อความเลือกและปุ่มทั้งหมด" ที่มา
Dinei

อือทอมแตกแล้ว ของคุณสะอาดกว่าความพยายามของฉันในการเล่นซอนั้นด้วย Up'd
Hashbrown

11

สิ่งนี้ใช้ได้กับฉัน:

data = $( "#my_form input").filter(function () {
        return !!this.value;
    }).serialize();

การโทรกลับเป็นการปล่อยให้ค่าที่ส่งคืนเป็นจริง!!พิมพ์อะไรก็ได้เพื่อบูลคุณสามารถลองได้ในคอนโซล !!('test'), !!(5),!!(0)
Aiphee

2
และแทนที่จะเป็นinputตัวเลือกควรจะ:inputรวมตัวเลือกไว้ด้วย
Aiphee

ฉันขอแนะนำการเปลี่ยนแปลงนี้:data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Mahoor13

9

คุณสามารถทำได้ด้วยนิพจน์ทั่วไป ...

var orig = $('#myForm').serialize();
var withoutEmpties = orig.replace(/[^&]+=\.?(?:&|$)/g, '')

กรณีทดสอบ:

orig = "a=&b=.&c=&d=.&e=";
new => ""

orig = "a=&b=bbb&c=.&d=ddd&e=";
new => "b=bbb&d=ddd&"  // dunno if that trailing & is a problem or not

.replace (/[^&]+=\.?(& | $) / g, '') ครอบคลุมทั้งสองกรณี แต่ฉันจะเพิ่ม. replace (/ & $ /, '') เพื่อลบคำต่อท้าย &
Tom Viner

15
ไม่มีปัญหาใดที่ regex ไม่สามารถทำให้แย่ลงได้
Michael Cook

3

ฉันใช้วิธีแก้ปัญหาข้างต้นแล้ว แต่สำหรับฉันแล้วมันไม่ได้ผล ดังนั้นฉันจึงใช้รหัสต่อไปนี้

$('#searchform').submit(function(){

            var serializedData = $(this).serializeArray();
            var query_str = '';

            $.each(serializedData, function(i,data){
                if($.trim(data['value'])){
                    query_str += (query_str == '') ? '?' + data['name'] + '=' + data['value'] : '&' + data['name'] + '=' + data['value'];
                }
            });
            console.log(query_str);
            return false;
        });

อาจมีประโยชน์สำหรับใครบางคน


1

ฉันจะดูซอร์สโค้ดสำหรับ jQuery ในเวอร์ชันล่าสุดบรรทัด 3287

ฉันอาจเพิ่มฟังก์ชัน "serialize2" และ "serializeArray2" แน่นอนว่าพวกเขาเป็นสิ่งที่มีความหมาย

หรือวิธีที่ดีกว่าคือเขียนอะไรบางอย่างเพื่อดึง vars ที่ไม่ได้ใช้ออกจาก serializedFormStr regex บางตัวที่ค้นหา = & ในสตริงกลางหรือลงท้ายด้วย = ตัวช่วยสร้าง regex รอบ ๆ ?

UPDATE: ฉันชอบคำตอบของ rogeriopvl ดีกว่า (+1) ... โดยเฉพาะอย่างยิ่งเมื่อฉันไม่พบเครื่องมือ regex ที่ดีในตอนนี้


1

ทางเลือกสำหรับโซลูชันของ Rich :

$('#form').submit(function (e) {
  e.preventDefault();

  var query = $(this).serializeArray().filter(function (i) {
    return i.value;
  });

   window.location.href = $(this).attr('action') + (query ? '?' + $.param(query) : '');
});

คำอธิบาย:

  • .submit()เกี่ยวกับsubmitเหตุการณ์ของแบบฟอร์ม
  • e.preventDefault() ป้องกันไม่ให้ส่งแบบฟอร์ม
  • .serializeArray() ให้การแสดงอาร์เรย์ของสตริงการสืบค้นที่กำลังจะถูกส่งไป
  • .filter() ลบค่าเท็จ (รวมถึงค่าว่าง) ในอาร์เรย์นั้น
  • $.param(query) สร้างการแสดงที่เป็นอนุกรมและเป็นไปตาม URL ของอาร์เรย์ที่อัปเดตของเรา
  • การตั้งค่าเพื่อwindow.location.hrefส่งคำขอ


-1

คุณอาจต้องการดูที่ฟังก์ชัน. each () jquery ที่ให้คุณวนซ้ำผ่านทุกองค์ประกอบของตัวเลือกดังนั้นวิธีนี้คุณสามารถตรวจสอบช่องป้อนข้อมูลแต่ละช่องและดูว่าว่างหรือไม่จากนั้นจึงลบออกจากแบบฟอร์ม ใช้ element.remove () หลังจากนั้นคุณสามารถจัดลำดับแบบฟอร์มได้


1
ปัญหาเดียวที่เกิดขึ้นคือผู้ใช้จะเห็นว่าว่างจากการควบคุมหายไปก่อนหน้าที่จะส่ง จะดีกว่าถ้าตั้งชื่อเป็น "" เพื่อให้ซีเรียลไลซ์ไม่สนใจมัน
Tom Viner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.