【发布时间】:2015-05-26 21:09:06
【问题描述】:
我正在我网站上的页面上运行分析器,当我在输入屏蔽 SSN 字段中键入三个字符时,函数“m”运行了 1.2 秒。试图弄清楚正在调用的函数是什么,以便我可以在代码中找到它并查看它为什么运行这么长时间。
我注意到的一件事是页面上的元素越多,运行所需的时间就越长。
这是来自 jquery 的函数:
m = function(b, e, f, g) {
e = e || c;
if (!g && !m.isXML(e)) {
var h = /^(\w+$)|^.([\w-]+$)|^#([\w-]+$)/.exec(b);
if (h && (e.nodeType === 1 || e.nodeType === 9)) {
if (h[1]) return s(e.getElementsByTagName(b), f);
if (h[2] && o.find.CLASS && e.getElementsByClassName) return s(e.getElementsByClassName(h[2]), f)
}
if (e.nodeType === 9) {
if (b === "body" && e.body) return s([e.body], f);
if (h && h[3]) {
var i = e.getElementById(h[3]);
if (!i || !i.parentNode) return s([], f);
if (i.id === h[3]) return s([i], f)
}
try {
return s(e.querySelectorAll(b), f)
} catch (j) {}
} else if (e.nodeType === 1 && e.nodeName.toLowerCase() !== "object") {
var k = e,
l = e.getAttribute("id"),
n = l || d,
p = e.parentNode,
q = /^\s*[+~]/.test(b);
l ? n = n.replace(/'/g, "\$&") : e.setAttribute("id", n), q && p && (e = e.parentNode);
try {
if (!q || p) return s(e.querySelectorAll("[id='" + n + "'] " + b), f)
} catch (r) {} finally {
l || k.removeAttribute("id")
}
}
}
return a(b, e, f, g)
};
【问题讨论】:
-
在缩小时生成源映射,以便您知道代码在做什么。
-
我建议使用未缩小的 jQuery 版本并再次分析您的代码。
-
在source 中搜索
isXML显示该函数与jQuery 的选择器引擎Sizzle有关。未缩小来源:github.com/jquery/sizzle/blob/1.7.1/sizzle.js#L1150-L1233 -
明确地说,我没有在我正在处理的页面中加载 jQuery。这是一个使用第三方控件的大型 c# 应用程序,这些控件本身正在加载并依赖于特定版本的 jQuery。虽然我可以追踪他们的库并确定它在哪里加载缩小的 jQuery 并对其进行更改,但我想我会先在这里问一下,以防之前有人遇到过这个问题。感谢 felix-kling 和 @bergi 带来了嘶嘶声。
标签: javascript jquery