เลือกองค์ประกอบตามคุณสมบัติ


253

ฉันมีช่องทำเครื่องหมายที่มีรหัสที่สร้างขึ้นและบางส่วนมีคุณสมบัติพิเศษ เป็นไปได้ไหมที่จะใช้ JQuery เพื่อตรวจสอบว่าองค์ประกอบมีคุณสมบัติเฉพาะหรือไม่? ตัวอย่างเช่นฉันสามารถตรวจสอบว่าองค์ประกอบต่อไปนี้มีแอตทริบิวต์ "myattr" หรือไม่ ค่าของคุณสมบัติสามารถแตกต่างกันไป

<input type="checkbox" id="A" myattr="val_attr">A</input>

ตัวอย่างเช่นฉันจะรับชุดรวมทั้งหมดของช่องทำเครื่องหมายที่มีคุณลักษณะนี้โดยไม่ทำเครื่องหมายทีละรายการได้อย่างไร เป็นไปได้ไหม


2
นอกเหนือจากนี้ <input /> เป็นแท็กเปล่าที่ไม่ได้มีเนื้อหาภายใน บางทีคุณอาจจะไม่ได้เกี่ยวข้องกับการตรวจสอบความเห็นที่คุณมีในปัจจุบัน myatttr ...
ScottE


หากคุณมีคอลเล็กชันอยู่แล้วและคุณต้องการกรองเฉพาะองค์ประกอบที่มีแอตทริบิวต์เฉพาะ - เพียงแค่ทำ$filtered = $collection.filter('[attribute_name]');
jave.web

คำตอบ:


190

คุณหมายถึงคุณสามารถเลือกพวกเขา? ถ้าเป็นเช่นนั้นใช่:

$(":checkbox[myattr]")

4
โปรดทราบว่าหากคุณกำลังทดสอบการมีอยู่ (ตัวอย่างเช่นในคำสั่ง if เป็นต้น) อาจเป็นสิ่งที่ถูกต้อง / น่าเชื่อถือมากกว่า: if ($ (": ช่องทำเครื่องหมาย [myattr]"). length ()> 0) ...
rinogo

14
@rinogo: ที่จริงแล้วสิ่งที่คุณต้องการคือถ้า ($ (": ช่องทำเครื่องหมาย [myattr]"). ความยาว) ไม่จำเป็นต้องใช้ () หลังจากความยาวไม่เป็น> 0, 0 ประเมินว่าเป็นเท็จในการทดสอบความเท่าเทียมกันที่ไม่ต้องการความเท่าเทียมอย่างเข้มงวด (ทั้งค่าและประเภท)
bmarti44

1
มันจะพ่นข้อผิดพลาด js ถ้าคุณลองทำเช่น: td [myattr] ดังนั้นฉันคิดว่าคุณลักษณะนี้กำหนดเป้าหมายเป็นช่องทำเครื่องหมายเฉพาะ
fooledbyprimes

6
โคลอนเลือกคลาสหลอกโดยพิจารณาจากประเภท attr หากต้องการใช้สิ่งเดียวกันกับ td เพียงละเว้นเครื่องหมายจุดคู่
dhochee

หรือถ้าคุณต้องการดูว่ามีบางอย่างที่ไม่มีแอตทริบิวต์เช่นค้นหาลิงก์ทั้งหมดที่ไม่มีhrefแอตทริบิวต์$("#myBox").find('a').filter(':not([href])')
timbrown

368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

แก้ไข:

ข้างต้นจะอยู่ในelse-branch เมื่อmyattrมีอยู่ แต่เป็นสตริงว่างหรือ "0" หากเป็นปัญหาคุณควรทดสอบอย่างชัดเจนในundefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

3
ไม่ใช่คำตอบที่ดี "undefined" ไม่ใช่คำหลักใน Javascript ดูconstc.blogspot.com/2008/07/…
mhenry1384

16
คุณพูดถูก ... แต่การกำหนดนิยามใหม่undefinedถือเป็นกรณีขอบ
Stefan Gehrig

6
ไม่ทำงานหากแอตทริบิวต์มีสตริงว่าง ตัวอย่างคือ myattr = ''
mythicalprogrammer

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

8
if (typeof $ ('# A'). attr ('myattr')! == 'undefined')
James Westgate

166

ฉันรู้ว่าเป็นเวลานานแล้วตั้งแต่คำถามถูกถาม แต่ฉันพบว่าเช็คมีความชัดเจนเช่นนี้:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(เท่าที่พบในเว็บไซต์นี้ที่นี่ )

เอกสารเกี่ยวกับการจะสามารถพบได้ที่นี่


ตาม W3C คุณลักษณะบูลีนจะถูกกำหนดโดยการมีหรือไม่มีคุณลักษณะ jQuery จัดเตรียมเมธอด .attr () เพื่อจัดการค่าแอ็ตทริบิวต์ แต่เราจะเพิ่มแอตทริบิวต์ที่ไม่มีค่าได้อย่างไร วิธีการที่คุณให้ไว้เพื่อทดสอบว่ามีแอตทริบิวต์ไม่ได้อธิบายไว้ในเอกสารประกอบ jQuery (1.8.2) คุณรู้วิธีเพิ่มแอตทริบิวต์ด้วย jQuery หรือไม่?
chmike

@chmike เพื่อเพิ่มคุณสมบัติฉันจะทำเช่นนี้: $ ("# A"). prop ("myNewAttribute", someValue); คุณสามารถให้มูลค่ามูลค่าใด ๆ ที่คุณเลือกได้: สตริง, จำนวน, สตริงว่าง, จริง / เท็จ
Jonathan Bergeron

สิ่งนี้จะเพิ่มแอททริบิวด้วยค่าที่กำหนดซึ่งไม่เหมือนกับแอททริบิวที่ไม่มีค่า
chmike

5
ฉันเห็นด้วยนี่เป็นคำตอบที่ดีที่สุด (ใช้ jQuery) - ชัดเจนและรัดกุม ฉันพบว่าตัวเองสงสัยว่าทำไม jQuery ไม่เพียงมีฟังก์ชั่น hasAttribute () และคำตอบคือจาวาสคริปต์ดั้งเดิมนั้นมีอยู่แล้ว องค์ประกอบ HTML Dom ใด ๆ ที่มีเมธอด hasAttribute ('attributeName') ดังนั้นคุณสามารถทำได้: $ ('# A') [0] .hasAttribute ('myattr') @chmike - ฉันไม่คิดว่าคุณสามารถเพิ่มแอททริบิวต์ว่างโดยใช้ฟังก์ชั่น jQuery แต่คุณสามารถทำได้ด้วย HTML Dom Element วัตถุในวิธีที่คล้ายกันดังนี้ $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Daniel Howard

1
แค่ความคิดเห็นที่ฉันชอบคำตอบนี้ แต่ก็สับสนเกี่ยวกับความคิดเห็นที่ถามถึงวิธีการเพิ่มแอตทริบิวต์โดยไม่มีค่า สิ่งเหล่านี้ไม่เกี่ยวข้องกับคำถามหรือคำตอบ
goodeye

9

สิ่งนี้จะได้ผล:

$('#A')[0].hasAttribute('myattr');


@RetroCoder จุดของคุณเกี่ยวกับลิงค์ของคุณคืออะไร? การทดสอบนี้ดูเหมือนจะค่อนข้างดีโดยเฉพาะอย่างยิ่งเพราะคุณมักจะใช้$(this).<something>เมื่ออยู่ที่นี่คุณสามารถทำได้this.hasAttribute('...')โดยตรง (และไม่สนใจเบราว์เซอร์รุ่นเก่า)
Alexis Wilke

8

ใน JavaScript, ...

null == undefined

... ส่งคืนtrue* มันเป็นความแตกต่างระหว่างและ== ===นอกจากนี้ยังundefinedสามารถกำหนดชื่อได้ (ไม่ใช่คำหลักที่เหมือนกันnull) ดังนั้นคุณควรตรวจสอบวิธีอื่นดีกว่า วิธีที่น่าเชื่อถือที่สุดน่าจะเป็นการเปรียบเทียบค่าตอบแทนของtypeofผู้ปฏิบัติงาน

typeof o == "undefined"

อย่างไรก็ตามการเปรียบเทียบกับ null ควรทำงานในกรณีนี้

* undefinedในความเป็นจริงแล้วยังไม่ได้กำหนด


ไม่ได้กำหนดไม่ใช่คำหลักที่สงวนไว้ใน JavaScript ใน jQuery มันเป็นไปได้ munging ชื่อของมันเพราะมันถูกสร้างขึ้นด้วยตัว "var" และไม่ได้มูลค่า ด้านบนของโค้ดไลบรารีเวทย์มนตร์ infact มีบรรทัดที่ระบุว่า "var undefined;" และด้วยวิธีนี้ตัวแปรที่ไม่ได้กำหนดจะถูกกำหนดด้วยชื่อนั้นในขอบเขต jQuery ... แต่มันอาจเหมือนกันในชื่อ "unnamed" โดยการพิมพ์ "var unnamed;"
Emanuele Del Grande

1
นี่ไม่ใช่การตรวจสอบคุณลักษณะการตรวจสอบคุณสมบัติในวัตถุจาวาสคริปต์เพราะเหตุใดจึงมี 6 upvotes
ncubica


4

แนวคิดสองสามอย่างถูกโยนโดยใช้ "typeof", jQuery ".is" และ ".filter" ดังนั้นฉันคิดว่าฉันจะโพสต์การเปรียบเทียบที่สมบูรณ์แบบของพวกเขา ประเภทของดูเหมือนจะเป็นตัวเลือกที่ดีที่สุดสำหรับสิ่งนี้ ในขณะที่คนอื่นจะทำงานดูเหมือนจะมีความแตกต่างของประสิทธิภาพที่ชัดเจนเมื่อเรียกใช้ไลบรารี jq สำหรับความพยายามนี้


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
สิ่งนี้อาจไม่ได้ผลเนื่องจากคุณสามารถเพิ่มแอททริบิวได้โดยไม่มีค่า ในกรณีเช่นนี้เงื่อนไขนี้จะผ่านไปแม้ว่าพฤติกรรมที่ต้องการอาจจะกลับมาจริง แต่แอตทริบิวต์ถูกตั้งค่า คล้ายกับ PHPs isset()หรือตัวอย่างใน js $("#element").attr('my_attr') === false,
ulkas

2

เช่นเดียวกับในโพสต์นี้การใช้.isและตัวเลือกแอททริบิวต์[]คุณสามารถเพิ่มฟังก์ชั่น (หรือต้นแบบ) ได้อย่างง่ายดาย:

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}

1
$("input#A").attr("myattr") == null

1
$ (). attr () จะไม่คืนค่า NULL ตามที่แนะนำโดยตัวอย่างของเรา แต่มันจะกลับมาไม่ได้กำหนด
Stefan Gehrig

งานสำหรับฉันในวางเพลิง แต่นั่นอาจจะเป็นสิ่งที่วางเพลิง
งัด F

ไม่ได้พยายามมัน แต่นั่นคือสิ่งที่เอกสาร says: docs.jquery.com/Attributes/attr#name
สเตฟานไป๋

1

เพียง:

$('input[name*="value"]')

ข้อมูลเพิ่มเติม: เอกสารอย่างเป็นทางการ


1
เครื่องหมายคำพูดคู่ที่ไม่ใช้ค่า Escape ภายในสตริงที่กำหนดด้วยเครื่องหมายคำพูดคู่ไม่ใช่สตริงที่ถูกต้อง น่าเสียดายที่ฉันไม่สามารถแก้ไขให้คุณได้เนื่องจากการแก้ไขต้องเปลี่ยน 6 ตัวอักษรขึ้นไป แต่จำเป็นต้องเปลี่ยน
Jimbo Jonny

0

นอกเหนือจากการเลือกองค์ประกอบทั้งหมดด้วยแอททริบิวต์$('[someAttribute]')หรือ$('input[someAttribute]')คุณสามารถใช้ฟังก์ชันสำหรับการตรวจสอบบูลีนบนวัตถุเช่นในตัวจัดการการคลิก:

if(! this.hasAttribute('myattr') ) { ...


0

ฉันได้สร้างแพ็กเกจ NPM ที่มีพฤติกรรมตามที่อธิบายไว้ข้างต้น

ลิงก์ไปยัง[npm]และ[github]

การใช้งานง่ายมาก ตัวอย่างเช่น:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

ผลตอบแทนจริง

ทำงานร่วมกับอูฐด้วย


0

หากต้องการเลือกองค์ประกอบที่มีแอตทริบิวต์ที่แน่นอนให้ดูคำตอบด้านบน

ในการตรวจสอบว่าองค์ประกอบ jQuery ที่กำหนดมีแอตทริบิวต์เฉพาะฉันใช้ปลั๊กอินขนาดเล็กที่ส่งกลับtrueถ้าองค์ประกอบแรกในคอลเลกชัน ajQuery มีคุณลักษณะนี้:

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}

-5

JQuery จะส่งคืนแอตทริบิวต์เป็นสตริง ดังนั้นคุณสามารถตรวจสอบความยาวของสตริงนั้นเพื่อตรวจสอบว่ามีการตั้งค่า:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

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

6
มันจะล้มเหลวในกรณีที่ไม่มีแอตทริบิวต์ในกรณีที่ $ ("อินพุต # A"). attr ("myattr") กลับไม่ได้กำหนดมากกว่าสตริงและ undefined.length จะล้มเหลว
Rune FS

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