I am using selectize.js for my project. But I have problems with data-attributes. I want to add data-attributes to the select options. I have default select like this:
<option data-open-balance="false" selected="selected" value="1">PNP.SI.080416</option>
But When I add selectize to this select, it becomes:
<div data-value="1" data-selectable="" class="selected">PNP.SI.080416</div>
I see that its "item object" only get value, and text. So, how can I add other data-attributes to its item object?
HTML <option> data-* AttributeA data-* attribute on an <option> tag attaches additional data to the option item. To create a custom attribute, replace * with a lowercase string, such as data-id , data-status , or data-location .
In order to create a new data attribute in JavaScript we just need to add a new property to the dataset object with a value. This will update the dataset object and our HTML which means our HTML will look like this.
Basically, . data() is for setting or checking the jQuery object's data value. If you are checking it and it doesn't already have one, it creates the value based on the data attribute that is in the DOM. . attr() is for setting or checking the DOM element's attribute value and will not touch the jQuery data value.
Adding a data attribute is easy. Any HTML element can have any number of data attributes added to its opening tag. We simply type data- followed by the name of our attribute into the element's opening tag alongside any other attributes we're already using.
I've looked at docs and they say that if you want to add custom attributes to your elements, you should use dataAttr
option, by default it data-data
. So in your case code will look somethnig like this:
HTML
<select>
<option data-data='{"openBalance": true}' selected="selected" value="1">PNP.SI.080416</option>
</select>
Here we provide custom render method to draw options
with attributes we need:
$('select').selectize({
render: {
option: function (data, escape) {
return "<div data-open-balance='" + data.openBalance + "'>" + data.text + "</div>"
}
}
})
UDATE
As Kyborek notes that in order to secure your site or web app from XSS, you should use escape
method in render callback. Also use it if you want to display html
tags in data.text
. Updated example will look something like this:
$('select').selectize({
render: {
option: function (data, escape) {
return "<div data-open-balance='" + escape(data.openBalance) + "'>" + escape(data.text) + "</div>"
}
}
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With