การจัดการลำไส้ใหญ่ในองค์ประกอบ ID ด้วย jQuery


145

เราไม่สามารถเข้าถึงองค์ประกอบ div ด้วย ID "test: abc" ในรหัส JS โดยใช้ jQuery

<div id="test:abc">

$('#test:abc') 

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


โดยทั่วไปจะเป็นอะไรที่ดีได้รับการยอมรับเพราะคำตอบที่ดีที่สุดคือในที่สุดก็ไม่ได้เป็นคนจัดอันดับชั้นนำ (คำใบ้: ตรวจสอบคำตอบของฉัน)
Toskan

ฉันดีใจที่คุณพบวิธีแก้ปัญหารูปแบบย่อยของตรินิแดดต้องแยกออกมาเป็นแบบแผนการตั้งชื่อ
Jack Tuck

IBM Domino (xpages) ทำสิ่งเดียวกัน มันเป็นการ jQuery ที่เป็นปัญหาเนื่องจากโคลอนนั้นเป็นข้อความ ID ที่ถูกต้อง
user2808054

คำตอบ:



85

ในระยะสั้น

$(document.getElementById("test:abc")) คือสิ่งที่คุณควรใช้

คำอธิบาย : นอกเหนือจากการเพิ่มความเร็ว (ดูเพิ่มเติมลง) มันง่ายต่อการจัดการ

ตัวอย่าง: สมมติว่าคุณมีฟังก์ชั่น

   function doStuff(id){

       var jEle = $("#" + id); //is not safe, since id might be "foo:bar:baz" and thus fail. 
       //You would first have to look for ":" in the id string, then replace it

       var jEle = $(document.getElementById(id)); //forget about the fact 
      //that the id string might contain ':', this always works
    }

    //just to give an idea that the ID might be coming from somewhere unkown
    var retrievedId = $("foo").attr("data-target-id");
    doStuff(retrievedId); 

ความเร็ว / เวลา

ดูที่jsbinนี้ซึ่งทดสอบและเปรียบเทียบความเร็วของวิธีการเลือกของ ID กับโคลอน

คุณต้องเปิดคอนโซล firebug เพื่อรับผลลัพธ์

ฉันทดสอบกับ firefox 10 และ jQuery 1.7.2

โดยพื้นฐานแล้วฉันได้เลือก 10'000 เท่าของ div ด้วยเครื่องหมายโคลอนใน id - ด้วยวิธีการต่าง ๆ เพื่อให้บรรลุ จากนั้นฉันเปรียบเทียบผลลัพธ์กับการเลือก ID โดยไม่มีเครื่องหมายจุดคู่อยู่ผลลัพธ์น่าแปลกใจมาก

เวลาที่เหลือในวิธีการเลือก ms ที่เหมาะสม

299 $("#annoying\\:colon")

302 $("[id='annoying:colon']"

20 $(document.getElementById("annoying:colon"))


71 $("#nocolon")

294 $("[id='nocolon']")

โดยเฉพาะอย่างยิ่ง

  71 $("#nocolon") and
299 $("#annoying\\:colon")

แปลกใจนิดหน่อย


3
สิ่งนี้มีประโยชน์จริง ๆ และควรได้รับการสนับสนุนมากขึ้น . แม้ว่านี้, $ ( "[id = 'น่ารำคาญ: ลำไส้ใหญ่']" งาน document.getElementById น่าจะเป็นสิ่งที่ควรนำมาใช้.
เออร์วิน

4
เพียงใช้รหัสที่ซับซ้อนยิ่งขึ้นเพื่อเก็บผลลัพธ์เดียวกันเพียงเพราะมันเร็วกว่านั้นคือกรณีของการปรับให้เหมาะสมก่อนกำหนด คุณควรจะชอบโค้ดที่อ่านได้มากกว่าโค้ดเร็ว ๆ ยกเว้นว่ามันเป็นคอขวดของประสิทธิภาพ หรือในคำพูดของวิลเลียมวูล์ฟ : "ความบาปในการคำนวณมีความมุ่งมั่นในชื่อของประสิทธิภาพ (โดยไม่จำเป็นต้องทำให้สำเร็จ) มากกว่าเหตุผลเดียวอื่น ๆ - รวมถึงความโง่เขลาตาบอด" ข้อมูลเพิ่มเติมที่นี่
nfechner

3
ดูเหมือนว่าจะดีขึ้นเมื่อใช้ jQuery รุ่นใหม่ (2.1.1): 32 $("#annyoing\\:colon") , 29 $("[id='annyoing:colon']") , 5 $(document.getElementById("annyoing:colon")) , 8 $("#nocolon") , 31 $("[id='nocolon']")
Möhre

@ Möhreดีที่ได้ยิน น่าเศร้าที่ IE8 ยังคงเป็นปัญหาอยู่ (และไม่สนับสนุนโดย jQuery 2) แต่นับถอยหลังสำหรับ IE8 เป็นอย่างต่อเนื่องtheie8countdown.com
Toskan

1
@nfechner ความคิดเห็นของคุณอ่านได้มากขึ้นคืออะไร? $("#annoying\\:colon")หรือ$(document.getElementById("annoying:colon"))?
Jakub Godoniuk

29

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

 $('[id="test:abc"]')

9

ฉันจะใช้document.getElementByIdและส่งผลลัพธ์ไปยังjQuery()ฟังก์ชัน

var e = document.getElementById('test:abc');
$(e) // use $(e) just like $('#test:abc') 

7

ใช้แบ็กสแลชสองอัน \\

การสาธิต

ตามที่เขียนไว้ที่นี่

หากคุณต้องการใช้เมตาอักขระใด ๆ (เช่น! "# $% & '() * +,. / :; <=>? @ [] ^` {|} ~) เป็นส่วนหนึ่งของตัวอักษร ชื่อคุณต้องหลีกเลี่ยงอักขระที่มีแบ็กสแลชสองตัว: \ ตัวอย่างเช่นหากคุณมีองค์ประกอบที่มี id = "foo.bar" คุณสามารถใช้ตัวเลือก $ ("# foo \ .bar") ข้อมูลจำเพาะ CSS ของ W3C มีความสมบูรณ์

การอ้างอิง


4

อ้างอิงถึงคำตอบของ Toskan ฉันอัปเดตรหัสของเขาเพื่อให้อ่านได้ง่ายขึ้นเล็กน้อยจากนั้นส่งออกไปยังหน้า

นี่คือการเชื่อมโยง jbin นี้: http://jsbin.com/ujajuf/14/edit



นอกจากนี้ฉันวิ่งไปพร้อมกับวนซ้ำมากขึ้น

Iterations:1000000

Results:    
12794   $("#annyoing\\:colon")
12954   $("[id='annyoing:colon']"
754 $(document.getElementById("annyoing:colon"))
3294    $("#nocolon")
13516   $("[id='nocolon']")

มากไปกว่านั้น:

Iterations:10000000

Results:    
137987  $("#annyoing\\:colon")
140807  $("[id='annyoing:colon']"
7760    $(document.getElementById("annyoing:colon"))
32345   $("#nocolon")
146962  $("[id='nocolon']")


1

ไวยากรณ์นี้ใช้$('[id="test:abc"]') งานได้สำหรับฉัน ฉันใช้Netbeans 6.5.1และสร้างส่วนประกอบที่มีที่มีid : (colon)ฉันลอง\\& & \3Aแต่ไม่มีใครทำงาน


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