Вместо
//create function to deal with the file once it is loaded
reader.onload = handleLoadedFile();
вы должны написать
//store reference to function to deal with the file once it is loaded
reader.onload = handleLoadedFile;
Объяснение:
При написании eventhandler = afunction()
в EventHandler сохраняет результат функции, в вашем случае это undefined
, так как ваш handleLoadedFile ничего не возвращает.
В случае eventhandler = afunction
функция не оценивается во время установки обработчика. Сохраняется только ссылка на функцию. Во время срабатывания события хранимая ссылка будет оцениваться оператором ()
(вероятно, это не совсем правильное имя, но вы, по крайней мере, можете думать о ()
beeing для оператора).
BTW это ошибка, которую делают опытные программисты JavaScript довольно часто. И есть случаи, когда это правильно, например .:
reader.onload = createEventListener('success');
reader.onerror = createEventListener('error');
function createEventListener(type) {
return function(event) {
var content;
if (type === 'success') {
content = processMyFile(event.target.result);
} else {
content = 'An Error occurred. Please try another file.';
}
$('#content').html(content);
}
}
Таким образом, вы можете видеть, что это не является неправильным во всех случаях не использовать ()
при настройке обработчика событий. Надеюсь, я не слишком вас смутил, так как в приведенной выше конструкции содержится мощная языковая функция JavaScript (а именно Closures), которая требует некоторого времени, чтобы быть понятным.
FYI: Есть другие способы, чтобы вызвать функцию, когда у вас есть ссылка на него: call и apply просто избежать понижающих голосов от гуру ;-) применение JavaScript
Дополнительной подсказки: Пожалуйста, не используйте alert()
для отлаживая ваш код. При тестировании с помощью современных браузеров (Internet Explorer < 11 следует избегать), у вас есть намного лучший способ отслеживать код: console.log()
и другие методы console
. Вам понравится использовать его, потому что вам не нужно нажимать кнопку «ОК», и вы не изменяете поведение своих асинхронных операций так резко, как с alert
. Прочитайте Mastering Console Logging и поиграйте с ним - вы никогда не оглядитесь назад!
... что тогда происходит? –
У вас есть ошибки в консоли JavaScript? –
если вы поставили скрипку, то посмотрите –