【问题标题】:Vanilla JavaScript with Function, function not defined带有函数的香草 JavaScript,未定义函数
【发布时间】:2013-06-01 23:01:23
【问题描述】:
$(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 时间已经关闭,因为一切都是动态创建的?

【问题讨论】:

  • 不确定问题出在哪里,但将点击事件设置为带有字符串的属性并不是一个好习惯。尝试使用 addEventListener 并将函数作为对象传递,这就是 JS 的美妙之处。
  • 好的,这是我的第一个香草代码:D 那我该怎么办? button.addEventListener('click',getPick()); ?

标签: javascript undefined-function


【解决方案1】:

问题在于,当您在另一个函数的范围内声明一个函数时,它仅限于该函数的范围。当您在元素的onclick 属性上调用getPick() 时,它会在全局范围内执行。 getPick 那里不存在。

您可以简单地将函数分配为onclick 属性:

button.onclick = getPick;

您可以使用addEventListener 增加代码的灵活性,如下所示:

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

如果您愿意,这允许您在按钮上拥有多个click 处理程序,但它与旧版本的 Internet Explorer 不兼容。 button.onclick = 兼容几乎所有可以追溯到互联网历史悠久的浏览器!

请注意,在这两种情况下,您都使用getPick 而不是getPick()。前者是对函数的引用;后者执行函数并给你它的返回值。

【讨论】:

  • 两者都有效。非常感谢你。我能问一下为什么我们不必在 or 上执行 getPick() 吗?
  • 正如我在回答中所说,getPick 的意思是“给我一个函数的引用,以便我们稍后执行它”,而getPick() 的意思是“现在执行该函数并给我它的返回值”。
  • 哦,我的错,完全跳过了那部分:D谢谢你的解释。
  • @EasyBB:阅读“一流”功能。 JavaScript 是一种函数式语言,函数只是您可以传递的对象。一旦你理解了这一点,阅读“高阶”函数,你就进入了 JavaScript 天堂 :)
  • @EasyBB:查看 John Resig(jQuery 的创建者)的这些教程。 ejohn.org/apps/learn
【解决方案2】:

getPick() 函数是在匿名 on-ready 函数中本地定义的,因此它对 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]';
    });
});

【讨论】:

  • 既然元素是动态的,它不是 .on('click') 吗?
  • 它是动态创建的,但只有一次......所以像这样直接设置处理程序会起作用,因为它是在对象创建后设置的。
  • 哦,好的,谢谢,我不接受这个的唯一原因是因为 .click() 是 jQuery,我现在实际上正在学习 Vanilla,我很糟糕,所以先学习了 jQuery
猜你喜欢
  • 2011-06-06
  • 2021-12-04
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2011-05-21
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多