2013-02-16 100 views
0

我想在我的沉重的JavaScript UI应用程序中做出一些严重的延迟削减。 我已经读了如何优化代码,并从我学到了一些东西,我的理解是:

  1. $(元素)。每个()使事情变得更慢
  2. 变量(和HTML对象)应该被缓存

这是一个函数内我现有的代码的一部分运行经常在我的应用程序:

if($('.textbox').length > 0) 
{ $(".textbox").each(function(){ 
      var parts = $(this).attr('id').split('_'); 
      // do some linear-time operations here with $this 
      }); 
    }); 

到目前为止,我知道我应该把$this = $(this).each()的开头,并且只使用$(this)。但我还能做什么?有没有更快的替代方法来使用.each()?我确实需要检查出每个div.textbox类。

回答

1

但我还能做什么呢?

几件事情:

  1. 是绝对没有指向您的if声明(除非它有您还没有表现出一个else条款),因为一个空的jQuery对象上调用.each是一个没有-OP。去掉它。

  2. 如果您不想删除它,至少要缓存DOM查找的结果,因为每次调用$('.textbox')时,jQuery必须关闭并查询DOM。

  3. id是DOM元素实例的反射特性,所以$(this).attr("id").split('_')涉及多个函数调用和存储器分配可以通过使用this.id.split('_')避免。

所以这给了我们:

$('.textbox').each(function() { 
    var parts = this.id.split('_'); 
    // Do something with `parts` 
}); 

,或者出现您还没有表现出一个else:如果我使用纯JavaScript

var boxes = $('.textbox'); 
if (boxes.length) { 
    boxes.each(function() { 
     var part s= this.id.split('_'); 
     // ... 
    }); 
} 
else { 
    // ... 
} 
+0

谢谢!我对你直接使用'this'的方式有些困惑。比使用'$ this'更有效吗?我们可以直接使用'this',即使是像'$ this.css('left')'这样的东西吗? – user961627 2013-02-16 12:54:17

+1

@ user961627:在'each'(和内jQuery的事件处理程序),'this'指原始DOM元素,这意味着可以使用任何属性或DOM元素具有的方法(参见[各种DOM规格](HTTP:/ /www.w3.org/DOM/DOMTR))。当你执行'$(this)'时,你调用了jQuery并传入了DOM元素,并且找回了一个jQuery包装器。这个包装器提供了像'css'这样的jQuery函数。 – 2013-02-16 13:04:34

+0

谢谢 - 我一直对这个包装部分感到困惑 - 你把这些话写得很清楚。 – user961627 2013-02-16 13:09:02

1

你正在使用jQuery,它在后面执行了很多代码。最快的方式是原生Javascript。

真正的小优化是从this得到id。您也可以使用这个(纯JS)的jQuery将执行很多功能):

var parts = this.id.split('_'); 

因此,例如
让所有的元素尽可能快。您可以使用此函数来获取类名的元素:

if (document.getElementsByClassName == undefined) { 
    document.getElementsByClassName = function(className) 
    { 
     var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)"); 
     var allElements = document.getElementsByTagName("*"); 
     var results = []; 

     var element; 
     for (var i = 0; (element = allElements[i]) != null; i++) { 
      var elementClass = element.className; 
      if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass)) 
       results.push(element); 
     } 

     return results; 
    } 
} 

和代码循环:

var elements = getElementsByClassName(".textbox"); 
for(var i=0;i<elements.length;i++) 
{ 
    var splitid = elements[i].id.split("_"); 
} 
+0

,我还需要到使用'getElementsByClassName(“。textbox”);',或者我们会在类名之前摆脱点'.'?另外,只是想知道 - 不是大多数浏览器已经定义了“document.getElementsByClassName”吗? – user961627 2013-02-16 13:04:21

+0

@ user961627:你会摆脱斑点的(但你也不得不并不是所有的浏览器都有'getElementsByClassName'的问题,虽然所有现代的做)。但是,这是一个**巨大的**过度泛化,认为使用“纯JavaScript”比使用库“更快”。在绝大多数情况下,如果您正确使用库,则没有可衡量的差异(例如,通过不连续两次查询相同信息的DOM,这会比仅仅执行一次更慢你是如何做到的)。 – 2013-02-16 13:07:34

+0

谢谢@TJJCrowder,这是我的意思,jQuery真的很好做事容易。但是,如果你想要表现,你可能不希望所有的图书馆开销。 – Niels 2013-02-16 13:26:34