ฉันจะอ้างอิงคุณสมบัติของวัตถุจาวาสคริปต์ด้วยยัติภังค์ได้อย่างไร


106

การใช้สคริปต์นี้เพื่อสร้างสไตล์อ็อบเจ็กต์ของสไตล์ ฯลฯ ที่สืบทอดมาทั้งหมด

var style = css($(this));
alert (style.width);
alert (style.text-align);

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


เดมอนที่อยู่ความคลุมเครือและความสับสน (สะท้อนให้เห็นโดยคำตอบที่แตกต่างและเพิ่ม / ลบออก downvotes ขึ้นอยู่กับการตีความ ... ): คุณ CSS คุณสมบัติเฉพาะค่าเฉลี่ยเป็นนัยโดยตัวอย่างของคุณและสันนิษฐานโดยคำตอบมากที่สุดหรือคุณสมบัติ JS ใด ๆโดยทั่วไปตามที่ระบุโดยชื่อและไม่มีCSSแท็ก? [ใช่ฉันรู้ว่ามันผ่านมา 7 ปีแล้ว :)]
.

@Sz. ฉันหมายถึงany js propertyเพราะฉันมีปัญหากับการอ้างอิงคุณสมบัติที่มียัติภังค์อยู่ในนั้น (ซึ่งก็เป็นคุณสมบัติ css ด้วย ... ฉันไม่รู้ว่ามีปัญหาอื่นกับสิ่งที่ฉันพยายามจะทำ) มันเป็นเรื่องแปลกที่จบลงด้วย 2 ประเด็นที่แตกต่างกัน แต่ฉันจะบอกว่าคำตอบด้านบนอธิบายทั้งสองประเด็น
Damon

คำตอบ:


155

แก้ไข

ดูความคิดเห็นคุณจะเห็นว่าสำหรับสัญกรณ์คีย์คุณสมบัติ css เข้ากันไม่ได้กับคุณสมบัติหลายอย่าง การใช้สัญกรณ์แป้นกรณีอูฐจึงเป็นวิธีปัจจุบัน

obj.style-attr // would become 

obj["styleAttr"]

ใช้สัญลักษณ์แทนจุด

style["text-align"]

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

arr[0]

หรือวัตถุ

obj["method"] == obj.method

สองสิ่งที่ต้องจำเมื่อเข้าถึงคุณสมบัติด้วยวิธีนี้

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

    ซึ่งหมายความว่า obj [วิธีการ] จะทำให้คุณมีข้อผิดพลาดที่ไม่ได้กำหนดในขณะที่ obj ["method"] จะไม่

  2. คุณต้องใช้สัญกรณ์นี้หากคุณใช้อักขระที่ไม่ได้รับอนุญาตในตัวแปร js

regex นี้สรุปได้ค่อนข้างมาก

[a-zA-Z_$][0-9a-zA-Z_$]*

1
สัญลักษณ์สำคัญใช้ไม่ได้ที่นี่ - css กำหนดรูปแบบโดยใช้ตัวพิมพ์อูฐในคีย์: jsfiddle.net/49vkD
Brian

เบราว์เซอร์อะไร ล้มเหลวสำหรับฉันในเครื่องหมายยัติภังค์ใน IE7, IE8, FFX 3.5 และโดยความล้มเหลวฉันหมายถึงการแสดง "ไม่ได้กำหนด" สำหรับทั้งสองสิ่งนี้ ...
Brian

@brian ทดสอบในซาฟารีและโครเมี่ยมแสดงสีแดงสีแดงตรงกลางตรงกลาง ฉันจะลองใน ff ตอนนี้
austinbv

@brian น่าสนใจไม่ได้ทำงานใน firefox6 ฉันไม่รู้ว่า ... เรียนรู้สิ่งใหม่ ๆ ทุกวัน
austinbv

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

18

คุณสมบัติ CSS ที่มี a -แสดงอยู่ใน camelCase ในวัตถุ Javascript นั่นจะเป็น:

alert( style.textAlign );

คุณยังสามารถใช้เครื่องหมายวงเล็บเพื่อใช้สตริง:

alert( style['text-align'] );

ชื่อคุณสมบัติต้องประกอบด้วยอักขระตัวเลข$เครื่องหมายที่รู้จักกันดีและ_(ขอบคุณ pimvdb)


ผลงานหลัง .. หนึ่งในสิ่ง syntaxy ที่ฉันเพิ่งพลาดไป สคริปต์ที่ฉันอ้างถึงใช้ชื่อสไตล์ css ปกติ แต่ก็ยังมีประโยชน์ที่ควรทราบ!
Damon

ชื่อคุณสมบัติไม่สามารถขึ้นต้นด้วยตัวเลขได้
austinbv

ชื่อคุณสมบัติสามารถมีอักขระ Unicode ได้มากมาย ใช้ได้กับสเป็คและใช้ได้กับเบราว์เซอร์ ตัวอย่างเช่น:var ò_ó = 'angry';
Camilo Martin

อย่าใช้รหัสที่สอง คุณสมบัติ CSS เป็นแบบอูฐ โค้ดของคุณอาจใช้ได้กับบางเบราว์เซอร์ แต่ไม่ได้มาตรฐาน
Oriol

17

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

obj['property-with-hyphens'];

หลายคนชี้ให้เห็นว่าคุณสมบัติที่คุณสนใจคือคุณสมบัติ CSS คุณสมบัติ CSS ที่มีขีดกลางจะถูกแปลงเป็นปลอกอูฐโดยอัตโนมัติ ในกรณีนี้คุณสามารถใช้ชื่ออูฐในกล่องเช่น:

style.textAlign;

อย่างไรก็ตามโซลูชันนี้ใช้ได้กับคุณสมบัติ CSS เท่านั้น ตัวอย่างเช่น,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2

2
@ ไบรอันคุณถูกต้องสำหรับคุณสมบัติ CSS อย่างไรก็ตามฉันกำลังตอบคำถามทั่วไปเดิม "ฉันจะอ้างอิงคุณสมบัติวัตถุจาวาสคริปต์ที่มีเครื่องหมายยัติภังค์อยู่ในนั้นได้อย่างไร" นี่คือ jsfiddle เวอร์ชันอัปเดตของคุณ: jsfiddle.net/49vkD/1
Stoney

1
แน่นอนฉัน จำกัด ขอบเขตของคำตอบที่นี่ด้วยตัวเอง - ฉันคิดว่า OP หมายถึงวัตถุสไตล์โดยเฉพาะ ลบการโหวตลงคะแนนของฉันออกเนื่องจากคำถามเปิดกว้างกว่านั้นเล็กน้อย
Brian

ฉันคิดว่าคุณถูกต้อง นั่นคือสิ่งที่อาจเป็นสิ่งที่เดมอนต้องการ ฉันอ่านมันเกินไปจริงๆ
Stoney

คุณต้องใช้ชื่อที่ใส่อูฐ ไม่สามารถ .
Oriol

9

ใช้วงเล็บ:

var notTheFlippingStyleObject = {
    'a-b': 1
};

console.log(notTheFlippingStyleObject["a-b"] === 1); // true

ข้อมูลเพิ่มเติมเกี่ยวกับวัตถุ: MDN

หมายเหตุ: หากคุณกำลังเข้าถึงสไตล์อ็อบเจ็กต์CSSStyleDeclaration การใช้ต้อง camelCase เพื่อเข้าถึงจากจาวาสคริปต์ ข้อมูลเพิ่มเติมที่นี่


1
คุณไม่ได้สนใจฉัน - คุณกำลังสนใจมาตรฐาน w3c ต่อผู้ตอบคำถามอื่น ๆ อีกมากมายสำหรับคำถามนี้: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Propertiesแต่เพิ่มคะแนนเท่ากัน ..

ห้ามใช้รหัสนี้ ไม่ใช่ว่าคุณสมบัติ CSS ของอูฐจะเป็นแบบข้ามเบราว์เซอร์ แต่การใช้ยัติภังค์แทนกรณีอูฐนั้นไม่ได้มาตรฐานและไม่ควรได้ผล
Oriol


4

เพื่อตอบคำถามโดยตรง: style['text-align']คุณจะอ้างอิงคุณสมบัติที่มียัติภังค์อยู่ในนั้นอย่างไร แต่style.textAlign(หรือstyle['textAlign']) คือสิ่งที่ควรใช้ในกรณีนี้


อย่าใช้สิ่งนี้ คุณสมบัติ CSS เป็นแบบอูฐ โค้ดของคุณอาจใช้ได้กับบางเบราว์เซอร์ แต่ไม่ได้มาตรฐาน
Oriol

ปรับใช้กรณีอูฐ
Dawson Toth


3

เพื่อแก้ปัญหาของคุณคุณสมบัติ CSS ที่มีขีดกลางแสดงโดยคุณสมบัติ JavaScript ใน camelCaseเพื่อหลีกเลี่ยงปัญหานี้ คุณต้องการ: style.textAlign.

เพื่อตอบคำถาม : ใช้เครื่องหมายวงเล็บเหลี่ยม : obj.propเหมือนกับobj["prop"]เพื่อให้คุณสามารถเข้าถึงชื่อคุณสมบัติโดยใช้สตริงและใช้อักขระที่ห้ามใช้ในตัวระบุ



2

ผมคิดว่าในกรณีของรูปแบบ CSS ที่พวกเขาได้รับการเปลี่ยนแปลงที่จะ CamelCase ใน Javascript เพื่อให้กลายเป็นtest-align textAlignในกรณีทั่วไปที่คุณต้องการเข้าถึงคุณสมบัติที่มีอักขระที่ไม่ใช่มาตรฐานที่คุณใช้สไตล์อาร์เรย์ ['text-align']


0

ตอนแรกฉันสงสัยว่าทำไมการแก้ปัญหาถึงไม่ได้ผลในตอนท้ายของฉัน

api['data-sitekey'] //returns undefined

... ในภายหลังพบว่าการเข้าถึงแอตทริบิวต์ข้อมูลแตกต่างกันควรเป็นดังนี้:

var api = document.getElementById("some-api");
api.dataset.sitekey

หวังว่านี่จะช่วยได้!

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