0

このチュートリアルをガイドとして使用して、独自の HTML5 ドラッグ アンド ドロップ アップロード機能を実装しています。

File API、FileReader API、XHR2 API も使用しています。

また、API サポートを確認するために、このソース コードのスニペットをコードに含めました。

奇妙なことに、実際に XHR2 と File API をサポートしている Chrome 28.0.1 と Firefox 23.0.1 でファイルを開くと、

File API & FileReader API not supported

XHR2's FormData is not supported

XHR2's upload progress isn't supported

何が悪いのかわかりません。私はこれらの API の初心者です。構文エラーは問題の 1 つですが、API はサポートされていませんか? 彼らはどこにいるべきですか?私はそれを理解していません。

御時間ありがとうございます

これが私のコードです

    <style>
    #holder { border: 10px dashed #ccc; width: 300px; min-height: 300px; margin: 20px auto;}
    #holder.hover { border: 10px dashed #0c0; }
    #holder img { display: block; margin: 10px auto; }
    #holder p { margin: 10px; font-size: 14px; }
    progress { width: 100%; }
    progress:after { content: '%'; }
    .fail { background: #c00; padding: 2px; color: #fff; }
    .hidden { display: none !important;}
    </style>


    <script type='text/javascript'>
//check for support API
    var holder = document.getElementById('holder'),
         tests = {
          filereader: typeof FileReader != 'undefined',
          dnd: 'draggable' in document.createElement('span'),
          formdata: !!window.FormData,
          progress: "upload" in new XMLHttpRequest
        }, 
        support = {
          filereader: document.getElementById('filereader'),
          formdata: document.getElementById('formdata'),
          progress: document.getElementById('progress')
        },
        acceptedTypes = {
          'image/png': true,
          'image/jpeg': true,
          'image/gif': true
        },
        progress = document.getElementById('uploadprogress'),
        fileupload = document.getElementById('upload');

    "filereader formdata progress".split(' ').forEach(function (api) {
      if (tests[api] === false) {
          alert('inside me, bad...');
        support[api].className = 'fail';
      } else {
        // FFS. I could have done el.hidden = true, but IE doesn't support
        // hidden, so I tried to create a polyfill that would extend the
        // Element.prototype, but then IE10 doesn't even give me access
        // to the Element object. Brilliant.
        support[api].className = 'hidden';
      }
    });

//preview files/images-give feedback to user
    function previewfile(file) {
      if (tests.filereader === true && acceptedTypes[file.type] === true) {
        var reader = new FileReader();
        reader.onload = function (event) {
          var image = new Image();
          image.src = event.target.result;
          image.width = 250; // a fake resize
          holder.appendChild(image);
        };

        reader.readAsDataURL(file);
      }  else {
        holder.innerHTML += '<p>Uploaded ' + file.name + ' ' + (file.size ? (file.size/1024|0) + 'K' : '');
        alert(file.name);
        console.log(file);
      }
    }

    //read file from drop area
    function readfiles(files) {
        debugger;
        var formData = tests.formdata ? new FormData() : null;
        for (var i = 0; i < files.length; i++) {
          if (tests.formdata) formData.append('file', files[i]);
          alert(files[i].name);
          previewfile(files[i]);
        }

        // now send file
        if (tests.formdata) {
          var xhr = new XMLHttpRequest();
          xhr.open('POST', '/upload.php');
          xhr.onload = function() {
            progress.value = progress.innerHTML = 100;
          };

          if (tests.progress) {
            xhr.upload.onprogress = function (event) {
              if (event.lengthComputable) {
                var complete = (event.loaded / event.total * 100 | 0);
                progress.value = progress.innerHTML = complete;
              }
            }
          }

          xhr.send(formData);
        }
    }

    if (tests.dnd) { 

       holder.addEventListener('drop', ondrop, false); 
       holder.addEventListener('dragover', ondragover, false); 
       holder.addEventListener('dragend', ondragend, false); 

      holder.ondragover = function () { this.className = 'hover'; return false; };
      holder.ondragend = function () { this.className = ''; return false; };
      holder.ondrop = function (e) {
        this.className = '';
        e.preventDefault();
        readfiles(e.dataTransfer.files);
      }
    } else {
      fileupload.className = 'hidden';
      fileupload.querySelector('input').onchange = function () {
        readfiles(this.files);
      };
    }

    </script>


    <!-- the html -->
     <div id="holder">
      </div> 

      <p id="upload" class="hidden"><label>Drag &amp; drop not supported, but you can still upload via this input field:<br><input type="file"></label></p>
      <p id="filereader">File API &amp; FileReader API not supported</p>
      <p id="formdata">XHR2's FormData is not supported</p>
      <p id="progress">XHR2's upload progress isn't supported</p>
      <p>Upload progress: <progress id="uploadprogress" min="0" max="100" value="0">0</progress></p>
      <p>Drag an image from your desktop on to the drop zone above to see the browser both render the preview, but also upload automatically to this server.</p>
4

1 に答える 1

3

問題

基本的に、javascript はまだ存在しない html にアクセスしようとしています。

解決

これは、html がロードされた後に JavaScript を実行することで解決できます。

これを行うには多くの方法があります。

  • javascript をスクリプト タグに入れ、html の下に配置します。
  • JavaScript を独自のファイルに配置し、この ( <script type="text/javascript" src="script.js"></script>) を html の下に配置します。
  • JavaScript を関数に入れてonload="functionName();"から、body タグに追加します。
  • たとえば、jQuery を使用して、ドキュメントの「準備ができた」場合にのみコードを実行します。$(document).ready(function () { //code goes here });
  • まだ実際に入る必要のない他の多くの方法。

これをテストして確かめましょう

あなたが提供したコードは、このエラーを返しますTypeError: support[api] is null on line 44

簡単なテストのために、これをconsole.log('api',api);44 行目に追加しました。

したがって、44 行目と 45 行目は次のようになります。

console.log('api',api);
support[api].className = 'hidden';

コンソール ログ出力:

api filereader
TypeError: support[api] is null

コードをもう一度見てみると、support[filereader]23 行目に設定されていることがわかります。

support = {
          filereader: document.getElementById('filereader'),

つまり、api = document.getElementById('filereader') であり、たまたま null になります。つまり、JavaScript は id="filereader" の要素を見つけることができません。

しかし、126行目を見ると存在することがわかります

<p id="filereader">File API &amp; FileReader API not supported</p>

そのため、JavaScript はまだページに読み込まれているため、アクセスできない可能性があります。

javascript を html の下に置いてみましょう。

お役に立てれば :-)

于 2013-08-24T16:02:32.383 に答える