如何实现sizzle';s:gt过滤器在vanilla javascript中

如何实现sizzle';s:gt过滤器在vanilla javascript中,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我正在尝试通过jQuery插件进行移植,我必须与AngularJS JQlite API兼容,但遇到了一些障碍。以下是插件: (function (e) { var $product = $('#product'), $imgs = $product.find('.child'), imageTotal = $imgs.length - 1, clicked = false, widthStep = 4,

我正在尝试通过jQuery插件进行移植,我必须与AngularJS JQlite API兼容,但遇到了一些障碍。以下是插件:

    (function (e) {

    var $product = $('#product'),
        $imgs = $product.find('.child'),
        imageTotal = $imgs.length - 1,
        clicked = false,
        widthStep = 4,
        currPos,
        currImg = 0,
        lastImg = 0;
    $imgs.bind('mousedown', function (e) {
        e.preventDefault(); // prevent dragging images
    })
        .filter(':gt(0)').addClass('notseen');

    $product.bind('mousedown touchstart', function (e) {
        if (e.type == "touchstart") {
            currPos = window.event.touches[0].pageX;
        } else {
            currPos = e.pageX;
        }
        clicked = true;

    });
    $(document)
        .bind('mouseup touchend', function () {
        clicked = false;
    })
        .bind('mousemove touchmove', function (e) {
            fadeInOut();
        if (clicked) {
            var pageX;
            if (e.type == "touchmove") {
                pageX = window.event.targetTouches[0].pageX;
            } else {
                pageX = e.pageX;
            }
            widthStep = 4;
            if (Math.abs(currPos - pageX) >= widthStep) {
                if (currPos - pageX >= widthStep) {
                    currImg++;
                    if (currImg > imageTotal) {
                        currImg = 0;
                    }
                } else {
                    currImg--;
                    if (currImg < 0) {
                        currImg = imageTotal;
                    }
                }
                currPos = pageX;
                $imgs.eq(lastImg).addClass('notseen');
                $imgs.eq(currImg).removeClass('notseen');
                lastImg = currImg;
                // $obj.html('<img src="' + aImages[options.currImg] + '" />');
            }
        }
    });


}); 
(函数(e){
变量$product=$(“#product”),
$imgs=$product.find('.child'),
imageTotal=$imgs.length-1,
单击=false,
宽度步长=4,
柯尔波斯,
电流=0,
lastImg=0;
$imgs.bind('mousedown',函数(e){
e、 preventDefault();//防止拖动图像
})
.filter(':gt(0)').addClass('notseen');
$product.bind('mousedown touchstart',函数(e){
如果(例如,类型==“touchstart”){
currPos=window.event.touchs[0].pageX;
}否则{
currPos=e.pageX;
}
单击=真;
});
$(文件)
.bind('mouseup touchend',函数(){
单击=假;
})
.bind('mousemove touchmove',函数(e){
fadeInOut();
如果(单击){
var pageX;
如果(例如,类型==“触摸移动”){
pageX=window.event.targetTouches[0].pageX;
}否则{
pageX=e.pageX;
}
宽度步长=4;
if(数学绝对值(currPos-pageX)>=widthStep){
如果(currPos-pageX>=宽度步长){
currImg++;
如果(当前>图像总计){
电流=0;
}
}否则{
货币--;
如果(电流<0){
currImg=图像总数;
}
}
currPos=pageX;
$imgs.eq(lastImg.addClass('notseen');
$imgs.eq(currImg.removeClass('notseen');
lastImg=电流;
//$obj.html(“”);
}
}
});
}); 
它所做的只是创建360度旋转效果,可以演示

现在的问题是一些特定于jquery的API。类似于
.filter(':gt(0)
的操作,用于选择索引大于0和pageX的数组中的项。我对
.filter(':gt(0)
做了一些研究,但它似乎只过滤特定的索引(索引为2、6、13,而不是>0)


关于如何以纯javascript格式实现此过滤器,有什么想法吗?非常感谢您的帮助。

过滤器只需在元素列表中循环,并根据选择器进行过滤。因为您只需要检查gt(0),它基本上是除第一个on之外的所有元素,所以您可以使用for循环替换过滤器并跳过第一个元素。e、 g

for (var i=1; i<$imgs.length; i++){
    $($imgs[i]).addClass('notseen');
}

for(var i=1;i您可以执行类似的操作,但要在回调中添加一个附加参数。该附加参数将被视为索引而不是值


var filteredArray=array.filter(函数(x,y){return y>0;})
将给出
filteredArray
数组中大于index
0

的所有值,而不是使用filter,您可以使用
[].slice
获得数组中大于n的所有索引

$([].slice.call($imgs,1)).addClass("notseen");

这也适用于jquery:


你不必重写它(也可能不想重写),只需在服务中公开它。只需确保你的应用程序中包含了(完整的)jQuery。这就是我一直在做的事情和它的工作,但我想尝试将jQuery作为依赖项(个人原因和文件大小)去掉.我不想为它操心太多-如果你真的不想使用jQuery,就试着找一个等效的插件作为angular模块。无论如何,我建议你编辑你的问题以解决手头的具体问题(即如何在vanilla javascript中实现sizzle的
:gt
选择器),并附上您作为引用遇到的方法。我不熟悉jqLite,元素数组只是一个普通数组吗?它是一个像jquery对象一样像数组的对象吗?还是什么。我怀疑您可以使用[].slice以获得您想要的。Angular的JQlite基本上提供了一些与全尺寸jquery相比的方法。太棒了,尝试了一下,效果非常好。谢谢!