Преглед на файлове

changes on updateResults, populate by @cervengoc on #781

use string concatenation instead of DOM manipulation at populate. This
does gives about a 45% speed boost as measured with chrome v35. Code by
@cervengoc on #781
ycdtosa преди 11 години
родител
ревизия
12e0de21ae
променени са 1 файла, в които са добавени 33 реда и са изтрити 25 реда
  1. 33 25
      select2.js

+ 33 - 25
select2.js

@@ -919,39 +919,46 @@ the specific language governing permissions and limitations under the Apache Lic
 
                     populate=function(results, container, depth) {
 
-                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
+                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted, formattedClass;
 
                         results = opts.sortResults(results, container, query);
 
+                        // collect the created nodes for bulk append
+                        var nodes = [];
                         for (i = 0, l = results.length; i < l; i = i + 1) {
 
                             result=results[i];
-
                             disabled = (result.disabled === true);
                             selectable = (!disabled) && (id(result) !== undefined);
-
                             compound=result.children && result.children.length > 0;
 
-                            node=$("<li></li>");
-                            node.addClass("select2-results-dept-"+depth);
-                            node.addClass("select2-result");
-                            node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
-                            if (disabled) { node.addClass("select2-disabled"); }
-                            if (compound) { node.addClass("select2-result-with-children"); }
-                            node.addClass(self.opts.formatResultCssClass(result));
-                            node.attr("role", "presentation");
-
-                            label=$(document.createElement("div"));
-                            label.addClass("select2-result-label");
-                            label.attr("id", "select2-result-label-" + nextUid());
-                            label.attr("role", "option");
-
-                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
-                            if (formatted!==undefined) {
-                                label.html(formatted);
-                                node.append(label);
-                            }
-
+                            node ="<li class=\"";
+                            node += "select2-results-dept-" + depth;
+                            node += " select2-result";
+                            node+= selectable ? " select2-result-selectable" : " select2-result-unselectable";
+                            if (disabled)
+                                node += " select2-disabled";
+                            if (compound)
+                                node += " select2-result-with-children";
+                            formattedClass = self.opts.formatResultCssClass(result);
+                            if (formattedClass != undefined)
+                                node += " " + formattedClass;
+                            node += "\" role=\"presentation\">";
+
+                            label = "<div class=\"select2-result-label\"";
+                            label += " id=\"select2-result-label-" + nextUid() + "\"";
+                            label += " role=\"option\"";
+                            label += ">";
+                            formatted = opts.formatResult(result, label, query, self.opts.escapeMarkup);
+                            if (formatted !== undefined)
+                                label += formatted;
+                            label += "</div>";
+
+                            node += label;
+                            node += "</li>";
+
+                            // I still used jQuery wrapping for setting "data" below
+                            node = $(node);
 
                             if (compound) {
 
@@ -962,9 +969,10 @@ the specific language governing permissions and limitations under the Apache Lic
                             }
 
                             node.data("select2-data", result);
-                            container.append(node);
+                            nodes.push(node[0]);
                         }
-
+                        // bulk append the created nodes
+                        container.append(nodes);
                         liveRegion.text(opts.formatMatches(results.length));
                     };