Ванильный JavaScript с функцией, функция не определена

62
6

$(function() {
var script = document.createElement('script');
script.id="filepicker";
script.type="text/javascript";
script.src="//api.filepicker.io/v1/filepicker.js";
var body=document.querySelectorAll("body")[0]; ;
body.appendChild(script);
var ButtonsArea = document.querySelectorAll('.frm-buttons')[0];
var textArea = document.getElementById('text_editor_textarea');
var button = document.createElement('span');
var divText=document.createTextNode("Upload File");
button.id="newDoc";
button.setAttribute("onclick","getPick()");
button.appendChild(divText);
ButtonsArea.appendChild(button);

function getPick(){
filepicker.setKey('AWpNcAmH9TmiWtEgHsFwBz');
filepicker.pick({
mimetypes: ['text/*'],
services:['COMPUTER'],
maxSize:50*1024
},function(FPFile) {
var docFile = FPFile.url;
textArea.value=textArea.value+'[url]'+FPFile.url+'+'+FPFile.filename+'[/url]';
});
}
});

моя функция getPick() говорит, что она не определена, есть ли что-то, чего я не вижу во всем JavaScript, возможно, время JavaScript выключено, поскольку все создается динамически?

спросил(а) 2021-01-19T18:54:35+03:00 2 месяца, 3 недели назад
1
Решение
75

Проблема в том, что когда вы объявляете функцию в рамках другой функции, она ограничена областью действия этой функции. Когда вы вызываете getPick() в атрибуте onclick элемента, он выполняется в глобальной области. getPick там не существует.

Вместо этого вы можете просто назначить функцию как свойство onclick:

button.onclick = getPick;

Вы можете повысить гибкость вашего кода, используя addEventListener, который будет выглядеть следующим образом:

button.addEventListener('click', getPick, false);

Это позволяет вам иметь более одного обработчика click на кнопке, если вы этого хотите, но он несовместим со старыми версиями Internet Explorer. button.onclick = совместим практически со всеми браузерами, которые возвращаются очень долго в историю Интернета!

Обратите внимание, что в обоих случаях вы используете getPick а не getPick(). Первый - это ссылка на функцию; последний выполняет функцию и возвращает вам возвращаемое значение.

ответил(а) 2021-01-19T18:54:35+03:00 2 месяца, 3 недели назад
61

Функция getPick() определяется локально внутри анонимной готовой функции, поэтому она не видна обработчику onclick.

Попробуйте переместить функцию getPick за пределы $(function() { }); блок.


Кроме того, используйте правильную обработку событий, например:

button.click(function() {
filepicker.setKey('AWpNcAmH9TmiWtEgHsFwBz');
filepicker.pick({
mimetypes: ['text/*'],
services:['COMPUTER'],
maxSize:50*1024
}, function(FPFile) {
var docFile = FPFile.url;
textArea.value=textArea.value+'[url]'+FPFile.url+'+'+FPFile.filename+'[/url]';
});
});

ответил(а) 2021-01-19T18:54:35+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема