2016-09-02 14 views
-1

入力値が変更されるたびに(つまり、アップロードするファイルを選択するたびに)アップロードする前に入力ファイルのサイズをチェックするJavaScriptコードが必要です。毎回ではなくJavaScript関数を1回だけ呼び出す

は、これまでのところ、私はこの思い付いた:

var file = document.getElementById("myFile"); 
    file.addEventListener('change', function() { 
     if (this.files[0].size > 2*1024*1024) { 
      alert('Max file size is 2 MB'); 
      file.removeAttribute('value'); 
      file.parentNode.replaceChild(file.cloneNode(true),file); 
      } 
     } 
    ); 

をしてHTMLは次のとおりです。

<form action="?" method="post"> 
    <input type="file" id="myFile" name="myFile" /> 
    <input type="submit" value="upload" /> 
</form> 

さて、私はそのようなJavascriptのコードを残せば、それはでは動作しません。すべて。 しかし、私はこの

window.onload = function() { 

     // Same code above 

} 

それは動作しますが、のみ最初のファイルのユーザが選択のようにそれを変更した場合。

いつでも変更することができますいつでもユーザーがファイルを選択しますか? (jQueryのせずに可能な場合)

+0

あなたはdocument.onload' 'にそれを変更してみてくださいもらえ参照してください? – nikjohn

+0

ファイルが大きすぎると、要素が置き換えられ、イベントリスナーがなくなります。 –

+0

@DustinToothless - それが役立つと思われる理由は何ですか? – Quentin

答えて

2

ノードなどを複製する必要はありません。値を ''に設定するだけです。

file.value = ''; 

作業スニペット

document.getElementById("myFile").addEventListener('change', function() { 
 
    if (this.files[0].size > 2*1024*1024) { 
 
    alert('Max file size is 2 MB'); 
 
    this.value=''; 
 
    } 
 
});
<form action="?" method="post"> 
 
    <input type="file" id="myFile" name="myFile" /> 
 
    <input type="submit" value="upload" /> 
 
</form>

2

the documentation for cloneNodeより:

真性(インライン)のリスナーを含むその属性とその値をすべてのノードのコピーをクローニング。 これは、イベントリスナーは、addEventListenerをを(使用して追加コピーされません)

あなたはその上にイベントハンドラを持つ要素を削除し、必要に変更リスナー

を持っていないもので、それを交換しますaddEventListenerを再度呼び出して(file.cloneNode(true),を変数に格納して、addEventListenerに、replaceChildに渡すことができます)。

+0

何をするには?あなたのコードは、あなたが 'addEventListener'の使い方を知っていることを示しています。変数を使用するのはJS 101です。 – Quentin

+0

@Quentin - これはフォームの値をクリアするためにこの種のコードを見たのは今回も2度目です。以前はこれを見たことがありません。入力の価値をクリアするだけではなく、このようにする理由はありますか?正真正銘の疑問は、あなたの貧弱な仮定を過去に数える回数をあまりにも訂正したので、私はあなたの意見を評価します。 –

+0

@JaromandaX - おそらくそれはしませんが、私はMCの理由を知らないあります。 – Quentin

関連する問題