From e3deb3ae03837a806a62a294a79d8a3736fdb7f9 Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Fri, 7 Nov 2014 19:30:45 -0500 Subject: [PATCH] Remove jQuery from building the options This fixes many of the speed issues the results had when working with large data sets. jQuery has been completely dropped, with the exception of setting the data, which does not require a jQuery object but instead works directly with the DOM. This does not include options with children, which still uses jQuery to deal with the nested objects. This only works with IE 8+, which is fine. --- dist/js/select2.amd.full.js | 30 ++++++++++++++++++++++-------- dist/js/select2.amd.js | 30 ++++++++++++++++++++++-------- dist/js/select2.full.js | 30 ++++++++++++++++++++++-------- dist/js/select2.full.min.js | 4 ++-- dist/js/select2.js | 30 ++++++++++++++++++++++-------- dist/js/select2.min.js | 2 +- src/js/select2/data/select.js | 14 +++++++++++--- src/js/select2/results.js | 16 +++++++++++----- 8 files changed, 113 insertions(+), 43 deletions(-) diff --git a/dist/js/select2.amd.full.js b/dist/js/select2.amd.full.js index 3629965d..e332a6d0 100644 --- a/dist/js/select2.amd.full.js +++ b/dist/js/select2.amd.full.js @@ -237,7 +237,8 @@ define('select2/results',[ $options.each(function () { var $option = $(this); - var item = $option.data('data'); + + var item = $.data(this, 'data'); if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) { $option.attr('aria-selected', 'true'); @@ -288,10 +289,15 @@ define('select2/results',[ delete attrs['aria-selected']; } - var $option = $(option); - $option.attr(attrs); + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } if (data.children) { + var $option = $(option); + var label = document.createElement('strong'); label.className = 'group-label'; @@ -318,9 +324,9 @@ define('select2/results',[ this.template(data, option); } - $option.data('data', data); + $.data(option, 'data', data); - return $option; + return option; }; Results.prototype.bind = function (container, $container) { @@ -1113,7 +1119,7 @@ define('select2/data/select',[ var normalizedData = this._normalizeItem(data); // Override the option's data with the combined data - $.data($option, normalizedData); + $.data(option, 'data', normalizedData); return $option; }; @@ -1121,7 +1127,7 @@ define('select2/data/select',[ SelectAdapter.prototype.item = function ($option) { var data = {}; - data = $option.data('data'); + data = $.data($option[0], 'data'); if (data != null) { return data; @@ -1155,7 +1161,7 @@ define('select2/data/select',[ data = this._normalizeItem(data); - $option.data('data', data); + $.data($option[0], 'data', data); return data; }; @@ -1166,6 +1172,14 @@ define('select2/data/select',[ disabled: false }; + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } diff --git a/dist/js/select2.amd.js b/dist/js/select2.amd.js index 18cec560..6299e8a1 100644 --- a/dist/js/select2.amd.js +++ b/dist/js/select2.amd.js @@ -237,7 +237,8 @@ define('select2/results',[ $options.each(function () { var $option = $(this); - var item = $option.data('data'); + + var item = $.data(this, 'data'); if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) { $option.attr('aria-selected', 'true'); @@ -288,10 +289,15 @@ define('select2/results',[ delete attrs['aria-selected']; } - var $option = $(option); - $option.attr(attrs); + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } if (data.children) { + var $option = $(option); + var label = document.createElement('strong'); label.className = 'group-label'; @@ -318,9 +324,9 @@ define('select2/results',[ this.template(data, option); } - $option.data('data', data); + $.data(option, 'data', data); - return $option; + return option; }; Results.prototype.bind = function (container, $container) { @@ -1113,7 +1119,7 @@ define('select2/data/select',[ var normalizedData = this._normalizeItem(data); // Override the option's data with the combined data - $.data($option, normalizedData); + $.data(option, 'data', normalizedData); return $option; }; @@ -1121,7 +1127,7 @@ define('select2/data/select',[ SelectAdapter.prototype.item = function ($option) { var data = {}; - data = $option.data('data'); + data = $.data($option[0], 'data'); if (data != null) { return data; @@ -1155,7 +1161,7 @@ define('select2/data/select',[ data = this._normalizeItem(data); - $option.data('data', data); + $.data($option[0], 'data', data); return data; }; @@ -1166,6 +1172,14 @@ define('select2/data/select',[ disabled: false }; + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } diff --git a/dist/js/select2.full.js b/dist/js/select2.full.js index b86c9a4e..ad058f78 100644 --- a/dist/js/select2.full.js +++ b/dist/js/select2.full.js @@ -9772,7 +9772,8 @@ define('select2/results',[ $options.each(function () { var $option = $(this); - var item = $option.data('data'); + + var item = $.data(this, 'data'); if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) { $option.attr('aria-selected', 'true'); @@ -9823,10 +9824,15 @@ define('select2/results',[ delete attrs['aria-selected']; } - var $option = $(option); - $option.attr(attrs); + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } if (data.children) { + var $option = $(option); + var label = document.createElement('strong'); label.className = 'group-label'; @@ -9853,9 +9859,9 @@ define('select2/results',[ this.template(data, option); } - $option.data('data', data); + $.data(option, 'data', data); - return $option; + return option; }; Results.prototype.bind = function (container, $container) { @@ -10648,7 +10654,7 @@ define('select2/data/select',[ var normalizedData = this._normalizeItem(data); // Override the option's data with the combined data - $.data($option, normalizedData); + $.data(option, 'data', normalizedData); return $option; }; @@ -10656,7 +10662,7 @@ define('select2/data/select',[ SelectAdapter.prototype.item = function ($option) { var data = {}; - data = $option.data('data'); + data = $.data($option[0], 'data'); if (data != null) { return data; @@ -10690,7 +10696,7 @@ define('select2/data/select',[ data = this._normalizeItem(data); - $option.data('data', data); + $.data($option[0], 'data', data); return data; }; @@ -10701,6 +10707,14 @@ define('select2/data/select',[ disabled: false }; + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } diff --git a/dist/js/select2.full.min.js b/dist/js/select2.full.min.js index 03c65d5c..1f10985a 100644 --- a/dist/js/select2.full.min.js +++ b/dist/js/select2.full.min.js @@ -1,4 +1,4 @@ window.$=window.$||{},function(){$&&$.fn&&$.fn.select2&&$.fn.select2.amd&&(c=$.fn.select2.amd.define,b=$.fn.select2.amd.require);var a,b,c;!function(d){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.concat(a),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,b){return function(){return n.apply(d,v.call(arguments,0).concat([a,b]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var b=r[a];delete r[a],t[a]=!0,m.apply(d,b)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,b,c,f){var h,k,l,m,n,s,u=[],v=typeof c;if(f=f||a,"undefined"===v||"function"===v){for(b=!b.length&&c.length?["require","exports","module"]:b,n=0;n0&&b-1 in a}function e(a,b,c){if(bb.isFunction(b))return bb.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return bb.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ib.test(b))return bb.filter(b,a,c);b=bb.filter(b,a)}return bb.grep(a,function(a){return V.call(b,a)>=0!==c})}function f(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function g(a){var b=pb[a]={};return bb.each(a.match(ob)||[],function(a,c){b[c]=!0}),b}function h(){_.removeEventListener("DOMContentLoaded",h,!1),a.removeEventListener("load",h,!1),bb.ready()}function i(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=bb.expando+Math.random()}function j(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(vb,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:ub.test(c)?bb.parseJSON(c):c}catch(e){}tb.set(a,b,c)}else c=void 0;return c}function k(){return!0}function l(){return!1}function m(){try{return _.activeElement}catch(a){}}function n(a,b){return bb.nodeName(a,"table")&&bb.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function o(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function p(a){var b=Lb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function q(a,b){for(var c=0,d=a.length;d>c;c++)sb.set(a[c],"globalEval",!b||sb.get(b[c],"globalEval"))}function r(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(sb.hasData(a)&&(f=sb.access(a),g=sb.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)bb.event.add(b,e,j[e][c])}tb.hasData(a)&&(h=tb.access(a),i=bb.extend({},h),tb.set(b,i))}}function s(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&bb.nodeName(a,b)?bb.merge([a],c):c}function t(a,b){var c=b.nodeName.toLowerCase();"input"===c&&zb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function u(b,c){var d=bb(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:bb.css(d[0],"display");return d.detach(),e}function v(a){var b=_,c=Pb[a];return c||(c=u(a,b),"none"!==c&&c||(Ob=(Ob||bb("