当前位置: 首页 > 知识库问答 >
问题:

Sizzle推应用

周作人
2023-03-14

为什么Sizzle选择器引擎会使用push.apply(结果......)而不是results.push(...)对我来说似乎没有必要。有人能解释一下动机吗?

为了详细说明,我对为更轻的重量选择器引擎编写/借用sizzy中的位很感兴趣。我想我不需要像:包含(文本)这样的东西,这会进一步减轻重量。所以通读我看到的源代码

var arr = [],
    push = arr.push
    results = results || [];
 ....
 push.apply( results, context.getElementsByTagName( selector ) );

这段代码很有意义,只是使用起来不是更简单吗

results.push( context.getElementsByTagName( selector ) );

我不想对这样一个小小的会议唠叨不休,我只想知道我是否遗漏了一些背景问题。

共有2个答案

邬令
2023-03-14

再次查看代码(Rest后)。在第205行,Sizzle检查选择器模式是否是ID并使用results.push

elem = context.getElementById( m );
results.push( elem );
return results;

第237行之后的代码用于元素或类,并使用了getElementsByTagName或getElementsByClassName以及push。应用(结果,…)

我想这是

for( elem in context.getElementsByClassName( m ) ) {
    results.push( elem );
}

就像Mozzila文档示例中的情况一样https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

// short hand
var max = Math.max.apply(null, numbers);
var min = Math.min.apply(null, numbers);

/* vs. simple loop based algorithm */
max = -Infinity, min = +Infinity;

for (var i = 0; i < numbers.length; i++) {
  if (numbers[i] > max)
    max = numbers[i];
  if (numbers[i] < min) 
    min = numbers[i];
}

根据我最初的问题结果。push(context.getElementsByTagName(选择器)) 将导致不需要的对象。这会将NodeList类型的一个参数推送到结果中。

示例:

var a = [1, 2, 3], b = [], c =[];
b.push( a ); // b.length = 1, now we have a multidimensional array
[].push.apply( c, a ); // c.length = 3, we now have a clean array, not a NodeList
陈兴朝
2023-03-14

它代替了:

results.concat(array)

因为concat创建了一个额外的数组,但是push。应用不会:

push.apply(results, array)

缓存结果数组,不创建额外的数组。

但你也可以这样做:

results.push.apply(results, array)

我不知道为什么需要arr。

编辑:

我认为额外的arr可能需要将getElementsByTagName返回的伪数组转换为实数组。

 类似资料:
  • jquery从1.3开始,使用了新的选择器–sizzle。效率超过了以前的jquery版本以及目前能见到的其他选择器。 Sizzle是jQuery作者John Resig新写的DOM选择器引擎,速度号称业界第一。而且有一个重要的特点就是Sizzle是完全独立于jQuery的,如果你不想用jQuery,可 以只用Sizzle。非常好用的,压缩后才3K多点。 看一个选择器性能对比图:

  • 我看到了一些问题(用Sizzle替换dojo.query?)关于在dojo中使用Sizzle作为选择器引擎,并且知道这是可能的,但似乎找不到任何关于如何进行的教程或信息。 我知道在您的build.profile.js文件中,您可以选择这样的选择器引擎: 但是我该如何用嘶嘶声指向/替换“精简版”或“极致版”呢?

  • 应用推广 PDF版下载 申请条件 应用有已发布并通过审核线上版本。 上架流程 服务商进入应用详情—应用市场上架—申请上架。 如流团队会在3个工作日内完成审核,审核结果会通过“企业管理助手”通知申请人。

  • 我已经知道如何使用Sizzle CSS选择器引擎。 这是语法: 所以现在我的问题是:Sizzle CSS选择器引擎有什么用?

  • 据我所知,Sizzle和querySelector/querySelector都是CSS选择器。所以加载Sizzle和执行以下操作有什么区别: 和 此外,我知道Sizzle返回一个元素数组,而querySelectorAll返回一个节点列表(在大多数浏览器中)。我还知道您需要加载Sizzle,并且可以使用文档。仅针对一个元素查询选择器。 那么,在性能上还有其他区别吗? 编辑:我的问题只是关于Siz

  • 为什么在使用sizzle时出现以下代码调用错误: 选择符返回“[对象对象]:选中”。但是,当我简单地使用变量内容时,如也会小心地工作。 谢啦