这个JavaScript可以优化吗?
这个JS将在有很多字段的页面上执行。你能看到如何提高这段代码的速度吗?如果是,你能解释一下你发现了什么吗这个JavaScript可以优化吗?,javascript,jquery,performance,refactoring,Javascript,Jquery,Performance,Refactoring,这个JS将在有很多字段的页面上执行。你能看到如何提高这段代码的速度吗?如果是,你能解释一下你发现了什么吗 var _TextInputs = null; function GetTextInputs() { if (_TextInputs == null) { _TextInputs = jq('input[type=text]'); } return _TextInputs; } var _Spans = null; function Get
var _TextInputs = null;
function GetTextInputs()
{
if (_TextInputs == null)
{
_TextInputs = jq('input[type=text]');
}
return _TextInputs;
}
var _Spans = null;
function GetSpans()
{
if (_Spans == null)
{
_Spans = jq('span');
}
return _Spans;
}
function UpdateRate(ratefield, name)
{
GetTextInputs().filter('[' + name + ']').each(function()
{
this.value = FormatCurrencyAsString(FormatCurrencyAsFloat(ratefield.value));
CalculateCharge(name.replace('Rate', ''), jq(this).attr(name));
});
}
function CalculateCharge(name, activity_id)
{
var inputs = GetTextInputs();
var bill_field = inputs.filter('[' + name + 'Bill=' + activity_id + ']');
var rate_field = inputs.filter('[' + name + 'Rate=' + activity_id + ']');
var charge_field = GetSpans().filter('[' + name + 'Charge=' + activity_id + ']');
charge_field.text(FormatCurrencyAsString(FormatCurrencyAsFloat(bill_field.val()) * FormatCurrencyAsFloat(rate_field.val())));
}
我可以看到,您到处都在使用属性过滤器,例如:
_TextInputs = jq('input[type=text]');
inputs.filter('[' + name + 'Bill=' + activity_id + ']');
属性过滤器很有用,但与更直接的类或ID选择器相比,并不特别“快”。我看不到任何标记,因此我只能建议您使用更多ID和类,例如:
jq('input.textInput');
而不是:
jq('input[type=text]');
你可以:
- 将每个
替换为
而
- 将
替换为val()
(只要这些字段是纯文本字段就可以了).value
- 按类而不是按名称/类型访问元素
- 将
替换为普通属性访问;e、 g.:attr()
-->this.attr(name)
this.name
如果元素是静态的(即在应用程序生命周期内未修改),则不要在每次函数调用中查询元素。相反,将它们存储在循环之外。有点离题,但我使用并推荐。这本书包含了Scriptaculous的创建者提出的大量令人敬畏的JS优化建议。此外,还附带了一个名为DOM Monster的工具,该工具有助于跟踪性能瓶颈——这是对Firebug的一个极好的赞扬,因为它实际上是在DOM中跟踪基于启发式和DOM复杂性的低效率情况。Firebug有一个很棒的javascript分析器。这将告诉你实际花在哪里的时间。Firefox执行的非常快。问题在于IE.IE 8还内置了一个很棒的JavaScript分析器。按F12。@harpo:如果你吐出答案,我会给你的。你的评论比你想象的要有用得多。在Firebug探查器和一些(回想起来)明显的临时变量之间,我成功地将这段代码设置为“snappier”。谢谢