diff --git a/src/selectize.js b/src/selectize.js index 194bc48e1..37f3d6f86 100644 --- a/src/selectize.js +++ b/src/selectize.js @@ -1212,7 +1212,7 @@ $.extend(Selectize.prototype, { */ getOption: function(value) { value = hash_key(value); - return value ? this.$dropdown_content.find('[data-selectable]').filter('[data-value="' + value.replace(/(['"])/g, '\\$1') + '"]:first') : $(); + return value ? this.$dropdown_content.find('[data-selectable]').filter('[data-value="' + escape_quotes(value) + '"]:first') : $(); }, /** @@ -1238,15 +1238,7 @@ $.extend(Selectize.prototype, { * @returns {object} */ getItem: function(value) { - var i = this.items.indexOf(value); - if (i !== -1) { - if (i >= this.caretPos) i++; - var $el = $(this.$control[0].childNodes[i]); - if ($el.attr('data-value') === value) { - return $el; - } - } - return $(); + return this.$control.children('[data-value="' + escape_quotes(hash_key(value)) + '"]'); }, /** diff --git a/src/utils.js b/src/utils.js index 162c0bc8d..449146f77 100644 --- a/src/utils.js +++ b/src/utils.js @@ -54,6 +54,17 @@ var escape_regex = function(str) { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); }; +/** + * Escapes quotation marks with backslashes. Useful + * for escaping values for use in CSS attribute selectors. + * + * @param {string} str + * @return {string} + */ +var escape_quotes = function(str) { + return str.replace(/(['"])/g, '\\$1'); +}; + var hook = {}; /** diff --git a/tests/api.js b/tests/api.js index f5ab21a51..bb3ec19ab 100644 --- a/tests/api.js +++ b/tests/api.js @@ -139,6 +139,7 @@ {value: 'null'}, {value: 'a'}, {value: 'b'}, + {value: 'c'}, {value: '\''}, {value: '"'}, {value: '\\\''}, @@ -175,11 +176,15 @@ test.selectize.addItem(0); expect(test.selectize.items.indexOf('0')).to.not.be.equal(-1); }); + it('should update DOM', function() { + test.selectize.addItem('c'); + expect(test.selectize.$control.find('[data-value=c]').length).to.be.equal(1); + }); }); describe('updateOption()', function() { before(function() { - test = setup_test('', { valueField: 'value', labelField: 'value', options: [ @@ -190,6 +195,7 @@ {value: 'c'}, {value: 'd'}, {value: 'e'}, + {value: 'f'}, {value: 'null'}, {value: 'undefined'}, {value: '\''}, @@ -197,7 +203,7 @@ {value: '\\\''}, {value: '\\"'}, ], - items: ['e'] + items: ['e','f'] }); }); after(function() { @@ -235,6 +241,11 @@ expect(test.selectize.options['undefined']).to.not.have.property('test'); expect(test.selectize.options['null']).to.not.have.property('test'); }); + it('should update DOM', function() { + test.selectize.updateOption('f', {value: 'f_updated'}); + expect(test.selectize.$control.find('[data-value=f]').length).to.be.equal(0); + expect(test.selectize.$control.find('[data-value=f_updated]').length).to.be.equal(1); + }); }); describe('getOption()', function() { @@ -289,6 +300,96 @@ expect(test.selectize.getOption(undefined).length).to.be.equal(0); }); }); + + describe('getItem()', function() { + before(function() { + test = setup_test('', { + valueField: 'value', + labelField: 'value', + options: [ + {value: 0}, + {value: 1}, + {value: 2}, + {value: 3}, + ], + items: ['1','2','3'] + }); + }); + after(function() { + test.teardown(); + }); + it('should empty "items" array', function() { + test.selectize.clear(); + expect(test.selectize.items.length).to.be.equal(0); + }); + it('should update DOM', function() { + test.selectize.clear(); + expect(test.selectize.$control.find('[data-value=1]').length).to.be.equal(0); + expect(test.selectize.$control.find('[data-value=2]').length).to.be.equal(0); + expect(test.selectize.$control.find('[data-value=3]').length).to.be.equal(0); + }); + it('should not give control focus', function(done) { + test.selectize.clear(); + window.setTimeout(function() { + expect(test.selectize.isFocused).to.be.equal(false); + done(); + }, 0); + }); + }); + }); })(); \ No newline at end of file