2016-07-12 4 views
0

のjsファイル内でaddEventListenerとの違いとスクリプトタグ内

<!DOCTYPE html> 
<html> 
<head> 
    <title>Understanding File upload and File access Javascript</title> 
</head> 
<body> 
    <input type = "file" id = "files" name = "files[]" multiple></input> 
    <output id = "list"></output> 

<script> 
    function handleFileSelect(evt){ 
    var files = evt.target.files; 
    var output = []; 
    for(var i = 0, f; f = files[i]; i++){ 
     output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a',') - ', 
        f.size, 'bytes, last modified: ', 
        f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a', 
        '</li>'); 
    } 
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>'; 
} 
document.getElementById('files').addEventListener('change', handleFileSelect, false); 
</script> 
</body> 
</html> 

は、この例では、完璧に動作したindex.htmlとエラーなし。エラーが発生するTypeError:jsファイルからjavascript関数を呼び出すと、document.getElementById(...)がnullになっています。このコードは次のとおりです。

index.htmlを

<!DOCTYPE html> 
<html> 
<head> 
    <title>Understanding File upload and File access Javascript</title> 
    <script src = "fileaccess.js" type = "text/javascript"></script> 
</head> 
<body> 
    <input type = "file" id = "files" name = "files[]" multiple></input> 
    <output id = "list"></output> 
</body> 
</html> 

index.js

function handleFileSelect(evt){ 
    var files = evt.target.files; 
    var output = []; 
    for(var i = 0, f; f = files[i]; i++){ 
     output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a',') - ', 
        f.size, 'bytes, last modified: ', 
        f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a', 
        '</li>'); 
    } 
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>'; 
} 
document.getElementById('files').addEventListener('change', handleFileSelect, false); 

さて、これらの両方の例相違するものです。私はHTMLページでjavascript関数を呼び出すとエラーが発生する理由を理解できません。

+2

など、などwindow.onloadとして、DOMContentLoadedを待つハンドラ。スクリプトタグを一番下に置き、代わりに ''の直前に置きます。 – adeneo

+0

K、私はそれをチェックしてみましょう、しばらくしてください。 – learner

+0

ありがとう、アデネオ。私は今なぜ今までそれが叫んでいたのか理解しています。 – learner

答えて

1

違いは、スクリプトの配置です。
最初の例では、のDOM内の要素の後にscriptタグがであり、2番目の例ではscriptタグが先頭に、DOMの要素がになります。

.getElementByIdを持つ要素および他のそのような方法を得ることができるようにするには、要素は、最初のスクリプトは、DOM内の要素の後に来なければならないという意味、をロードする必要があり、またはスクリプトがイベントを使用する必要がありますページをロードするための要素がDOMで利用可能になる前に、あなたのスクリプトファイルが、頭の中に含まれているためです

<!DOCTYPE html> 
<html> 
<head> 
    <title>Understanding File upload and File access Javascript</title> 
</head> 
<body> 
    <input type = "file" id = "files" name = "files[]" multiple></input> 
    <output id = "list"></output> 
    <script src = "fileaccess.js" type = "text/javascript"></script> 
</body> 
</html> 
+0

私はこれを試していました。画像をアップロードしたいのですが、画像はHTMLページの背景画像に設定する必要があります。だから、もし私にいくつかのアイデアがあるなら、教えてください。 – learner

+1

残りのページの前にヘッドロード。したがって、まだロードされていない要素にアクセスしようとしています。ボディのonloadイベント内にすべてのコードを挿入する必要があります。 – GramThanos

+0

画像が読み込まれるまで待つ場合は、 'window.onload = function(){..all code here ..}' – adeneo

関連する問題