我在循环中显示一系列图像,我正在尝试实现某种裸露过滤器,所以我使用的是nude.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(); });
});
然而,它会分离所有错误的图像,因为nude.js很慢,并且在循环进行到后面的迭代后完成,分离这些图像而不是它正在处理的图像。
我尝试过使用函数工厂:
function generateCallback(arg) {
return function(result) { if (!result) $(arg).detach(); };
}
和
nude.scan( generateCallback(e.target) )
但同样的事情发生了。
我想要的是load
事件,如果图像似乎包含裸露,则会删除该图像。我该怎么做呢?
nude.load(imageid);
nude.scan(callback); // it'll pass true or false into the callback
另一个编辑:从我发布的代码中意外地省略了id设置,但它在我的真实代码中,所以我在这里添加了它。
答案 0 :(得分:2)
我怀疑这里的情况是这种顺序处理不适用于nude.js。
查看nude.js code,我认为您的问题发生在对nude.scan
的调用中。 nude.js有一个变量,用于存储扫描完成后要调用的函数。致电nude.scan(callback)
时,此变量设为callback
。
从PasteBin开始,似乎第一次调用时回调被按预期分配,但是在第二次和后续调用中,它被替换,因此为什么第二个图像被分离而不是第一个。
答案 1 :(得分:-1)
您的脚本发生了什么, e var对函数是全局的,因此在每次循环之后它将被替换为新的。因此,当扫描第一张图像时, e 已成为第二张图像的事件,该图像会被分离。
要解决您的问题,请使用闭包。如果您想了解有关闭包的更多信息,请查看here。 无论如何,这是你的问题的解决方案:
$(".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);
});
编辑:AS nick_w说,有var包含回调,可能每次都被替换,所以这就是为什么它不是正确的图片分离。您可能需要自己修改脚本