jQuery เพื่อทำให้เป็นอนุกรมเฉพาะองค์ประกอบภายใน div


111

ฉันต้องการที่จะได้รับผลเช่นเดียวกับjQuery.serialize()แต่ผมอยากจะกลับมาเพียง elments divเด็กได้รับ

ตัวอย่างผลลัพธ์:

single=Single2&multiple=Multiple&radio=radio1

คำตอบ:


277

ไม่มีปัญหา. เพียงใช้สิ่งต่อไปนี้ สิ่งนี้จะทำงานเหมือนกับการทำให้เป็นอนุกรมของฟอร์ม แต่ใช้เนื้อหาของ div แทน

$('#divId :input').serialize();

ตรวจสอบhttps://jsbin.com/xabureladi/1สำหรับการสาธิต ( https://jsbin.com/xabureladi/1/ แก้ไขสำหรับรหัส)


58
ประสิทธิภาพจะไม่$("#divId").find("select, textarea, input").serialize();ดีขึ้นเหรอ? ฉันคิดว่าข้างต้นอาจช้าลงหาก div มีองค์ประกอบมากมายเช่นตารางที่มีหลายแถว / คอลัมน์
David Murdoch

3
ตามที่ระบุไว้ในคำตอบอื่น ๆ $ ('# divId: input'). serialize () จะมีประสิทธิภาพมากกว่า
jfountain

2
@EaterOfCorpses นั่นไม่ใช่วิธีที่แม่นยำในการทดสอบ หากคุณเปลี่ยนคำสั่งของงบที่คุณจะสังเกตเห็นว่ามีไม่มากแตกต่างใด ๆ : jsfiddle.net/QAKjN/10 มีการเล่นมากกว่าตัวเลือก
Rondel

2
เห็นได้ชัดว่านี่เป็นเพียงการทำให้เป็นอนุกรมอินพุตเท่านั้นดังนั้นความคิดเห็นของ David Murdochs จึงเป็นวิธีที่ถูกต้อง
superphonic

2
jQuery: "เนื่องจาก: input เป็นส่วนขยาย jQuery และไม่ได้เป็นส่วนหนึ่งของข้อกำหนด CSS การสืบค้นโดยใช้: input ไม่สามารถใช้ประโยชน์จากการเพิ่มประสิทธิภาพที่มาจากเมธอด DOM querySelectorAll () ดั้งเดิมได้" ใช้ $ ('[name]') จะดีกว่า: document.querySelectorAll ('[name]');
Abdullah Aydın

22

คุณสามารถปรับปรุงความเร็วของรหัสของคุณได้หากคุณ จำกัด รายการที่ jQuery จะดู

ใช้ตัวเลือก: อินพุตแทน*เพื่อให้บรรลุ

$('#divId :input').serialize()

วิธีนี้จะทำให้โค้ดของคุณเร็วขึ้นเนื่องจากรายการมีขนาดสั้นลง


15

serializeองค์ประกอบฟอร์มทั้งหมดภายในไฟล์div.

คุณสามารถทำได้โดยกำหนดเป้าหมาย div #target-div-idภายในformโดยใช้:

$('#target-div-id').find('select, textarea, input').serialize();

5

ฟังก์ชันที่ฉันใช้ในปัจจุบัน:

/**
 * Serializes form or any other element with jQuery.serialize
 * @param el
 */
serialize: function(el) {
    var serialized = $(el).serialize();
    if (!serialized) // not a form
        serialized = $(el).
          find('input[name],select[name],textarea[name]').serialize();
    return serialized;
}

2
นอกจากนี้ .find ('[ชื่อ]'). serialize (); สามารถใช้เพื่อกรององค์ประกอบที่ 'ทำให้เป็นอนุกรมได้'
Abdullah Aydın

3

ลองสิ่งนี้ด้วย:

$ ('# divId'). find ('input'). serialize ()


6
สิ่งนี้จะไม่ทำให้องค์ประกอบที่เลือกและพื้นที่ข้อความใน div
Jeff Walker Code Ranger

สิ่งนี้แก้ไขปัญหา select และ textarea: <code> $ ("# divId"). find ("select, textarea, input"). serialize (); <// code>
TroySteven

3

วิธีแก้ปัญหาของฉัน:

function serializeDiv( $div, serialize_method )
{
    // Accepts 'serialize', 'serializeArray'; Implicit 'serialize'
    serialize_method = serialize_method || 'serialize';

    // Unique selector for wrapper forms
    var inner_wrapper_class = 'any_unique_class_for_wrapped_content';

    // Wrap content with a form
    $div.wrapInner( "<form class='"+inner_wrapper_class+"'></form>" );

    // Serialize inputs
    var result = $('.'+inner_wrapper_class, $div)[serialize_method]();

    // Eliminate newly created form
    $('.script_wrap_inner_div_form', $div).contents().unwrap();

    // Return result
    return result;
}

/* USE: */

// For: $('#div').serialize()
serializeDiv($('#div')); /* or */ serializeDiv($('#div'), 'serialize');

// For: $('#div').serializeArray()
serializeDiv($('#div'), 'serializeArray');


0

หากองค์ประกอบเหล่านั้นมีชื่อคลาสทั่วไปอาจใช้สิ่งนี้ด้วย:

$('#your_div .your_classname').serialize()

:inputวิธีนี้คุณสามารถหลีกเลี่ยงการเลือกปุ่มซึ่งจะเลือกใช้ตัวเลือก jQuery แม้ว่าสิ่งนี้สามารถหลีกเลี่ยงได้โดยใช้$('#your_div :input:not(:button)').serialize();


0
$('#divId > input, #divId > select, #divId > textarea').serialize();

1
หากใช้จุลภาคคุณจะต้องระบุIDตัวเลือกแต่ละตัวเช่น: $('#divId > input, #divId > select, #divId > textarea'); นอกจากนี้>สัญลักษณ์ยังหมายถึงองค์ประกอบลูกโดยตรง ... ผิดปกติมากในสถานการณ์นี้หรืออย่างน้อยก็มีข้อ จำกัด มาก
gmo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.