【问题标题】:What does the minified jquery function "m" do?缩小的 jquery 函数“m”有什么作用?
【发布时间】: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


【解决方案1】:

由于您已经知道它来自 jQuery 1.7.1,因此您可以简单地检查它的源代码并寻找缩小代码的显着模式,例如正则表达式、.isXML 方法或众多 DOM 属性之一。您很快就会发现它是 Sizzle function,它是 jQuery 的 Sizzle 选择器引擎的入口点。

如果这个函数占用了你太多的运行时间,这可能暗示你 a) 运行旧的浏览器 b) 使用了过于复杂的 DOM 选择器 c) 在你的代码中使用了太多的选择。

【讨论】:

  • 绝对是(a)。只有在 IE8 中才会发生这种情况。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2018-11-19
  • 2014-05-23
相关资源
最近更新 更多