1
$(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 时间已经关闭,因为一切都是动态创建的?

4

2 回答 2

2

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

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

button.onclick = getPick;

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

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

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

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

于 2013-06-01T23:09:11.573 回答
1

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]';
    });
});
于 2013-06-01T23:07:41.287 回答