Javascript Angular JS和jqLite将节点匹配到选择器

Javascript Angular JS和jqLite将节点匹配到选择器,javascript,jquery,angularjs,jqlite,Javascript,Jquery,Angularjs,Jqlite,我正在尝试将jQuery中的一些函数添加到jqLite中,这样就不必用我的angular应用程序加载整个jQuery库。我正在使用本·纳德尔在本文中使用的技术 我很难实现像这样的closestChild插件 很明显,我已经重写了一点,所以看起来像这样 JQLite.prototype.closestChild = function(selector) { var $children, $results; $children = this.c

我正在尝试将jQuery中的一些函数添加到jqLite中,这样就不必用我的angular应用程序加载整个jQuery库。我正在使用本·纳德尔在本文中使用的技术

我很难实现像这样的closestChild插件

很明显,我已经重写了一点,所以看起来像这样

JQLite.prototype.closestChild = function(selector) {

            var $children, $results;

            $children = this.children();

            if ($children.length === 0){
                return $();
            }

            $results = $children.filter(selector);

            if ($results.length > 0){
                return $results;
            }
            else{
                return $children.closestChild(selector);
            }

        };
…但它导致了这个错误

Error: [jqLite:nosel] http://errors.angularjs.org/1.4.0-rc.0/jqLite/nosel
因此,我搜索了一下错误,发现jqLite由于某种原因无法与选择器匹配,只有标记名(这有用吗?)。我不能理解的是,它与那篇文章中Ben的.filter()函数一起运行,当您给它一个选择器时,它似乎工作得很好。这与我在这一行中调用的函数完全相同

$results = $children.filter(selector);

所以,我想我的问题是,有没有一种方法可以循环遍历$children,看看它们是否匹配使用纯javascript传递的选择器,或者其他解决方法?

我不确定您对“选择器”的期望是什么,但选择器(如Ben Nadel的代码所示)是回调或DOM节点

是这样的

angular.element(document.body)
.find('div')
.closestChild(function(el) {
    var element = angular.element(el);
    console.log(element);
    return !!element.text();
});
jqLite对选择器的支持与手册中的说明完全相同:它只支持
getElementsByTagName
find


对于“较重”的jqLite实现,您可以进行检查和投影(它们是非常新的,我还没有在工作中尝试过它们,所以请随意分享您的印象)。

这真是太棒了,estus,省得我在试图重写jqLite的过程中不知所措。我很想使用第二个,因为它是最小的,但是有东西告诉我,对于一些额外的Kb,可以访问一些额外的东西,比如.closest()可能非常方便,而且它仍然比jQuery小很多。再次感谢。希望他们足够好。不久前,我正要用Sizzle为jqLite供电,直到我发现了这些。