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 に答える