Đặt thuộc tính tùy chỉnh bằng JavaScript


119

Tôi đang sử dụng The DynaTree (https://code.google.com/p/dynatree) nhưng tôi đang gặp một số vấn đề và hy vọng ai đó có thể giúp ..

Tôi đang hiển thị cây trên trang như dưới đây:

<div id="tree">
        <ul>
            <li class="folder">Outputs
                <ul>
                    <li id="item1" data="icon: 'base.gif', url: 'page1.htm', target: 'AccessPage'">Item 1 Title
                    <li id="item2" data="icon: 'base.gif', url: 'page2.htm', target: 'AccessPage'">Item 2 Title
                    <li id="item3" data="icon: 'base.gif', url: 'page3.htm', target: 'AccessPage'">Item 3 Title
                    <li id="item4" data="icon: 'base.gif', url: 'page4.htm', target: 'AccessPage'">Item 4 Title
                </ul>
        </ul>
    </div>

Tuy nhiên, tôi đang cố gắng thay đổi biểu tượng trên một mục bất kể nó được chọn hay không chỉ sử dụng JavaScript .

biểu tượng mới tôi muốn sử dụng là base2.gif

Tôi đã thử sử dụng cách sau nhưng dường như không hoạt động:

document.getElementById('item1').data = "icon: 'base2.gif', url: 'output.htm', target: 'AccessPage', output: '1'";

bất cứ ai biết những gì tôi có thể đang làm sai?


3
từ khóa datalà một tiền tố. Bạn nên sử dụngdata-you-attribute-name
MilkyWayJoe

6
@Aaron Bạn nên chọn một câu trả lời tốt nhất.
0x499602D2

Câu trả lời:


202

Sử dụng setAttributephương pháp:

document.getElementById('item1').setAttribute('data', "icon: 'base2.gif', url: 'output.htm', target: 'AccessPage', output: '1'");

Nhưng bạn thực sự nên sử dụng dữ liệu theo sau bằng dấu gạch ngang và với thuộc tính của nó, như:

<li ... data-icon="base.gif" ...>

Và để làm điều đó trong JS, hãy sử dụng thuộc datasettính:

document.getElementById('item1').dataset.icon = "base.gif";

9
Thuộc tính tập dữ liệu có thể hữu ích nếu chỉ xem xét các trình duyệt tuân thủ HTML5, nhưng đó là danh sách ngắn và cần hỗ trợ rộng hơn cho web chung. Tôi muốn sử dụng setAttribute ngay bây giờ.
RobG

vẫn không thể làm cho nó hoạt động bằng cách sử dụng document.getElementById ('item1'). setAttribute ('data', "icon: 'base2.gif', url: 'output.htm', target: 'AccessPage', output: '1' ");
Aaron

2
Chính xác thì điều gì bạn đang làm trong mã của mình khiến bạn nhận ra rằng nó không hoạt động?
0x499602D2

Tôi đã thêm mã và thêm cảnh báo ở cuối (vì vậy nó sẽ khởi động khi mã hoàn tất) và tôi cũng có thể thấy biểu tượng không thay đổi. (khi tôi loại bỏ mã là nhìn thấy màn alart của tôi, vì vậy tôi biết có somthing sai với mã Tôi chỉ nói thêm.)
Aaron

IE <= 8 không hỗ trợ setAttribute
RTF

56

Vui lòng sử dụng tập dữ liệu

var article = document.querySelector('#electriccars'),
    data = article.dataset;

// data.columns -> "3"
// data.indexnumber -> "12314"
// data.parent -> "cars"

vì vậy trong trường hợp của bạn để thiết lập dữ liệu:

getElementById('item1').dataset.icon = "base2.gif";

1
Ngoài ra (khi thích hợp), hãy sử dụng camelCase để tham chiếu đến các tên được gạch nối (chuỗi trong ngoặc không thành công).
2540625

6
jsperf.com/html5-dataset-vs-native-setattribute Điều này cho thấy phương pháp là rất nhiều chậm
racemic

4

Đối với những người đến từ Google, câu hỏi này không phải về các thuộc tính dữ liệu - OP đã thêm một thuộc tính không chuẩn vào đối tượng HTML của họ và tự hỏi làm thế nào để đặt nó.

Tuy nhiên, bạn không nên thêm thuộc tính tuỳ chỉnh để tài sản của bạn - bạn nên sử dụng các thuộc tính dữ liệu - ví dụ như OP nên đã sử dụng data-icon, data-url, data-targetvv

Trong mọi trường hợp, hóa ra cách bạn đặt các thuộc tính này qua JavaScript là giống nhau cho cả hai trường hợp. Sử dụng:

ele.setAttribute(attributeName, value);

để thay đổi thuộc tính đã attributeNamecho valuecho phần tử DOM ele.

Ví dụ:

document.getElementById("someElement").setAttribute("data-id", 2);

Lưu ý rằng bạn cũng có thể sử dụng .datasetđể đặt giá trị của thuộc tính dữ liệu, nhưng như @racemic chỉ ra, tốc độ này chậm hơn 62% (ít nhất là trong Chrome trên macOS tại thời điểm viết bài). Vì vậy, tôi khuyên bạn nên sử dụng setAttributephương pháp này để thay thế.

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.