ข้อผิดพลาด jQuery เพื่อหลีกเลี่ยง [ปิด]


210

ฉันเริ่มต้นโครงการด้วย jQuery

คุณมีข้อผิดพลาด / ข้อผิดพลาด / ความเข้าใจผิด / การละเมิด / การใช้ผิดประเภทในโครงการ jQuery ของคุณอย่างไร?


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

ดูเหมือนว่าฉัน jQuery เป็นหลุมพรางในตัวเอง
gromit190

คำตอบ:


189

การไม่ทราบถึงประสิทธิภาพการทำงานและการใช้ตัวเลือกมากเกินไปแทนที่จะกำหนดให้กับตัวแปรท้องถิ่น ตัวอย่างเช่น:-

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

ค่อนข้างมากกว่า:-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

หรือดียิ่งขึ้นด้วยการผูกมัด : -

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

ฉันพบสิ่งนี้เป็นช่วงเวลาที่แจ่มใสเมื่อฉันรู้ว่าการโทรสแต็คทำงานอย่างไร

แก้ไข: คำแนะนำที่รวมอยู่ในความคิดเห็น


16
+1 สำหรับลิงก์ youtube อึศักดิ์สิทธิ์ฉันเรียนรู้มาก
Jason

23
ฉันคิดว่าการกำหนดสิ่งต่าง ๆ ให้กับตัวแปรท้องถิ่นนั้นยอดเยี่ยม แต่อย่าลืมเกี่ยวกับพลังของการผูกมัด (จากตัวอย่างของคุณ): $ ("# label"). method (). method2 (). css ("background-color", " สีแดง ");
Lance McNearney

วิดีโอ YouTube ยอดเยี่ยม ฉันเคยเห็นงานนำเสนออื่น ๆ ของ Google ในเรื่องนี้แล้วและฉันก็ยังได้เรียนรู้บางสิ่ง! ขอบคุณ!
Gabriel Hurley

+1 สำหรับลิงก์ด้วยดีมาก!
Josh Stodola

7
มันเป็นแบบแผนที่จะใช้เครื่องหมายดอลลาร์สำหรับตัวแปรที่มีบริบท jQuery ดังนั้นคุณอาจต้องการเขียนvar $label = $('#label');
ทิมBüthe

90

ทำความเข้าใจวิธีใช้บริบท โดยปกติตัวเลือก jQuery จะค้นหาเอกสารทั้งหมด:

// This will search whole doc for elements with class myClass
$('.myClass');

แต่คุณสามารถเร่งความเร็วได้โดยค้นหาในบริบท:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);

9
Aaaaaaah! นั่นคือข้อบกพร่องของฉันประมาณ 1,000,000 ข้อที่แก้ไขแล้ว +1
jammus

4
ดูเหมือนว่าจุดสุดท้ายของคุณไม่ถูกต้อง - groups.google.co.uk/group/jquery-dev/browse_thread/thread/…
James

1
ขอบคุณที่ชีแจงเรื่องนี้กับ JP ตอนนี้จะทำอย่างไร ... ฉันควรจะลบคำตอบของฉันดังนั้นไม่มีใครไปดุร้ายและเปลี่ยนรหัสเพื่ออะไร?
slolife

ไม่มันยังคงเป็นจุดที่ดี :)
James

2
ตรวจสอบ jQuery เพื่อดูว่าบริบทเป็น instace ของ jQuery [0]จึงมีเหตุผลที่ไม่ $('.myClass', ct);หรือถ้าคุณรู้ว่า ct เป็นตัวอย่างของ jQuery คุณสามารถใช้ findct.find(".myClass")
gradbot

62

อย่าใช้ตัวเลือกคลาสเปลือยเช่นนี้:

$('.button').click(function() { /* do something */ });

สิ่งนี้จะจบลงที่การดูองค์ประกอบทั้งหมดเพื่อดูว่ามีปุ่ม "ระดับ" หรือไม่

แต่คุณสามารถช่วยได้เช่น:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

ฉันได้เรียนรู้เมื่อปีที่แล้วจากบล็อกของ Rebecca Murphy

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


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

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

4
ย้อนกลับเป็นจริงเมื่อคุณกำลังเขียน CSS (อย่างน้อยรวมถึงแท็กองค์ประกอบ) ดูcode.google.com/speed/page-speed/docs/…
kmiyashiro

7
@Sneakyness ไม่ใช่ทุกสิ่งที่มีอะนาล็อกที่แม่นยำของชีวิตจริง ตัวอย่างเช่น$('.b')สามารถใช้document.getElementsByClassName('b')ถ้าเบราว์เซอร์รองรับ แต่การทำเช่น$('a.b')นั้นจะทำให้องค์ประกอบทั้งหมดที่ตรงกันพร้อมคลาสbแล้วยืนยันว่าเป็นแองเคอร์ในการดำเนินการสองขั้นตอน เสียงหลังเหมือนทำงานให้ฉันมากขึ้น สำหรับการเปรียบเทียบชีวิตจริงลองสิ่งนี้: ค้นหาถุงเท้าทั้งหมดในห้องของฉัน ตอนนี้ให้โยนสิ่งที่ไม่ได้อยู่ในตู้เสื้อผ้าของฉัน
alex

2
ฉันเชื่อว่าการเข้าใจผิดเกี่ยวกับตัวเลือกนั้นเกิดจากความจริงที่ว่าใน jquery เวอร์ชันเก่ามันเร็วกว่าที่จะทำ $ ('# foo') มากกว่า $ ('div # foo') เนื่องจากคำจำกัดความ id นั้นไม่เหมือนใคร ฉันค่อนข้างแน่ใจว่าสิ่งนี้ได้รับการแก้ไขในรุ่นที่ใหม่กว่า แต่ข้อเสนอแนะนั้นใช้ได้เฉพาะกับรหัสไม่ใช่ตัวเลือกประเภทอื่น ๆ
Alex Heyd

35

พยายามแยกฟังก์ชั่นที่ไม่ระบุชื่อออกเพื่อให้คุณสามารถนำกลับมาใช้ใหม่

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );

19
ฉันคิดว่าสิ่งนี้ใช้กับระดับเดียวกับที่รหัส (อินไลน์) แบบซิงโครนัสควรจะแบ่งออกเป็นฟังก์ชันที่มีชื่อ หากคุณมีโค้ดที่ขอให้ตั้งชื่อให้ลองทำดู แต่อย่าย้ายโค้ดออกจากบรรทัดเพียงเพราะว่าคุณใส่มันเข้าไปในฟังก์ชั่น มีฟังก์ชันที่ไม่ระบุชื่อด้วยเหตุผลที่ดี
Dan Breslau

4
ที่จริงฉันชอบที่จะให้ 'ชื่อ' ฟังก์ชั่นของฉัน มันมีประโยชน์มากเมื่อคุณทำการดีบั๊กโค้ดและแทนที่จะเห็นรายการฟังก์ชันที่ไม่ระบุชื่ออย่างไม่สิ้นสุดคุณจะเห็นฟังก์ชั่นที่ตั้งชื่อไว้อย่างถูกต้อง
SolutionYogi

1
ประเด็นของคุณได้รับการตอบรับอย่างดีและฉันอาจถูกคนอื่น ๆ สะดุดด้วยตัวเองสองสามครั้ง ถึงอย่างนั้น " ระดับเดียวกันประมาณ " ก็ยังใช้ได้สำหรับฉัน
Dan Breslau

1
ESP ถ้าความผูกพันเกิดขึ้นในลูป!
daniellmb

ฟังก์ชั่นที่มีชื่อยังให้ประโยชน์กับคุณอย่างมากเมื่อทำการดีบัก ไม่มีอะไรดูดมากไปกว่าการดู callstack 8 ระดับที่ไม่มีอะไร(anonymous)นอกจาก อ่านเพิ่มเติมเกี่ยวกับเคล็ดลับนี้ได้ที่นี่: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
ken

34
  • หลีกเลี่ยงการใช้เอกสารในทางที่ผิด
  • เตรียมเอกสารให้พร้อมสำหรับการเริ่มต้นรหัสเท่านั้น
  • แยกฟังก์ชั่นออกนอกเอกสารพร้อมเสมอเพื่อให้สามารถนำกลับมาใช้ใหม่ได้

ฉันเห็นโค้ดหลายร้อยบรรทัดในคำสั่ง doc doc น่าเกลียดอ่านไม่ได้และเป็นไปไม่ได้ที่จะรักษา


6
+1 โดยทั่วไปแล้วโค้ด jQuery ส่วนใหญ่ที่ฉันเคยเห็นใช้ฟังก์ชั่นที่มีหลายร้อยบรรทัด ฉันไม่รู้ว่าทำไม 'นักพัฒนา jQuery' ไม่ชอบใช้ฟังก์ชันที่เล็กลง
SolutionYogi

6
@SolutionYogi เพราะส่วนใหญ่เป็นเพียง JS noobs?
adamJLev

ฉันทุกคนไม่ได้ใส่ฟังก์ชั่นที่ยาวมากในเอกสารพร้อมนั่นเป็นคำแนะนำที่ดี อย่างไรก็ตามการสร้างฟังก์ชั่นองค์ประกอบขนาดเล็กจำนวนมากที่เรียกใช้จากฟังก์ชั่นเสริมที่ไม่ได้อยู่ในเอกสารพร้อมไม่จำเป็นต้องปฏิบัติที่ดีที่สุด หากฟังก์ชั่นครอบคลุมเป็นเพียงคนเดียวที่ใช้ชิ้นส่วนของรหัสเหล่านั้นคุณดีกว่าวางไว้ในฟังก์ชั่นเดียวแม้ว่ามันจะยากต่อการอ่าน ฟังก์ชั่นการโทรมีค่าใช้จ่ายจำนวนมากและหากคุณใช้รหัสในบริบทเดียวก็ควรหลีกเลี่ยง
sage88

34

ในขณะที่ใช้$.ajaxฟังก์ชั่นสำหรับคำขอAjaxไปยังเซิร์ฟเวอร์คุณควรหลีกเลี่ยงการใช้completeเหตุการณ์เพื่อประมวลผลข้อมูลการตอบสนอง มันจะเริ่มต้นไม่ว่าจะเป็นคำขอที่ประสบความสำเร็จหรือไม่

แทนที่จะใช้completesuccess

ดูAjax Eventsในเอกสาร


1
ฉันกลับไปกลับมาในความสำเร็จกับความสมบูรณ์แบบคุณสามารถขยายได้ว่าทำไมคุณถึงคิดว่าความสมบูรณ์นั้นดีกว่า
Neil N

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

2
มันจะถูกเรียกเสมอ อย่างไรก็ตามฉันจะไม่เห็นด้วย เสร็จสมบูรณ์ดีที่สุดสำหรับการซ่อน gif ที่โหลดเป็นต้นคุณควรใช้ความสำเร็จในการจัดการการตอบสนองและข้อผิดพลาดสำหรับข้อผิดพลาดแน่นอน
redsquare

1
เขาแนะนำให้ใช้ความสำเร็จแทนที่จะทำเสร็จ 'สมบูรณ์' จะยิงเมื่อคำขอ ajax เป็น 'เสร็จสมบูรณ์' ไม่ว่าจะสำเร็จหรือไม่สำเร็จก็ตาม
SolutionYogi

@redsquare คุณสามารถขยายสิ่งที่คุณไม่เห็นด้วยได้ไหม? ฉันอ้างถึงกระบวนการข้อมูลและไม่สนใจว่าจะซ่อนรูปภาพ / แสดงโอกาสที่คุณมีด้วยตัวจัดการที่สมบูรณ์
Artem Barger

24

"Chaining" Animation - events กับ Callbacks

สมมติว่าคุณต้องการทำให้ย่อหน้าหายไปเมื่อคลิก คุณต้องการลบองค์ประกอบออกจาก DOM ในภายหลัง คุณอาจคิดว่าคุณสามารถเชื่อมโยงวิธีการต่าง ๆ :

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

ในตัวอย่างนี้. Remove () จะถูกเรียกใช้ก่อน. fadeOut () ได้เสร็จสิ้นแล้วทำลายเอฟเฟกต์ที่ค่อยๆจางหายไปของคุณและทำให้องค์ประกอบหายไปทันที แต่เมื่อคุณต้องการเรียกใช้คำสั่งเมื่อเสร็จสิ้นก่อนหน้านี้ให้ใช้การติดต่อกลับ:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

พารามิเตอร์ที่สองของ. fadeOut () เป็นฟังก์ชั่นนิรนามที่จะทำงานเมื่อภาพเคลื่อนไหว. fadeOut () เสร็จสมบูรณ์ สิ่งนี้ทำให้การค่อย ๆ จางหายไปและการกำจัดองค์ประกอบในภายหลัง


24

หากคุณผูก () เหตุการณ์เดียวกันหลายครั้งมันจะเริ่มทำงานหลายครั้ง ฉันมักจะไปunbind('click').bind('click')เพื่อความปลอดภัยเสมอ


2
นี่ไม่ใช่เฉพาะ jQuery แต่สิ่งสำคัญที่ต้องจำไว้
SolutionYogi

11
คุณสามารถใช้กิจกรรมสดโดยไม่ต้องผูกเหตุการณ์เดียวกันสองครั้ง
Powerlord

สดมีปัญหา (ประสิทธิภาพ) ของตัวเองหากใช้เกิน ดีกว่าใน 1.3.3 ที่ซึ่งคุณสามารถให้บริบท
redsquare

23

ห้ามใช้ปลั๊กอินในทางที่ผิด

ส่วนใหญ่คุณจะต้องใช้ไลบรารีและอินเทอร์เฟซผู้ใช้ หากคุณทำให้มันง่ายรหัสของคุณจะสามารถรักษาได้ในระยะยาว ปลั๊กอินทั้งหมดไม่ได้รับการสนับสนุนและดูแลรักษาจริง ๆ แล้วส่วนใหญ่ไม่ใช่ปลั๊กอิน หากคุณสามารถเลียนแบบการทำงานโดยใช้องค์ประกอบหลักฉันขอแนะนำอย่างยิ่ง

ปลั๊กอินง่ายต่อการแทรกในรหัสของคุณประหยัดเวลา แต่เมื่อคุณต้องการอะไรเพิ่มเติมมันเป็นความคิดที่ไม่ดีที่จะแก้ไขพวกเขาเนื่องจากคุณสูญเสียการปรับปรุงที่เป็นไปได้ เวลาที่คุณบันทึกเมื่อเริ่มต้นคุณจะหลวมในภายหลังเมื่อเปลี่ยนปลั๊กอินที่เลิกใช้แล้ว

เลือกปลั๊กอินที่คุณใช้อย่างชาญฉลาด นอกเหนือจากห้องสมุดและส่วนต่อประสานผู้ใช้ฉันใช้$ .cookie , $ .form , $ .validateและthickboxอย่างต่อเนื่อง ส่วนที่เหลือฉันพัฒนาปลั๊กอินของตัวเองเป็นส่วนใหญ่


2
แล้วกริดล่ะ คุณทำด้วยตัวเอง?
jmav

ใช่. จากโครงการไปยังข้อมูลโครงการมีหลายวิธี ฉันชอบที่จะมีการควบคุมเต็มรูปแบบที่ตระหนักว่ากริดนั้นช่วยให้ฉันอยู่ตรงกลางแล้วฉันต้องโพล่งออกมา
Elzo Valugi

หาก {ให้เวลาเพียงพอโดยทั่วไปฉันต้องการเขียนโค้ดที่ควบคุมด้วยข้อมูล -dom-manipulation (css / html) ทั้งหมดโดยตรง กล่าวอีกนัยหนึ่ง - อย่าส่งข้อมูลไปยัง 'ปลั๊กอิน' และทำให้มันมี hew มันยากพอที่จะประเมิน (กองกลาง) ปลั๊กอินสำหรับความเข้ากันได้ของขอบเขตปัจจุบันลืมเกี่ยวกับความต้องการในอนาคต คิดว่า ... นักออกแบบนักวางแผนผู้จัดการผู้จัดการผู้จัดการ โอ้และลูกค้าและผู้ใช้ แต่ถ้าคุณมีทุกสิ่งเหล่านี้คุณจะไม่มีเวลาเพียงพอที่จะพูด ดังนั้นให้ไปใช้ jqgrid แล้ว - คุณเสียเวลาในการพิจารณา ทำเสร็จแล้วหรือยัง?}
406905

22

หลุมพราง: การใช้ลูปแทนตัวเลือก

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

ข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก jQuery:
http://docs.jquery.com/Selectors

หลุมพราง: ไม่ได้ใช้เครื่องมือเช่น Firebug

Firebug ถูกสร้างขึ้นจริงสำหรับการดีบักแบบนี้ หากคุณกำลังล้อเล่นกับ DOM ด้วย Javascript คุณต้องมีเครื่องมือที่ดีเช่น Firebug เพื่อให้คุณมองเห็นได้

ข้อมูลเพิ่มเติมเกี่ยวกับ Firebug: http://getfirebug.com/

แนวคิดที่ยอดเยี่ยมอื่น ๆ อยู่ในตอนนี้ของ Podcast Polymorphic: (ความลับ jQuery กับ Dave Ward) http://polymorphicpodcast.com/shows/jquery/


1
ฉันทำครั้งแรกมาหลายครั้งแล้ว คุณต้องจำไว้ว่าฟังก์ชั่น jQuery ส่วนใหญ่จะทำงานกับองค์ประกอบทั้งหมดที่ส่งคืนจากตัวเลือก
DisgruntledGoat

ไม่ชอบวิธีการแต่ละ. ซื่อสัตย์
Simon Hayter

14

ความเข้าใจผิดในการใช้ตัวระบุนี้ในบริบทที่ถูกต้อง ตัวอย่างเช่น

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

และนี่คือหนึ่งในตัวอย่างที่คุณจะแก้ปัญหา:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});

1
+1 ปัญหา javascript มากกว่าปัญหา jquery แต่ฉันเคยสะดุดมาก ๆ
mmacaulay

13

หลีกเลี่ยงการค้นหาผ่าน DOM ทั้งหมดหลายครั้ง นี่คือสิ่งที่สามารถทำให้สคริปต์ของคุณล่าช้าได้จริง ๆ

แย่:

$(".aclass").this();
$(".aclass").that();
...

ดี:

$(".aclass").this().that();

แย่:

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

ดี:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();

2
$ ( "ACLASS") นี้ () (ก)..; ไม่ดี! ตัวเลือกคลาสเฉพาะจะช้า
redsquare

มันเป็นตัวอย่างที่แสดงให้เห็นถึงความสามารถของ Jquery ในการใช้หลายวิธีในการเลือกเพียงครั้งเดียว ฉันเลือกอย่างง่าย (และช้า) เพื่อให้ความสำคัญกับเทคนิคนี้มากขึ้น
googletorp

10
ในขณะที่หลีกเลี่ยงการค้นหา DOM ซ้ำ ๆ เป็นสิ่งที่ดี - ตัวอย่างสุดท้ายคือความยุ่งเหยิงที่อ่านไม่ได้ที่ฉันไม่ทราบว่าเกิดอะไรขึ้น หากคุณวางแผนที่จะใช้ผลลัพธ์ของการดึงข้อมูลหลายครั้งให้เก็บไว้ในตัวแปร มันทำให้รหัสบำรุงรักษาได้มากขึ้น
Quentin

12

แคช $ (นี้) กับตัวแปรที่มีความหมายเสมอโดยเฉพาะใน. each ()

แบบนี้

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})

12
ใช้$selfหรือ$thisถ้าคุณขี้เกียจเกินกว่าจะนึกถึงชื่อตัวแปรที่ดี
gradbot

10

คล้ายกับสิ่งที่ Repo Man พูด แต่ก็ไม่มากนัก

เมื่อพัฒนา ASP.NET winforms ฉันมักจะทำ

$('<%= Label1.ClientID %>');

ลืมเครื่องหมาย # แบบฟอร์มที่ถูกต้องคือ

$('#<%= Label1.ClientID %>');

10

เหตุการณ์ที่เกิดขึ้น

$("selector").html($("another-selector").html());

ไม่ได้คัดลอกเหตุการณ์ใด ๆ - คุณต้องปฏิเสธพวกเขาทั้งหมด

ตาม commen t - clone () ของ JPจะปฏิเสธกิจกรรมหากคุณผ่านจริง


4
Clone () ทำถ้าคุณผ่านจริง
James

แล้ว live () ใน jQuery 1.3.2 ล่ะ?
jmav

9

หลีกเลี่ยงการสร้างวัตถุ jQuery เดียวกันหลายรายการ

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}

var $ this = $ (นี้) .fadeIn () ;? คุณแคชผลกระทบหรือไม่
Jason

12
มันคืนค่าองค์ประกอบมันถูกเรียกว่าการผูกมัด!
redsquare

คุณสามารถตั้งค่าตัวแปรและดำเนินการกับตัวแปรในเวลาเดียวกันได้หรือไม่?
Jason

1
แน่นอน แต่ไม่ได้ใช้คำของฉันมัน ลองมัน. คุณคิดว่าสิ่งต่อไปนี้เป็นไปได้อย่างไรหากวัตถุ jquery ที่แสดงองค์ประกอบไม่ถูกส่งคืน $ ('# divId'). hide (). show (). fadeIn () .... ฯลฯ
redsquare

14
ใช้งานได้ แต่ฉันคิดว่ามันอ่านง่ายกว่าที่จะมี$this = $(this);ในบรรทัดแยกต่างหาก หากคุณสามารถ (โดยไม่ทำให้เป็นระเบียบ) ลืมเกี่ยวกับ$thisและทุกอย่างเพียงแค่ห่วงโซ่:$(this).fadeIn().fadeIn();
แพทริค McElhaney

8

ฉันพูดแบบนี้สำหรับ JavaScript เช่นกัน แต่ jQuery, JavaScript ไม่ควรแทนที่ CSS

นอกจากนี้ตรวจสอบให้แน่ใจว่าไซต์นั้นสามารถใช้งานได้สำหรับบางคนที่ปิด JavaScript (ไม่เกี่ยวข้องเท่าวันนี้ย้อนหลังไปในวัน แต่ควรจะมีไซต์ที่ใช้ได้อย่างสมบูรณ์เสมอ)


6

ทำให้การเปลี่ยนแปลง DOM มากเกินไป ในขณะที่วิธีการ. html (), .append (), .prepend () ฯลฯ นั้นยอดเยี่ยมเนื่องจากวิธีที่เบราว์เซอร์แสดงผลและแสดงหน้าซ้ำอีกครั้งการใช้งานบ่อยเกินไปจะทำให้การทำงานช้าลง เป็นการดีกว่าถ้าจะสร้าง html เป็นสตริงและรวมไว้ใน DOM หนึ่งครั้งแทนที่จะเปลี่ยน DOM หลายครั้ง

แทน:

var $parent = $('#parent');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $parent.append($div);
}

ลองสิ่งนี้:

var $parent = $('#parent');
var iterations = 10;
var html = '';

for (var i = 0; i < iterations; i++){
    html += '<div class="foo-' + i + '"></div>';
}

$parent.append(html);

หรือแม้กระทั่งสิ่งนี้ ($ wrapper เป็นองค์ประกอบที่สร้างขึ้นใหม่ที่ยังไม่ได้ถูกฉีดเข้าไปยัง DOM การผนวกโหนดในส่วน wrapper นี้ไม่ทำให้เกิดความล่าช้าและท้ายที่สุดเราผนวก $ wrapper เป็น $ parent โดยใช้การจัดการ DOM เพียงอันเดียว ):

var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $wrapper.append($div);
}

$parent.append($wrapper);

+1 ... ฉันใช้. html () กับหลายองค์ประกอบทุก ๆ วินาที สังเกตว่ามันเริ่มทำให้ทุกอย่างช้าลง!
ใช้ 2

5

ใช้ ClientID เพื่อรับรหัส "ของจริง" ของตัวควบคุมในโครงการ ASP.NET

jQuery('#<%=myLabel.ClientID%>');

นอกจากนี้หากคุณใช้ jQuery ใน SharePoint คุณต้องโทร jQuery.noConflict ()


11
? สิ่งนี้เป็นอย่างไร มันเป็นวิธีการแก้ปัญหาสำหรับพฤติกรรม ASP.NET
SolutionYogi

1
ใช่. มันไม่ใช่ปัญหา jQuery มันเป็นความผิดของ asp.net webforms
redsquare

3
ตกลง แต่นี่คือสิ่งที่คุณต้องระวังเมื่อใช้ jQuery ใน ASP.NET โดยไม่คำนึงถึง
Jacobs Data Solutions

2
OP ไม่ได้พูดถึง asp.net
redsquare

4

ผ่าน ID แทน jQuery วัตถุไปยังฟังก์ชั่น:

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

ผ่านชุดห่อมีความยืดหยุ่นมากขึ้น:

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.

3

การใช้มากเกินไปของการผูกมัด

ดูนี่:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

คำอธิบาย


1
มันดูตลกดีมันเป็นเรื่องที่ทำให้งงงวย
Dykam

6
การผูกมัด (ด้วยตัวเอง) เป็นการยากที่จะใช้ 'เกิน' ดูเหมือนว่ารหัสดังกล่าวจะใช้ตัวดำเนินการตัวที่สามของ javascript มากเกินไป ดู en.wikipedia.org/wiki/Ternary_operation#JavaScriptสำหรับข้อมูลเพิ่มเติม
Dan Esparza

3
ฉันดีใจที่ฉันไม่ต้องดูแลรหัสของคุณ
cdmckay

3

ใช้สายอักขระแบบตัวสะสม

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

a += 'x' + 'y';

ได้เร็วขึ้น:

a += 'x';
a += 'y';

การดำเนินการดั้งเดิมอาจเร็วกว่าการเรียกใช้ฟังก์ชัน

พิจารณาใช้การดำเนินการดั้งเดิมทางเลือกเหนือการเรียกใช้ฟังก์ชั่นในลูปและฟังก์ชั่นที่สำคัญ ช้า:

var min = Math.min(a, b);
arr.push(val);

ได้เร็วขึ้น:

var min = a < b ? a : b;
arr[arr.length] = val;

อ่านเพิ่มเติมได้ที่JavaScript Best Practices



1

สองเซ็นต์ของฉัน)

โดยปกติแล้วการทำงานกับ jquery หมายความว่าคุณไม่ต้องกังวลเกี่ยวกับองค์ประกอบ DOM จริงตลอดเวลา คุณสามารถเขียนสิ่งนี้ - $('div.mine').addClass('someClass').bind('click', function(){alert('lalala')})และรหัสนี้จะทำงานโดยไม่ทิ้งข้อผิดพลาดใด ๆ

ในบางกรณีสิ่งนี้มีประโยชน์ในบางกรณี - ไม่ใช่ทั้งหมด แต่เป็นข้อเท็จจริงที่ว่า jquery มีแนวโน้มที่จะเป็นมิตรการแข่งขันที่ว่างเปล่า แต่replaceWithจะโยนข้อผิดพลาดหากพยายามใช้กับองค์ประกอบที่ไม่ได้เป็นของเอกสาร ฉันคิดว่ามันค่อนข้างตอบโต้ได้ง่าย

อันตรายก็คือในความคิดของฉันคำสั่งของโหนดที่ส่งกลับโดย prevAll () วิธีการ $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll()- ไม่ใช่เรื่องใหญ่จริง แต่เราควรระลึกถึงความจริงข้อนี้


0

หากคุณวางแผนที่จะใช้ Ajax ในข้อมูลจำนวนมากเช่นพูดว่า 1,500 แถวของตารางที่มี 20 คอลัมน์อย่าคิดแม้แต่การใช้ jQuery เพื่อแทรกข้อมูลนั้นลงใน HTML ของคุณ ใช้ JavaScript ธรรมดา jQuery จะช้าเกินไปสำหรับเครื่องที่ช้าลง

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


1
-1 ฟังก์ชั่น. html ()นั้นเร็วพอ ๆ กับวิธีเนทีฟ
cllpse

ทุกคนที่ downvoting ฉันเห็นได้ชัดว่าไม่ได้พยายามแทรก DOM จำนวนมากบน IE และดูสิ่งต่าง ๆ ช้าลง เหตุผล jquery ช้าคือมันจะไม่เพียงแทรก dom แต่ทำสิ่งอื่น ๆ เช่นตรวจสอบว่า dom มีสคริปท์และเรียกใช้งานมันถ้าอยู่ใน IE และสิ่งอื่น ๆ ที่คุณไม่จำเป็นต้องทำถ้าคุณรู้อย่างแน่นอน คุณใส่ข้อมูลประเภทใด
mkoryak

1
ตราบใดที่คุณไม่ต้องกังวลเกี่ยวกับการรั่วไหลของเบราว์เซอร์และ.innerHTMLจะทำเช่นนั้น แต่ถ้าคุณกำลังสร้างอะไรบางอย่างเช่น Gmail ที่ซึ่งผู้ใช้เปิดแท็บไว้หลายชั่วโมงคุณจะต้องกัดกระสุนและจัดการกับความช้าพิเศษ สำหรับสิ่งที่อยากรู้อยากเห็นนี่คือสิ่งที่ jQuery .html()ทำ: james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev

-1

การใช้ jQuery ในโครงการขนาดเล็กที่สามารถทำให้เสร็จได้ด้วย JavaScript ธรรมดาสองบรรทัด


ฉันไม่รังเกียจที่จะถูกแก้ไข แต่โปรดโต้แย้งการเลือกของคุณ
หนีบ

8
-1 jQuery abstracts API ที่ใช้งานไม่ได้ วิธีนี้ทำให้คุณมั่นใจได้ว่ารหัสของคุณใช้งานได้ สมมติว่าคุณเขียนโค้ดโดยใช้ jQuery และบางเบราว์เซอร์ - ข้อผิดพลาดจะถูกนำมาใช้กับเวอร์ชันใหม่สิ่งที่คุณต้องทำคือการนำเข้ากรอบงาน jQuery ที่อัปเดตแล้ว เมื่อเทียบกับต้องคิดออกวิธีการแก้ปัญหาด้วยตัวเอง
cllpse

+1 ดูเหมือนว่าสมเหตุสมผลสำหรับฉัน - ถ้าคุณใช้เพียงไม่กี่บรรทัดให้ใช้วานิลลา JS
alex

1
@roosteronacid การโต้เถียงของคุณผิดพลาด เป็นไปได้ยากที่เบราว์เซอร์จะแนะนำการถดถอยในสคริปต์ที่มีความซับซ้อนน้อยกว่าหรือจัดการกับปัญหา crossbrowser สำหรับเรื่องนั้น สองปีที่แล้วฉันทำงานกับ mootools และภายใต้สถานการณ์บางอย่างฉันไม่สามารถอ่านเนื้อหาองค์ประกอบใน IE ได้ หลังจากผ่านไปหลายชั่วโมงเพื่อหาปัญหาฉันแค่เขียนส่วนนั้นใหม่ด้วย js ธรรมดา ดังนั้นจึงเป็นไปได้ที่ jQuery จะแตกมากกว่า javascript ธรรมดาที่ล้มเหลวเนื่องจากการอัพเกรดเบราว์เซอร์ ฉันจะแก้ไขข้อบกพร่องของตัวเองทุกวันแทนที่จะแฮ็ครหัสห้องสมุด
หนีบ

3
couple of lines of ordinary JavaScriptแน่นอนไม่มีปัญหา. แต่มันจะเป็นเมื่อใด คนที่พูดว่า "ทำไมไม่ใช้วานิลลาจาวาสคริปต์?" ยังไม่ได้ถูกกัดอย่างหนักโดย IE แต่ ... และยังไม่ต้องพูดถึงว่า cruft และรหัสสำเร็จรูปที่คุณต้องเขียนเพื่อทำสิ่งต่าง ๆ ใน JS แบบเก่าธรรมดา
adamJLev

-3

ไม่เข้าใจเหตุการณ์ผูกพัน JavaScript และ jQuery ทำงานแตกต่างกัน

ตามความต้องการที่เป็นที่นิยมตัวอย่าง:

ใน jQuery:

$("#someLink").click(function(){//do something});

ไม่มี jQuery:

<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
    //do something
}
</script>

โดยทั่วไปตะขอที่จำเป็นสำหรับ JavaScript นั้นไม่จำเป็นอีกต่อไป นั่นคือการใช้มาร์กอัปแบบอินไลน์ (onClick ฯลฯ ) เพราะคุณสามารถใช้ ID และคลาสที่นักพัฒนาจะใช้ประโยชน์จาก CSS ตามปกติ


5
สนใจที่จะทำอย่างละเอียด? โดยเฉพาะอย่างยิ่งตัวอย่าง?
SolutionYogi

7
JavaScript ไม่ได้ให้ addEventListener () และ attachEvent () เพื่อทำสิ่งนี้?
อเล็กซ์

2
การแยกความกังวลผู้ชาย เก็บ HTML และ JS แยกจากกัน
Don
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.