我有这段Javascript代码,在Internet Explorer的每次调用中大约需要600毫秒。其他浏览器所用的时间可以忽略不计。
var _nvs_currentTab;
var _nvs_zoomfield;
var _nvs_centerfield;
var _nvs_globsearch;
var _nvs_category;
var _nvs_favsonly;
var _nvs_wishonly;
var _nvs_friendfavsonly;
var _nvs_newitemsonly;
var _nvs_globsearchOld;
var _nvs_catOld;
var _nvs_favsonlyOld;
var _nvs_wishonlyOld;
var _nvs_friendFavsonlyOld;
var _nvs_newItemsOnlyOld;
function saveState()
{
if (!_nvs_currentTab)
{
var f = document.getElementById;
_nvs_currentTab = f('currentTab');
_nvs_zoomfield = f('zoomfield');
_nvs_centerfield = f('centerfield');
_nvs_globsearch = f("globsearch");
_nvs_category = f("category");
_nvs_favsonly = f("favsonly");
_nvs_wishonly = f("wishonly");
_nvs_friendfavsonly = f("friendfavsonly");
_nvs_newitemsonly = f("newitemsonly");
_nvs_globsearchOld = f("globsearchOld");
_nvs_catOld = f("categoryOld");
_nvs_favsonlyOld = f("favsonlyOld");
_nvs_wishonlyOld = f("wishonlyOld");
_nvs_friendFavsonlyOld = f("friendFavsonlyOld");
_nvs_newItemsOnlyOld = f("newItemsOnlyOld");
}
// get all state vars
var navState= new Object();
navState.page = currentPage;
navState.currentTab = _nvs_currentTab.value;
navState.zoomfield = _nvs_zoomfield.value;
navState.centerfield = _nvs_centerfield.value;
navState.globsearch = _nvs_globsearch.value;
navState.category = _nvs_category.value;
navState.favsonly = _nvs_favsonly.checked;
navState.wishonly = _nvs_wishonly.checked;
navState.friendfavsonly = _nvs_friendfavsonly.checked;
navState.newitemsonly = _nvs_newitemsonly.checked;
navState.globsearchOld = _nvs_globsearchOld.value;
navState.catOld = _nvs_catOld.value;
navState.favsonlyOld = _nvs_favsonlyOld.value;
navState.wishonlyOld = _nvs_wishonlyOld.value;
navState.friendFavsonlyOld = _nvs_friendFavsonlyOld.value;
navState.newItemsOnlyOld = _nvs_newItemsOnlyOld.value;
// build new url with state
var url = new StringBuffer();
url.append("#");
for (var i in navState)
{
if (i != "page")
url.append("&");
url.append(i).append("=").append(navState[i]);
}
// set it
window.location.href = url.toString();
}
这就是调用树的样子,来自IE8分析器:
saveState 1 615,00 ms
f 15 1,00 ms
String.split 1 0,00 ms
Array 1 0,00 ms
Object 1 0,00 ms
StringBuffer 1 0,00 ms
append 64 0,00 ms
Array.push 64 0,00 ms
toString 1 0,00 ms
Array.join 1 0,00 ms
Object.valueOf 63 0,00 ms
Function.toString 63 0,00 ms
我正在使用的StringBuffer实现:
function StringBuffer() {
this.buffer = [];
}
StringBuffer.prototype.append = function append(string) {
this.buffer.push(string);
return this;
};
StringBuffer.prototype.toString = function toString() {
return this.buffer.join("");
};
编辑:更新了代码,平均需要397毫秒才能运行。
var _nvs_currentTab;
var _nvs_zoomfield;
var _nvs_centerfield;
var _nvs_globsearch;
var _nvs_category;
var _nvs_favsonly;
var _nvs_wishonly;
var _nvs_friendfavsonly;
var _nvs_newitemsonly;
var _nvs_globsearchOld;
var _nvs_catOld;
var _nvs_favsonlyOld;
var _nvs_wishonlyOld;
var _nvs_friendFavsonlyOld;
var _nvs_newItemsOnlyOld;
function saveState()
{
if (!_nvs_currentTab)
{
var _f = document.guideForm;
_nvs_currentTab = _f.currentTab;
_nvs_zoomfield = _f.zoomfield;
_nvs_centerfield = _f.centerfield;
_nvs_globsearch = _f.globsearch;
_nvs_category = _f.category;
_nvs_favsonly = _f.favsonly;
_nvs_wishonly = _f.wishonly;
_nvs_friendfavsonly = _f.friendfavsonly;
_nvs_newitemsonly = _f.newitemsonly;
_nvs_globsearchOld = _f.globsearchOld;
_nvs_catOld = _f.categoryOld;
_nvs_favsonlyOld = _f.favsonlyOld;
_nvs_wishonlyOld = _f.wishonlyOld;
_nvs_friendFavsonlyOld = _f.friendFavsonlyOld;
_nvs_newItemsOnlyOld = _f.newItemsOnlyOld;
}
// build new url with state
var url = new StringBuffer();
url.append("#");
url.append('currentPage=').append(currentPage);
url.append('¤tTab=').append(_nvs_currentTab.value);
url.append('&zoomfield=').append(_nvs_zoomfield.value);
url.append('¢erfield=').append(_nvs_centerfield.value);
url.append('&globsearch=').append(_nvs_globsearch.value);
url.append('&category=').append(_nvs_category.value);
url.append('&favsonly=').append(_nvs_favsonly.checked);
url.append('&wishonly=').append(_nvs_wishonly.checked);
url.append('&friendfavsonly=').append(_nvs_friendfavsonly.checked);
url.append('&newitemsonly=').append(_nvs_newitemsonly.checked);
url.append('&globsearchOld=').append(_nvs_globsearchOld.value);
url.append('&catOld=').append(_nvs_catOld.value);
url.append('&favsonlyOld=').append(_nvs_favsonlyOld.value);
url.append('&wishonlyOld=').append(_nvs_wishonlyOld.value);
url.append('&friendFavsonlyOld=').append(_nvs_friendFavsonlyOld.value);
url.append('&newItemsOnlyOld=').append(_nvs_newItemsOnlyOld.value);
// set it
window.location.href = url.toString();
}
答案 0 :(得分:10)
好的,你不会相信这一点。我刚刚尝试删除以下行:
window.location.href = url.toString();
它将平均运行时间减少到三分之一毫秒。我知道从分析中调用toString是非常快的,所以显然设置window.location.href是超慢的(几百毫秒!!!)。呸,我讨厌IE。
注意:这是一个干净的Internet Explorer安装,我没有疯狂的工具栏来减慢我的浏览器。
答案 1 :(得分:2)
似乎您存储了某种形式的字段。
不是使用document.getElementById()
来获取表单的每个元素,而是尝试直接获取表单元素的值:
navState.currentTab = document.formName.currentTab.value;
其中formName
是name
标记的form
属性的值,而currentTab
是表单元素的name
属性的值(即输入,复选框)。
修改强>
当我在2000年使用IE5和IE5.5时甚至更改(存储对变量中的表单元素的引用):
for (i = 0; i < document.form.elements.length; i++) {
values[i] = document.form.elements[i].value;
}
为:
var form = document.form;
for (i = 0; i < form.elements.length; i++) {
values[i] = form.elements[i].value;
}
产生了很大的不同。
恐怕在过去10年里没有任何改变:(。
答案 2 :(得分:1)
您是否尝试过评论“获取所有变量”部分和window.location.href
行?它可能是导致延迟的input
或导航(例如错误的浏览器工具栏)之一。
顺便说一下,它在我的测试页面上运行正常,但可能是你有一个更大的DOM。