javascript - 试图删除 jQuery

标签 javascript dom selector

<分区>

有网站:http://youmightnotneedjquery.com/ : 对于我的 AngularJS 应用程序,我真的很想删除 jQuery。我仍然需要 jQuery 而不能只使用 AngularJS 附带的 jQLite 的原因是因为 jQLite 不支持基于类的选择器。

querySelectorAll() 的问题是当我尝试运行它时:

el.querySelectorAll('> .content')

我明白了:

SyntaxError:无法执行查询:'> span' 不是有效的选择器。

有没有办法只用原生 DOM 方法来编写这个选择器?

最佳答案

如果您真的被迫使用 jQuery 来查找 .content 第一级子项,请改用 XPath,它会做完全相同的事情:

var xpathQuery = "./*[@class='content'";
xpathQuery += " or starts-with(@class,'content ')";
xpathQuery += " or contains(@class,' content ')";
xpathQuery += " or substring(@class, string-length(@class)-6)=' content']";
var iterator=document.evaluate(xpathQuery , el, null, XPathResult.ANY_TYPE, null );
var contentNode = iterator.iterateNext();

小心使用 ./ 而不是 .// 就像使用 '>' 而不是空格 ' ' 在 jQuery 选择器中。

我设法创建了一个通用函数供您使用:

function findByClassName(el, className, firstLevel) {
    var xpathQuery = firstLevel ? "./" : ".//";
    xpathQuery += "*[@class='" + className + "'";
    xpathQuery += " or starts-with(@class,'" + className + " ')";
    xpathQuery += " or contains(@class,' " + className + " ')";
    xpathQuery += " or substring(@class, string-length(@class)-" + (className.length) + ")=' " + className + "']";

    var iterator = document.evaluate(xpathQuery, el, null, XPathResult.ANY_TYPE, null);
    var nodes = [];
    var node;
    while (node = iterator.iterateNext()) {
        nodes.push(node);
    }
    return nodes;
}

对于您的用例,您应该像这样使用它:

var contentNodes = findByClassName(el, 'content', true);

这是工作 jsfiddle DEMO .

关于javascript - 试图删除 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21486774/

相关文章:

javascript - 从使用 ajax 调用的 php 函数下载图像

javascript - javascript 中元素函数的可见性不起作用

javascript - 函数不会(正确)执行多次

java - 当多个按钮具有相同的 XPATH 时,无法单击单个按钮

html - 可以根据序列中的索引为元素的背景着色吗?

javascript - 如何在 JavaScript 中创建自定义事件?

javascript - 'fn' 为 null 或者不是 require-jquery.js 行 :2813 中的对象

java - 在 Java 中以编程方式创建 W3C DOM 的有效方法是什么?

jquery - 查找元素的类别并选择多个类别

javascript - 扩展 flexbox div,以便在我附加 div 时它可以扩展