|
49 | 49 | this.create(); |
50 | 50 | } |
51 | 51 |
|
| 52 | + // Helper to safely convert any value to string |
| 53 | + function encodeHtml(str) { |
| 54 | + return String(str == null ? '' : str); |
| 55 | + } |
| 56 | + |
| 57 | + // Escape for safe use inside HTML attribute or inner HTML |
| 58 | + function escapeAttr(str) { |
| 59 | + return $('<div>').text(encodeHtml(str)).html(); |
| 60 | + } |
| 61 | + |
| 62 | + function escapeHtmlText(str) { |
| 63 | + return $('<div>').text(encodeHtml(str)).html(); |
| 64 | + } |
52 | 65 |
|
53 | 66 | /** |
54 | 67 | * Prototype class |
|
105 | 118 | var $el = $(el); |
106 | 119 |
|
107 | 120 | if ('optgroup' == $el.prop('nodeName').toLowerCase()) { |
108 | | - choices += '<div class="fs-optgroup-label" data-group="' + $this.optgroup + '">' + $el.prop('label') + '</div>'; |
| 121 | + choices += '<div class="fs-optgroup-label" data-group="' + $this.optgroup + '">' + escapeHtmlText($el.prop('label')) + '</div>'; |
109 | 122 | choices += $this.buildOptions($el); |
110 | 123 | $this.optgroup++; |
111 | 124 | } |
|
119 | 132 | var disabled = $el.is(':disabled') ? ' disabled' : ''; |
120 | 133 | var selected = -1 < $.inArray(val, $this.selected) ? ' selected' : ''; |
121 | 134 | var group = ' g' + $this.optgroup; |
122 | | - var row = '<div class="fs-option' + selected + disabled + group + classes + '" data-value="' + val + '" data-index="' + $this.idx + '"><span class="fs-checkbox"><i></i></span><div class="fs-option-label">' + $el.html() + '</div></div>'; |
| 135 | + var safeVal = escapeAttr(val); |
| 136 | + var labelText = escapeHtmlText($el.text()); |
| 137 | + var row = '<div class="fs-option' + selected + disabled + group + classes + '" data-value="' + safeVal + '" data-index="' + $this.idx + '"><span class="fs-checkbox"><i></i></span><div class="fs-option-label">' + labelText + '</div></div>'; |
123 | 138 |
|
124 | 139 | if ('function' === typeof $this.settings.optionFormatter) { |
125 | 140 | row = $this.settings.optionFormatter(row); |
|
139 | 154 | var labelText = []; |
140 | 155 |
|
141 | 156 | this.$wrap.find('.fs-option.selected').each(function(i, el) { |
142 | | - labelText.push($(el).find('.fs-option-label').html()); |
| 157 | + labelText.push($(el).find('.fs-option-label').text()); |
143 | 158 | }); |
144 | 159 |
|
145 | 160 | if (labelText.length < 1) { |
|
152 | 167 | labelText = labelText.join(', '); |
153 | 168 | } |
154 | 169 |
|
155 | | - this.$wrap.find('.fs-label').html(labelText); |
| 170 | + this.$wrap.find('.fs-label').text(labelText); |
156 | 171 | this.$wrap.toggleClass('fs-default', labelText === settings.placeholder); |
157 | 172 | } |
158 | 173 | } |
|
0 commit comments