2014-01-04 3 views
2

Я показываю серию изображений в цикле, и я пытаюсь реализовать какой-то фильтр наготы, поэтому я использую nude.js, библиотеку, которая может несколько обнаруживает наготу. Вот код:«Функция factory» не работает, JavaScript

// 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, которое удалит изображение, если оно, похоже, содержит наготу. Как я могу сделать это правильно?

EDIT: nude.js работает следующим образом:

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

другое редактирование: случайно пропущен параметр из кода я отправил идентификатор, но это было в моем реальном коде, поэтому я добавил его здесь.

+0

Где вы указываете ID изображения? (Что вы используете в 'nude.load'?). Код, который вы сейчас получили, будет работать нормально, так как 'e' является локальной переменной. FYI, вы должны установить 'src' * после * прикрепления обработчика' load', поскольку в противном случае кешированные изображения будут загружаться между установкой 'src' и прикреплением handerl. – Matt

+0

Я устанавливаю его в 'i ' с увеличением счетчика, но я пропустил это из кода, который я разместил здесь (он есть сейчас), и я уверен, что он настроен для всех.Код, который у меня есть на данный момент (обе фабричные и без функции), не работает, хотя даже после того, как вы выбрали порядок установки 'src' и обработчика нагрузки. – itdoesntwork

+0

Да, совет src и load был скорее FYI, а не «itll fix your problem». – Matt

ответ

2

Я подозреваю, что случай заключается в том, что такая последовательная обработка не будет работать с nude.js.

Глядя на nude.js code, я думаю, что ваша проблема возникает при вызове nude.scan. nude.js имеет переменную, которая хранит функцию для вызова после завершения сканирования. При вызове nude.scan(callback) эта переменная устанавливается равной callback.

От вашего PasteBin кажется, что обратный вызов назначается как ожидалось при первом вызове, но на втором и последующих вызовах он заменяется, поэтому почему второе изображение отключено, а не первое.

+0

начал запускать их последовательно, теперь он работает. – itdoesntwork

-1

Что происходит с вашим сценарием, так это то, что переменная var является глобальной функцией, поэтому после каждого цикла она заменяется на новую. Поэтому, когда сканируется первое изображение, e уже стал событием второго изображения, которое отделяется.

Чтобы решить вашу проблему, используйте затворы. Если вы хотите узнать больше о закрытии, посмотрите here. Otherway, вот решение вашей проблемы:

$(".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); 
}); 

EDIT: AS nick_w сказал, есть вар, который содержит функцию обратного вызова и, вероятно, заменяются каждый раз, так это то, почему это не право картины получать отдельно. Возможно, вам придется самостоятельно изменить сценарий

+0

Я думал, что это будет в первую очередь, но nude.js имеет единственную переменную, которая хранит обратный вызов для запуска пост-сканирования. Это устанавливается для функции, которая передается вызову 'nude.scan'. Таким образом, вызванный обратный вызов будет тем, который был указан в последнем вызове 'nude.scan', поэтому проблема. Вы также можете сказать из pastebin в комментариях, что переменная scope не является проблемой. –

+0

Извините, но все, кроме вашего редактирования, неверно. 'e' не будет заменен на каждую итерацию, поскольку он локален для обработчика события. – Matt

Смежные вопросы