我刚刚使用flot和jquery完成了我的脚本。现在我的问题是,它在Opera和Firefox中很快,但它在Internet Explorer中非常缓慢(毫不奇怪),所以这就是为什么我想知道是否有办法让我的脚本更有效率(换句话说也许删除一些“for loops”等)?因此,如果有任何代码专家有空闲时间杀人,请帮助我,因为我自己编写高效代码非常糟糕:P
非常感谢提前=)
可以找到 on this address
答案 0 :(得分:2)
还有一些提示:
有人指出:
... $(this).attr('id');
... $(this).attr('name');
很贵,你根本不需要$,只需使用:
... this.id;
... this.name;
此外,使用.css(...)
是一个巨大的浪费,使用类并将CSS放在样式元素中。
您可以将$('#x')
等引用存储在闭包中。同样,您不需要$,使用 document.getElementByid 直接获取元素的引用效率要高得多,而不是:
$('#x').text(pos.x.toFixed(2));
你可以:
x.innerHTML = pos.x.toFixed(2);
使用单个属性访问替换多个函数调用。基本的想法是尽可能多地删除jQuery,保留对事物的引用而不是经常获取它们并使用直接属性访问,而不是函数。
顺便说一句,当我尝试从jsFiddle javascript区域复制时,Safari会冻结。我不是那个网站的忠实粉丝。
答案 1 :(得分:1)
for(k; k<datasets.length; k++){
每次循环执行时,你都在调用length属性,如果只将它存储在循环开头的变量中,那就更好了,如下所示:
for(var k, len = datasets.length; k < len; k++){
此外,你在浪费资源:
key = $(this).attr("id");
subsystem = $(this).attr("name");
将stich $(this)放入变量中,每次使用$()时都会创建传递元素的克隆。就这样做:
var $this = $(this);
并使用$ this而不是$(this),只有当它成为另一个对象时才重用$(this)。
答案 2 :(得分:1)
首先,使用jQuery选择器,如果使用类名,如果可以使其更具体,则效率更高。例如,而不是
var checkboxContainerFailed = $(".failedCheckboxes");
试
var checkboxContainerFailed = $("#graph-table-bottom td.failedCheckboxes");
其次,使用[]表示法而不是var subsystemNames = new Array();
第三,这里的数据数组中有一个尾随逗号。这可能会导致IE问题:
"test2-a4/",
]
最后,尝试通过JSLint运行整个事情来解决任何错误。