"Function factory"似乎不起作用,JavaScript



我正在循环显示一系列图像,并且我正在尝试实现某种裸体过滤器,所以我正在使用裸体.js,一个可以在某种程度上检测裸露的库。代码如下:

// we're inside a loop
$(".images").prepend($("<img>").attr({src: whatever, id: uniqueid}).load(function(e) {
    nude.load(e.target.id);
    nude.scan(function(result) { if (!result) $(e.target).detach(); });
});

但是,它会分离所有错误的图像,因为裸体.js很慢,并且在循环进行后续迭代后完成,分离这些图像而不是它正在处理的图像。

我尝试使用函数工厂:

function generateCallback(arg) {
    return function(result) { if (!result) $(arg).detach(); };
}

nude.scan( generateCallback(e.target) )

但同样的事情发生了。

我想要的是一个load事件,如果图像似乎包含裸露,它将删除图像。我怎样才能正确地做到这一点?

编辑:裸体.js工作原理如下:

nude.load(imageid);
nude.scan(callback); // it'll pass true or false into the callback

另一个编辑:不小心从我发布的代码中省略了 id 设置,但它在我的真实代码中存在,所以我在这里添加了它。

我怀疑这里的情况是这种顺序处理不适用于裸体.js。

查看裸体.js代码,我认为您的问题发生在调用nude.scan 中。 nude.js有一个变量,用于存储扫描完成后要调用的函数。调用 nude.scan(callback) 时,此变量设置为 callback

从您的 PasteBin 中,似乎回调在第一次调用时按预期分配,但在第二次和后续调用中,它被替换,因此为什么第二个图像被分离而不是第一个图像。

脚本发生的情况是,e var 是函数的全局变量,因此在每个循环之后,它都会被替换为新的循环。因此,当扫描第一张图像时,e 已经成为第二张图像的事件,它们被分离了。

要解决您的问题,请使用闭包。如果您想了解有关闭包的更多信息,请查看此处。其他方式,这是您问题的解决方案:

$(".images").prepend($("<img>").attr({src: whatever, id: uniqueid}).load(function(e) {
    (function(e) {
        nude.load(e.target.id);
        nude.scan(function(result) { if (!result) $(e.target).detach(); });
    }) (e);
});

编辑:正如nick_w所说,有一个var包含回调,并且每次都可能被替换,所以这就是为什么它不是正确的图片被分离的原因。您可能需要自己修改脚本

最新更新