Làm cách nào để tham chiếu thuộc tính đối tượng javascript có dấu gạch ngang trong đó?


106

Sử dụng tập lệnh này để tạo một đối tượng kiểu của tất cả các kiểu vv được kế thừa.

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

với điều sau đây, cảnh báo đầu tiên sẽ hoạt động tốt, nhưng cảnh báo thứ hai thì không .. nó diễn giải -như một dấu trừ mà tôi cho là .. trình gỡ lỗi cho biết 'lỗi tham chiếu chưa được suy nghĩ'. Tôi không thể đặt dấu ngoặc kép xung quanh nó, vì nó không phải là một chuỗi. Vậy làm cách nào để sử dụng thuộc tính đối tượng này?


Damon, giải quyết sự không rõ ràng & nhầm lẫn (cũng được phản ánh bởi các câu trả lời khác nhau và các phiếu giảm giá được thêm / xóa tùy thuộc vào cách diễn giải ...): bạn có muốn nói cụ thể là thuộc tính CSS, như được gợi ý trong ví dụ của bạn và được giả định bởi hầu hết các câu trả lời hoặc bất kỳ thuộc tính JS nào không , nói chung, như được chỉ ra bởi tiêu đề và thiếu CSSthẻ? [Vâng, tôi biết đã 7 năm. :)]
Sz.

@Sz. Ý tôi là any js propertyvì tôi đang gặp vấn đề với việc tham chiếu một thuộc tính có dấu gạch ngang trong đó (cũng xảy ra là thuộc tính css ... tôi không nhận ra rằng có một vấn đề khác với những gì tôi đang cố gắng thực hiện). Vì vậy, thật kỳ lạ khi kết thúc 2 vấn đề khác nhau. nhưng tôi muốn nói câu trả lời hàng đầu giải thích cả hai vấn đề.
Damon

Câu trả lời:


154

BIÊN TẬP

Nhìn vào các nhận xét, bạn sẽ thấy rằng đối với các thuộc tính css, ký hiệu khóa không tương thích với một số thuộc tính. Do đó, sử dụng ký hiệu khóa vỏ lạc đà là cách hiện tại

obj.style-attr // would become 

obj["styleAttr"]

Sử dụng ký hiệu phím thay vì dấu chấm

style["text-align"]

Tất cả các mảng trong js là các đối tượng và tất cả các đối tượng chỉ là các mảng kết hợp, điều này có nghĩa là bạn có thể tham chiếu đến một vị trí trong một đối tượng giống như bạn sẽ tham chiếu đến một khóa trong một mảng.

arr[0]

hoặc đối tượng

obj["method"] == obj.method

một số điều cần nhớ khi truy cập các thuộc tính theo cách này

  1. chúng được đánh giá vì vậy hãy sử dụng chuỗi trừ khi bạn đang làm gì đó với bộ đếm hoặc sử dụng tên phương thức động.

    điều này có nghĩa là obj [method] sẽ cung cấp cho bạn một lỗi không xác định trong khi obj ["method"] thì không

  2. Bạn phải sử dụng ký hiệu này nếu bạn đang sử dụng các ký tự không được phép trong biến js.

Regex này tổng hợp khá nhiều

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

1
ký hiệu quan trọng không áp dụng ở đây - định nghĩa css phong cách sử dụng trường hợp lạc đà trong các phím: jsfiddle.net/49vkD
Brian

trình duyệt nào? Lỗi cho tôi về dấu gạch nối trong IE7, IE8, FFX 3.5. Và, bằng không tôi có nghĩa là hiển thị "không xác định" cho cả những ...
Brian

@brian đã thử nghiệm trong safari và chrome hiển thị màu đỏ, đỏ, trung tâm, trung tâm. Tôi sẽ cố gắng trong ff nay
austinbv

thú vị @ Brian, không làm việc trong firefox6, tôi đã không biết rằng ... tìm hiểu những điều mới mẻ mỗi ngày
austinbv

1
Đã xóa bỏ phiếu phản đối của tôi khi một người trả lời khác chỉ ra rằng bộ sưu tập CSS đã tình cờ trở thành chủ đề của câu hỏi hte, nhưng câu hỏi thực tế là làm thế nào để có được thuộc tính có dấu gạch nối.
Brian

18

Thuộc tính CSS với a -được biểu diễn trong camelCase trong các đối tượng Javascript. Đó sẽ là:

alert( style.textAlign );

Bạn cũng có thể sử dụng ký hiệu ngoặc để sử dụng chuỗi:

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

Tên thuộc tính chỉ được chứa các ký tự, số, $dấu hiệu nổi tiếng và dấu _(nhờ pimvdb).


thứ sau hoạt động .. một trong những thứ tổng hợp mà tôi vừa bỏ lỡ. tập lệnh mà tôi đã tham chiếu sử dụng các tên kiểu css thông thường, nhưng vẫn hữu ích để biết về!
Damon

tên thuộc tính không thể bắt đầu bằng số
austinbv

Tên thuộc tính có thể chứa một lượng lớn các ký tự Unicode. Nó ổn với thông số kỹ thuật và nó ổn với các trình duyệt. Ví dụ:var ò_ó = 'angry';
Camilo Martin

Không sử dụng mã thứ hai. Thuộc tính CSS có vỏ bọc bằng lạc đà. Mã của bạn có thể hoạt động trên một số trình duyệt nhưng không chuẩn.
Oriol,

17

Câu trả lời cho câu hỏi ban đầu là: đặt tên thuộc tính trong dấu ngoặc kép và sử dụng lập chỉ mục kiểu mảng:

obj['property-with-hyphens'];

Một số đã chỉ ra rằng thuộc tính mà bạn quan tâm là thuộc tính CSS. Các thuộc tính CSS có dấu gạch nối sẽ tự động được chuyển đổi thành cách viết hoa camel. Trong trường hợp đó, bạn có thể sử dụng tên có vỏ lạc đà như:

style.textAlign;

Tuy nhiên giải pháp này chỉ hoạt động cho các thuộc tính CSS. Ví dụ,

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

2
@Brian Bạn đã đúng với thuộc tính CSS. Tuy nhiên, tôi đang trả lời câu hỏi chung ban đầu "Làm cách nào để tham chiếu thuộc tính đối tượng javascript có dấu gạch ngang trong đó?" Đây là phiên bản cập nhật jsfiddle của bạn: jsfiddle.net/49vkD/1
Stoney

1
thực sự thì tôi đã tự mình thu hẹp phạm vi của các câu trả lời ở đây - tôi cho rằng OP có nghĩa là các đối tượng kiểu dáng cụ thể. Đã loại bỏ phiếu phản đối của tôi vì câu hỏi kết thúc mở hơn một chút.
Brian

Tôi nghĩ rằng bạn là chính xác. Đó có lẽ là những gì Damon muốn. Tôi đọc nó quá theo nghĩa đen.
Stoney

Bạn phải sử dụng tên có vỏ lạc đà. Không thể .
Oriol,

9

Sử dụng dấu ngoặc:

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

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

Thông tin thêm về các đối tượng: MDN

LƯU Ý: Nếu bạn đang truy cập đối tượng kiểu , CSSStyleDec Tuyên bố , sử dụng must camelCase để truy cập nó từ javascript. Thông tin thêm tại đây


1
Bạn đang không xoa dịu tôi - bạn đang xoa dịu tiêu chuẩn w3c, theo nhiều người trả lời khác cho câu hỏi này: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , nhưng vẫn được ủng hộ như nhau. ..
Brian

Không sử dụng mã này. Không phải là các thuộc tính CSS có vỏ lạc đà có nhiều trình duyệt hơn, mà là việc sử dụng dấu gạch nối thay vì trường hợp lạc đà là không chuẩn và không hoạt động.
Oriol,

4
alert(style.textAlign)

hoặc là

alert(style["textAlign"]);

4

Để trả lời trực tiếp câu hỏi: style['text-align']là cách bạn tham chiếu một thuộc tính có dấu gạch ngang trong đó. Nhưng style.textAlign(hoặc style['textAlign']) là những gì nên được sử dụng trong trường hợp này.


Không sử dụng cái này. Thuộc tính CSS có vỏ bọc bằng lạc đà. Mã của bạn có thể hoạt động trên một số trình duyệt nhưng không chuẩn.
Oriol,

Được điều chỉnh để sử dụng vỏ lạc đà.
Dawson Toth


3

Để giải quyết vấn đề của bạn : Các thuộc tính CSS có dấu gạch nối trong đó được đại diện bởi các thuộc tính JavaScript trong camelCase để tránh vấn đề này. Bạn muốn: style.textAlign.

Để trả lời câu hỏi : Sử dụng ký hiệu dấu ngoặc vuông : obj.propgiống như cách obj["prop"]bạn có thể truy cập vào tên thuộc tính bằng cách sử dụng chuỗi và sử dụng các ký tự bị cấm trong số nhận dạng.



2

Tôi nghĩ rằng trong trường hợp của phong cách CSS họ nhận được thay đổi để camelCase trong Javascript để test-aligntrở thành textAlign. Trong trường hợp chung khi bạn muốn truy cập thuộc tính có chứa các ký tự không chuẩn, bạn sử dụng kiểu mảng. ['text-align']


0

Lúc đầu, tôi tự hỏi tại sao giải pháp không hoạt động với tôi

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

... sau đó tìm ra rằng việc truy cập các thuộc tính dữ liệu là khác nhau: Nó sẽ như thế này:

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

Hi vọng điêu nay co ich!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.