jQuery vs document.querySelectorAll


161

ฉันได้ยินมาหลายครั้งแล้วว่าเนื้อหาที่แข็งแกร่งที่สุดของ jQuery คือวิธีการสืบค้นและจัดการองค์ประกอบใน DOM: คุณสามารถใช้การสืบค้น CSS เพื่อสร้างการสืบค้นที่ซับซ้อนซึ่งยากที่จะทำในจาวาสคริปต์ปกติ อย่างไรก็ตามเท่าที่ฉันรู้คุณสามารถบรรลุผลลัพธ์เดียวกันกับdocument.querySelectorหรือdocument.querySelectorAllซึ่งได้รับการสนับสนุนใน Internet Explorer 8 ขึ้นไป

ดังนั้นคำถามคือ: ทำไมค่าใช้จ่าย 'ความเสี่ยง' jQuery หากสินทรัพย์ที่แข็งแกร่งที่สุดสามารถทำได้ด้วย JavaScript ที่บริสุทธิ์?

ฉันรู้ว่า jQuery มีมากกว่าตัวเลือก CSS เช่น AJAX ข้ามเบราว์เซอร์ที่ดีกิจกรรมที่แนบมาเป็นต้น แต่ส่วนการสืบค้นมันเป็นส่วนสำคัญของความแข็งแกร่งของ jQuery!

ความคิดใด ๆ


4
(1) การข้ามผ่าน DOM / การแก้ไขทำได้รวดเร็วและง่ายดายยิ่งขึ้นด้วย jQuery (2) มันเพิ่มตัวเลือกของตัวเองที่จะไม่ทำงานในquerySelectorวิธีการ (3) การโทร AJAX ทำได้ง่ายและรวดเร็วยิ่งขึ้นด้วย jQuery (4) การสนับสนุนใน IE6 + ฉันแน่ใจว่ามีอีกหลายจุดที่สามารถทำได้เช่นกัน
James Allardice

12
(5) ... ค่าชวเลข $ () สำหรับผู้พิมพ์ดีดคนขี้เกียจเป็นสิ่งจำเป็น
เด็กซ์เตอร์ Huinda

4
ง่ายกว่าทำไมเร็วกว่า jQuery แปลเป็นจาวาสคริปต์ปกติเท่าที่ฉันรู้ ...
Joel_Blum

4
@ JamesAllardice— "all mess mess" สำหรับ cross-browser XMLHttpRequest อาจเป็นโค้ด 30 บรรทัดที่คุณเขียนหนึ่งครั้งและใส่ไว้ในห้องสมุดของคุณเอง
RobG

6
@RobG - ใช่ฉันไม่ได้พูดแค่ใช้ jQuery ถ้านั่นคือทั้งหมดที่คุณพยายามจะใช้ มันเป็นเพียงหนึ่งในผลประโยชน์ หากคุณต้องการใช้งาน DOM อย่างง่าย AJAX และquerySelectorAllและคุณต้องใช้มันทั้งหมดเพื่อทำงานในเบราว์เซอร์รุ่นเก่า jQuery เป็นตัวเลือกที่ชัดเจน ผมไม่ได้บอกว่าคุณควรจะใช้มันเช่นนี้
James Allardice

คำตอบ:


127

document.querySelectorAll() ได้หลายไม่สอดคล้องกันในเบราว์เซอร์และไม่ได้รับการสนับสนุนในเบราว์เซอร์ที่เก่ากว่านี้อาจจะไม่ก่อให้เกิดปัญหาใด ๆ อีกต่อไปในปัจจุบัน มันมีกลไกการกำหนดขอบเขตที่ไม่ได้ใช้งานง่ายและคุณสมบัติอื่น ๆ ที่ไม่ค่อยดีนัก นอกจากนี้สำหรับจาวาสคริปต์คุณจะทำงานกับชุดผลลัพธ์ของข้อความค้นหาเหล่านี้ได้ยากขึ้นซึ่งในหลายกรณีคุณอาจต้องการทำเช่นนั้น jQuery ให้ฟังก์ชั่นการทำงานกับพวกเขาที่ชอบ: filter(), find(), children(), parent(), map(), not()และอีกหลาย ไม่ต้องพูดถึงความสามารถของ jQuery ในการทำงานกับตัวเลือก pseudo-class

อย่างไรก็ตามฉันจะไม่พิจารณาสิ่งเหล่านี้เป็นคุณสมบัติที่แข็งแกร่งที่สุดของ jQuery แต่สิ่งอื่น ๆ เช่น "การทำงาน" ใน dom (เหตุการณ์, การจัดแต่งทรงผม, ภาพเคลื่อนไหวและการจัดการ) ในวิธีที่เข้ากันได้กับ crossbrowserหรืออินเตอร์เฟส ajax

หากคุณต้องการให้เครื่องมือเลือกจาก jQuery คุณสามารถใช้หนึ่ง jQuery เองใช้: Sizzleวิธีที่คุณมีพลังของเครื่องยนต์ jQuerys Selector โดยไม่มีค่าใช้จ่ายที่น่ารังเกียจ

แก้ไข: สำหรับบันทึกฉันเป็นแฟน JavaScript ขนาดใหญ่ อย่างไรก็ตามในบางครั้งคุณจำเป็นต้องมี JavaScript 10 บรรทัดซึ่งคุณจะเขียน 1 บรรทัด jQuery

แน่นอนคุณต้องมีวินัยในการไม่เขียน jQuery เช่นนี้:

$('ul.first').find('.foo').css('background-color', 'red').end().find('.bar').css('background-color', 'green').end();

อ่านยากมากในขณะที่ตัวหลังค่อนข้างชัดเจน:

$('ul.first')
   .find('.foo')
      .css('background-color', 'red')
.end()
   .find('.bar')
      .css('background-color', 'green')
.end();

JavaScript ที่เทียบเท่าจะมีความซับซ้อนมากยิ่งขึ้นโดยรหัสเทียมข้างบน:

1) ค้นหาองค์ประกอบพิจารณาองค์ประกอบทั้งหมดหรือเฉพาะรายการแรก

// $('ul.first')
// taking querySelectorAll has to be considered
var e = document.querySelector("ul.first");

2) ทำซ้ำอาร์เรย์ของโหนดชายด์ผ่านลูปบางอัน (อาจซ้อนหรือเรียกซ้ำ) และตรวจสอบคลาส (รายการคลาสไม่พร้อมใช้งานในเบราว์เซอร์ทั้งหมด!)

//.find('.foo')
for (var i = 0;i<e.length;i++){
     // older browser don't have element.classList -> even more complex
     e[i].children.classList.contains('foo');
     // do some more magic stuff here
}

3) ใช้สไตล์ css

// .css('background-color', 'green')
// note different notation
element.style.backgroundColor = "green" // or
element.style["background-color"] = "green"

รหัสนี้จะมีอย่างน้อยสองเท่าของบรรทัดที่คุณเขียนด้วย jQuery นอกจากนี้คุณจะต้องพิจารณาปัญหาข้ามเบราว์เซอร์ซึ่งจะลดความได้เปรียบของความเร็วที่รุนแรง (นอกเหนือจากความน่าเชื่อถือ) ของรหัสเนทีฟ


33
ความไม่สอดคล้องquerySelectorAllระหว่างเบราว์เซอร์ประเภทใด และการใช้ jQuery จะแก้ปัญหานี้ได้อย่างไรเนื่องจาก jQuery ใช้ querySelectorAllเมื่อมีอยู่

3
จริงรหัสหนึ่งบรรทัดสามารถมีกลุ่มของรหัสที่ไม่มีที่สิ้นสุดซึ่งอาจน่ารำคาญมากในระหว่างการดีบัก
เด็กซ์เตอร์ Huinda

1
"2) วนซ้ำแถวลำดับของเด็กผ่านลูปบางอัน (อาจซ้อนกันหรือวนซ้ำ) และตรวจสอบคลาส" << นี่คืออึทั้งหมด คุณสามารถใช้ querySelectorAll บนองค์ประกอบในขั้นตอนก่อนหน้า
Vanuan

5
@Vanuan อาจไม่จำเป็น แต่ถ้าคุณอ่านคำตอบของฉันอย่างถี่ถ้วนคุณจะสังเกตเห็นว่า querySelector นั้นมีปัญหาการกำหนดขอบเขตอย่างรุนแรงซึ่งอาจให้ผลบวกเท็จจำนวนมากเมื่อใช้ในวิธีที่คุณเสนอ อย่างไรก็ตามในขณะที่คุณมีอิสระที่จะขึ้นหรือลงด้วยเหตุผลบางประการฉันคิดว่ามันไม่ใช่เหตุผลที่ใช้ภาษาหยาบคาย
Christoph

2
@Christoph ตั้งแต่นี้เป็นเรื่องง่ายฉันเพิ่ม compatiblity สำหรับ IE8 ขึ้นไป ข้อดีความเร็วยังคงสูงมาก (5-20 ครั้ง) รหัสจะทำงานช้าลงในเบราว์เซอร์เก่าเช่น IE8 เป็นเพียงข้อสันนิษฐานที่ผิด
Pascalius

60

หากคุณกำลังปรับหน้าของคุณให้เหมาะสมกับ IE8 หรือใหม่กว่าคุณควรพิจารณาว่าคุณต้องการ jQuery หรือไม่ เบราว์เซอร์สมัยใหม่มีเนื้อหามากมายที่ jquery มีให้

หากคุณสนใจในการปฏิบัติงานคุณสามารถรับประโยชน์ด้านประสิทธิภาพที่เหลือเชื่อ(เร็วกว่า 2-10)โดยใช้จาวาสคริปต์ดั้งเดิม: http://jsperf.com/jquery-vs-native-selector-and-element-style/2

ฉันเปลี่ยน div-tagcloud จากjqueryเป็นjavascript ดั้งเดิม (เข้ากันได้กับ IE8 +) ผลลัพธ์นั้นน่าประทับใจ เร็วขึ้น 4 เท่าด้วยค่าใช้จ่ายเพียงเล็กน้อย

                    Number of lines       Execution Time                       
Jquery version :        340                    155ms
Native version :        370                    27ms

You Might Not Need Jquery ให้ภาพรวมที่ดีจริงๆซึ่งวิธีดั้งเดิมนั้นมาแทนที่เบราว์เซอร์เวอร์ชันใด

http://youmightnotneedjquery.com/


ภาคผนวก: การเปรียบเทียบความเร็วเพิ่มเติมเกี่ยวกับวิธีการดั้งเดิมที่แข่งขันกับ jQuery


ภาพรวมที่ดีแม้ว่าบางตัวอย่างของรหัสผิด ... เช่น$(el).find(selector)ไม่เท่ากับel.querySelectorAll(selector)และประสิทธิภาพของวิธีการดั้งเดิมมักจะค่อนข้างน่ากลัว: stackoverflow.com/q/14647470/1047823
Christoph

@Christoph คุณสามารถอธิบายอย่างละเอียดทำไมคุณคิดว่าวิธีการที่แตกต่างกันอย่างไร แน่นอนว่ามีกรณีขอบที่ jquery สามารถทำงานได้ดีขึ้น แต่ฉันไม่ได้เห็นมันสำหรับ DOM-Manipulation
Pascalius

1
ไม่จำเป็นต้องอธิบายเพิ่มเติมเพียงแค่อ่านคำตอบของฉันดูที่ซอและบทความที่ฉันเชื่อมโยง นอกจากนี้ (อย่างน้อย ATM) ส่วนใหญ่ของวิธี Array ดั้งเดิมส่วนใหญ่มีความเร็วต่ำกว่าเมื่อเทียบกับการใช้งานไร้เดียงสา js (เช่นฉันเชื่อมโยงในคำถามในความคิดเห็นแรกของฉัน) และนี่ไม่ใช่กรณีขอบ แต่เป็นกรณีมาตรฐาน แต่อีกครั้งจุดสนใจหลักของคำถามนี้ไม่ใช่ความเร็ว
Christoph

2
@Christoph แน่นอนวิธีการเหล่านี้ไม่เท่ากัน 100% และ jQuery มักจะให้ความสะดวกสบายมากขึ้น ฉันอัปเดตคำตอบเพื่อแสดงว่านี่เป็นเพียงกรณีขอบฉันไม่สามารถหาเคสอื่นที่ jquery ทำงานได้ดี ไม่มีจุดสนใจหลักของคำถาม
Pascalius

+1 คำตอบที่ยอดเยี่ยม! ฉันเปลี่ยน jQuery code เก่า ๆ อย่างช้าๆด้วย JavaScript แบบเดิมในช่วง 4 หรือ 5 ปีที่ผ่านมาและเมื่อใดก็ตามที่เป็นไปได้แน่นอนว่า jQuery นั้นยอดเยี่ยมสำหรับบางสิ่งและฉันก็ใช้มันเพื่อสิ่งเหล่านั้นเมื่อฉันรู้สึกว่า
ใช่ Barry

13

เพื่อทำความเข้าใจว่าทำไม jQuery ถึงได้รับความนิยมดังนั้นสิ่งสำคัญคือการเข้าใจว่าเรามาจากไหน!

ประมาณทศวรรษที่แล้วเบราว์เซอร์ยอดนิยมคือ IE6, Netscape 8 และ Firefox 1.5 ย้อนกลับไปในสมัยนั้นมีวิธีข้ามเบราว์เซอร์เล็กน้อยในการเลือกองค์ประกอบจาก DOM นอกเหนือจากDocument.getElementById()นั้น

ดังนั้นเมื่อ jQuery เปิดตัวในปี 2549มันเป็นการปฏิวัติที่ค่อนข้างใหม่ ก่อนหน้านั้น jQuery ได้กำหนดมาตรฐานสำหรับวิธีการเลือก / เปลี่ยนองค์ประกอบ HTML และเรียกใช้เหตุการณ์ได้อย่างง่ายดายเนื่องจากความยืดหยุ่นและการสนับสนุนเบราว์เซอร์นั้นไม่เคยมีมาก่อน

ตอนนี้มากกว่าทศวรรษต่อมาฟีเจอร์มากมายที่ทำให้ jQuery ได้รับความนิยมได้กลายเป็นมาตรฐานของจาวาสคริปต์:

โดยทั่วไปจะไม่สามารถใช้งานได้ในปี 2005 ความจริงที่ว่าทุกวันนี้พวกเขาเห็นได้ชัดว่าเป็นคำถามว่าทำไมเราจึงควรใช้ jQuery และแน่นอนว่าผู้คนเริ่มสงสัยมากขึ้นว่าเราควรใช้ jQueryหรือเปล่า

ดังนั้นถ้าคุณคิดว่าคุณเข้าใจ JavaScript ดีพอที่จะทำโดยไม่มี jQuery โปรดทำ! อย่ารู้สึกถูกบังคับให้ใช้ jQuery เพียงเพราะมีคนอื่นมากมายที่ทำเช่นนั้น


7

นั่นเป็นเพราะ jQuery querySelectorAllสามารถทำได้มากกว่า

ก่อนอื่น jQuery (และ Sizzle โดยเฉพาะ) ทำงานกับเบราว์เซอร์รุ่นเก่าเช่น IE7-8 ที่ไม่รองรับ CSS2.1-3 selector

ยิ่งไปกว่านั้น Sizzle (ซึ่งเป็นเอ็นจิ้นตัวเลือกที่อยู่เบื้องหลัง jQuery) มอบเครื่องมือตัวเลือกขั้นสูงมากมายให้คุณเช่น:selectedpseudo-class :not()ตัวเลือกขั้นสูงซินแทกซ์ที่ซับซ้อนยิ่งขึ้น$("> .children")เป็นต้น

และมันไม่ข้ามเบราว์เซอร์ไม่มีที่ติให้ทุกสิ่งที่ jQuery สามารถนำเสนอ (ปลั๊กอินและ API)

ใช่ถ้าคุณคิดว่าคุณสามารถพึ่งพาคลาสที่เรียบง่ายและตัวเลือกรหัส jQuery นั้นมากเกินไปสำหรับคุณและคุณจะจ่ายเงินที่เกินจริง แต่ถ้าคุณทำไม่ได้และต้องการใช้ประโยชน์จากความดีทั้งหมดของ jQuery ให้ใช้มัน


7

เอ็นจิ้นตัวเลือก Sizzle ของ jQuery สามารถใช้ได้querySelectorAllถ้ามี นอกจากนี้ยังช่วยลดความไม่สอดคล้องระหว่างเบราว์เซอร์เพื่อให้ได้ผลลัพธ์ที่สม่ำเสมอ หากคุณไม่ต้องการใช้ jQuery ทั้งหมดคุณสามารถใช้ Sizzle แยกกันได้ นี่คือล้อพื้นฐานที่น่ารัก

ต่อไปนี้คือการหยิบเชอร์รี่จากแหล่งที่แสดงประเภทของ jQuery (w / Sizzle) ที่คัดสรรมาให้คุณ:

โหมดซาฟารีนิสัยใจคอ:

if ( document.querySelectorAll ) {
  (function(){
    var oldSizzle = Sizzle,
      div = document.createElement("div"),
      id = "__sizzle__";

    div.innerHTML = "<p class='TEST'></p>";

    // Safari can't handle uppercase or unicode characters when
    // in quirks mode.
    if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
      return;
    }

หากยามที่ล้มเหลวที่จะใช้มันเป็นรุ่นของ Sizzle querySelectorAllที่ไม่ได้เพิ่มขึ้นด้วย นอกจากนี้ยังมีจุดจับเฉพาะสำหรับความไม่สอดคล้องใน IE, Opera และเบราว์เซอร์ Blackberry

  // Check parentNode to catch when Blackberry 4.6 returns
  // nodes that are no longer in the document #6963
  if ( elem && elem.parentNode ) {
    // Handle the case where IE and Opera return items
    // by name instead of ID
    if ( elem.id === match[3] ) {
      return makeArray( [ elem ], extra );
    }

  } else {
    return makeArray( [], extra );
  }

oldSizzle(query, context, extra, seed)และถ้าทุกคนอื่นไม่ว่ามันจะกลับมาผลมาจากการ


6

ในแง่ของความสามารถในการบำรุงรักษาโค้ดมีหลายสาเหตุที่ต้องยึดติดกับไลบรารี่ที่ใช้กันอย่างแพร่หลาย

หนึ่งในคนหลักคือพวกเขามีเอกสารที่ดีและมีชุมชนเช่น ... พูดว่า ... stackexchange ซึ่งสามารถพบความช่วยเหลือในห้องสมุด ด้วยไลบรารีโค้ดที่กำหนดเองคุณจะมีซอร์สโค้ดและอาจเป็นเอกสารวิธีการยกเว้นกรณีที่ coder ใช้เวลาในการจัดทำเอกสารรหัสมากกว่าการเขียนซึ่งหาได้ยาก

การเขียนห้องสมุดของคุณเองอาจเหมาะสำหรับคุณแต่การฝึกงานที่โต๊ะถัดไปอาจทำให้คุณใช้เวลาในการเร่งความเร็วด้วย jQuery ได้ง่ายขึ้น

เรียกว่าผลกระทบเครือข่ายถ้าคุณต้องการ นี่ไม่ได้เป็นการบอกว่ารหัสจะดีกว่าใน jQuery ลักษณะที่กระชับของรหัสทำให้ง่ายต่อการเข้าใจโครงสร้างโดยรวมของโปรแกรมเมอร์ทุกระดับทักษะหากเพียงเพราะมีรหัสการทำงานที่มองเห็นได้มากกว่าในไฟล์ที่คุณกำลังดูอยู่ ในกรณีนี้โค้ด 5 บรรทัดดีกว่า 10

สรุปแล้วฉันเห็นประโยชน์หลักของ jQuery ว่าเป็นรหัสรัดกุมและแพร่หลาย


6

นี่คือการเปรียบเทียบหากฉันต้องการใช้คุณสมบัติเดียวกันเช่นซ่อนองค์ประกอบทั้งหมดของคลาส "my-class" นี่คือเหตุผลหนึ่งที่ใช้ jQuery

jQuery:

$('.my-class').hide();

JavaScript:

var cls = document.querySelectorAll('.my-class');
for (var i = 0; i < cls.length; i++) {
    cls[i].style.display = 'none';
}

ด้วย jQuery ที่ได้รับความนิยมอย่างมากพวกเขาควรทำ document.querySelector () ทำตัวเหมือน $ document.querySelector () จะเลือกเฉพาะองค์ประกอบแรกที่ตรงกันซึ่งจะทำให้มีประโยชน์เพียงครึ่งเดียว


4
ฉันจะทำ. forEach ที่นี่
Phillip Senn

คุณสามารถไปกับเส้นทางที่ง่ายกว่าdocument.querySelectorAll('.my-class').forEach(el => el.style.display = 'none');เสมอ ถึงแม้ว่าจะสั้นกว่า แต่ประสิทธิภาพที่ชาญฉลาดนั้นดีกว่าเสมอ
Alain Cruz

จากมุมมองของผู้ใช้ทุกอย่างที่เกิดขึ้นในเวลาน้อยกว่า 0.1 วินาทีเกิดขึ้นทันที ดังนั้น native แม้จะเร็วกว่าดีกว่าเฉพาะในกรณีที่การใช้ jQuery ช้ากว่า 0.1 วินาที และในโลกแห่งความเป็นจริงมันไม่เคยเกิดขึ้น
ยูริน

3

ตามที่เว็บไซต์ทางการบอกว่า: "jQuery: The Less Less, Do More, JavaScript Library"

พยายามแปลรหัส jQuery ต่อไปนี้โดยไม่ต้องมีไลบรารีใด ๆ

$("p.neat").addClass("ohmy").show("slow");

1
ฉันเห็นด้วยกับสิ่งนั้น แต่สิ่งที่เกี่ยวกับการอ่าน? คุณจะจัดทำเอกสารรหัสยาว ๆ โดยมีสิ่งที่ไม่เกี่ยวข้องมากมายเกิดขึ้นได้อย่างไร? คุณจะแก้ไขข้อผิดพลาดที่น่าประหลาดใจได้อย่างไร
Joel_Blum

@ user1032663 นั่นเป็นเรื่องของการจัดทำเอกสาร
Christoph

1
ทางเลือกอื่นสำหรับ jQuery (หรืออะไรก็ตามที่คุณเลือก "ไลบรารี่") ไม่ได้เขียนทุกอย่างตั้งแต่เริ่มต้น แต่ใช้ไลบราที่เหมาะกับวัตถุประสงค์ของคุณและเขียนได้ดี คุณอาจเขียนชิ้นส่วนด้วยตัวเองหรือเลือกไลบรารีแบบแยกส่วนเช่นMyLibraryเพื่อรวมเฉพาะสิ่งที่คุณต้องการ
RobG

2
ตัวอย่างที่คุณเลือกไม่ได้พิสูจน์จุดของคุณจริง ๆ : คำถามกำลังค้นหาความแตกต่างในจังหวัด "ตัวเลือก" addClass()และshow()ไม่นับจริงๆ และสำหรับ$('p.neat')คุณสามารถดูได้ที่แบบสอบถามตัวเลือก / ทั้งหมด
Kumarharsh

document.querySelectorAll('p.neat').forEach(p=>p.classList.add('ohmy'));และปล่อยให้ CSS ทำส่วนที่เหลือ อีกเล็กน้อยรหัส แต่มากมีประสิทธิภาพมากขึ้น แน่นอนว่าวิธีแก้ปัญหาของเขายังไม่พร้อมใช้งานในยุคเก่าของ IE ส่วน "ทำมากขึ้น" เป็นเรื่องน่าขัน jQuery ใช้โค้ดประมาณหนึ่งร้อยบรรทัดในการค้นหาบางสิ่งบางอย่างดังนั้นการทำงานให้มากขึ้นอาจไม่ได้ผลเสมอไป
Manngo

2

ฉันคิดว่าคำตอบที่แท้จริงคือ jQuery ได้รับการพัฒนามานานก่อนที่จะquerySelector/querySelectorAllมีให้บริการในเบราว์เซอร์หลัก ๆ ทั้งหมด

รุ่นแรกของjQuery คือในปี 2006 ในความเป็นจริงแม้ jQuery ไม่ได้เป็นครั้งแรกที่นำมาใช้ตัวเลือก CSS

IE เป็นเบราว์เซอร์ที่ผ่านมาquerySelector/querySelectorAllในการดำเนินการ รุ่นที่ 8 ได้รับการปล่อยตัวในปี 2009

ดังนั้นตอนนี้ตัวเลือกองค์ประกอบ DOM ไม่ใช่จุดที่แข็งแกร่งที่สุดของ jQuery อีกต่อไป อย่างไรก็ตามยังมีสินค้าอีกมากมายเช่นทางลัดเพื่อเปลี่ยนเนื้อหา css และ html ขององค์ประกอบภาพเคลื่อนไหวการผูกกิจกรรมอาแจ็กซ์


1

คำถามเก่า แต่ครึ่งทศวรรษต่อมามันคุ้มค่าที่จะกลับมาอีก ที่นี่ฉันพูดถึงเรื่องตัวเลือกของ jQuery เท่านั้น

document.querySelector[All]ได้รับการสนับสนุนโดยเบราว์เซอร์ปัจจุบันทั้งหมดจนถึง IE8 ดังนั้นความเข้ากันได้จึงไม่เป็นปัญหาอีกต่อไป ฉันยังพบว่าไม่มีปัญหาเรื่องประสิทธิภาพในการพูด (ควรจะช้ากว่าdocument.getElementByIdแต่การทดสอบของฉันเองชี้ให้เห็นว่ามันเร็วกว่าเล็กน้อย)

ดังนั้นเมื่อมันมาถึงการจัดการองค์ประกอบโดยตรงมันเป็นที่ต้องการมากกว่า jQuery

ตัวอย่างเช่น:

var element=document.querySelector('h1');
element.innerHTML='Hello';

เป็นอย่างมากมายดีกว่า:

var $element=$('h1');
$element.html('hello');

เพื่อที่จะทำอะไรเลย jQuery จะต้องวิ่งผ่านโค้ดหนึ่งร้อยบรรทัด (ฉันเคยสืบค้นผ่านโค้ดเช่นด้านบนเพื่อดูว่า jQuery กำลังทำอะไรอยู่กับมัน) เห็นได้ชัดว่าเป็นการเสียเวลาของทุกคน

ค่าใช้จ่ายที่สำคัญอื่น ๆ ของ jQuery คือความจริงที่ว่ามันครอบคลุมทุกอย่างภายในวัตถุ jQuery ใหม่ ค่าใช้จ่ายนี้สิ้นเปลืองอย่างยิ่งหากคุณต้องการแกะวัตถุออกมาอีกครั้งหรือใช้วิธีการใดวิธีการหนึ่งในการจัดการกับคุณสมบัติที่มีอยู่ในองค์ประกอบดั้งเดิมแล้ว

อย่างไรก็ตาม jQuery มีข้อได้เปรียบอย่างไรในการจัดการกับคอลเลกชัน หากความต้องการคือการตั้งค่าคุณสมบัติของหลายองค์ประกอบ jQuery มีeachวิธีการในตัวซึ่งช่วยให้สิ่งนี้:

var $elements=$('h2');  //  multiple elements
$elements.html('hello');

ในการทำเช่นนี้กับ Vanilla JavaScript จะต้องมีสิ่งนี้:

var elements=document.querySelectorAll('h2');
elements.forEach(function(e) {
    e.innerHTML='Hello';
});

ซึ่งบางคนพบว่าน่ากลัว

ตัวเลือก jQuery นั้นแตกต่างกันเล็กน้อย แต่เบราว์เซอร์สมัยใหม่ (ยกเว้น IE8) จะไม่ได้รับประโยชน์มากนัก

ตามกฎแล้วฉันระมัดระวังไม่ให้ใช้ jQuery สำหรับโครงการใหม่ :

  • jQuery เป็นห้องสมุดภายนอกที่เพิ่มค่าใช้จ่ายของโครงการและการพึ่งพาบุคคลที่สาม
  • ฟังก์ชั่น jQuery มีราคาแพงมากการประมวลผลที่ชาญฉลาด
  • jQuery กำหนดวิธีการซึ่งจำเป็นต้องเรียนรู้และอาจแข่งขันกับด้านอื่น ๆ ของรหัสของคุณ
  • jQuery ช้าที่จะเปิดเผยคุณสมบัติใหม่ใน JavaScript

หากไม่มีสิ่งใดที่กล่าวมาข้างต้นทำสิ่งที่คุณต้องการ อย่างไรก็ตาม jQuery ไม่ได้มีความสำคัญต่อการพัฒนาข้ามแพลตฟอร์มเหมือนที่เคยเป็นมาเพราะ JavaScript และ CSS ที่ทันสมัยนั้นมีมากกว่าที่เคยเป็นมา

สิ่งนี้ไม่ได้กล่าวถึงคุณสมบัติอื่น ๆ ของ jQuery อย่างไรก็ตามฉันคิดว่าพวกเขาก็ต้องดูอย่างใกล้ชิด


1
ไวยากรณ์ของคุณไม่ถูกต้องไม่พูดถึงสิ่งที่ผิดอื่น ๆ เช่น "ช้าที่จะเปิดเผยคุณสมบัติใหม่ใน Javascript" งานของ JQuery ไม่แม้แต่จะเปิดเผยคุณสมบัติใหม่ ๆ เพื่อให้ง่ายต่อการจัดการและทำสิ่งง่าย ๆ ที่อาจเป็นไปได้ เหมือน 10 บรรทัดใน Javascript ความคิดเห็นทั้งหมดของคุณไม่สมเหตุสมผลและมีสิ่งผิดปกติมากมาย พิจารณาปรับปรุงมัน
บอยโปร

@Boypro ขอบคุณสำหรับความคิดเห็นของคุณ แต่มันก็เต็มไปด้วยข้อผิดพลาด บางทีคุณอาจต้องการแบ่งปันสิ่งที่เกี่ยวกับคำตอบของฉันซึ่งทำให้คุณขุ่นเคืองมาก อะไรคือ“ ไม่ถูกต้อง” ยังดีกว่าคุณอาจต้องการมีส่วนร่วม anwser ของคุณ คำถามเกี่ยวกับค่าใช้จ่ายในการใช้ jQuery เมื่อ vanilla JavaScript สามารถทำได้มาก พิจารณาตอบรับ
Manngo

0
$ ("# id") vs document.querySelectorAll ("# id")

ดีลคือฟังก์ชั่น $ () ที่สร้างอาร์เรย์ขึ้นมาแล้วแบ่งให้คุณ แต่ด้วย document.querySelectorAll () มันจะสร้างอาร์เรย์ขึ้นมาและคุณต้องแยกมันออก


0

เพียงความเห็นเกี่ยวกับเรื่องนี้เมื่อใช้ไลต์การออกแบบวัสดุตัวเลือก jquery จะไม่ส่งคืนคุณสมบัติสำหรับการออกแบบวัสดุด้วยเหตุผลบางประการ

สำหรับ:

<div class="logonfield mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
        <input class="mdl-textfield__input" type="text" id="myinputfield" required>
        <label class="mdl-textfield__label" for="myinputfield">Enter something..</label>
      </div>

งานนี้:

document.querySelector('#myinputfield').parentNode.MaterialTextfield.change();

สิ่งนี้ไม่:

$('#myinputfield').parentNode.MaterialTextfield.change();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.