javascript - AngularJS 文件拖放指令

标签 javascript html file-upload angularjs angularjs-directive

这个例子几乎完成了我想在 Angular-js 中移植的功能:HTML5 File API .

我一直在尝试用谷歌搜索指令的一些示例,但是我发现了大量使用 DOM 或者不是为 Angular 1.0.4 编写的旧示例。

基本上这是纯js代码:

var holder = document.getElementById('holder'),
    state = document.getElementById('status');

if (typeof window.FileReader === 'undefined') {
  state.className = 'fail';
} else {
  state.className = 'success';
  state.innerHTML = 'File API & FileReader available';
}

holder.ondragover = function () { this.className = 'hover'; return false; };
holder.ondragend = function () { this.className = ''; return false; };
holder.ondrop = function (e) {
  this.className = '';
  e.preventDefault();

  var file = e.dataTransfer.files[0],
      reader = new FileReader();
  reader.onload = function (event) {
    console.log(event.target);
    holder.style.background = 'url(' + event.target.result + ') no-repeat center';
  };
  console.log(file);
  reader.readAsDataURL(file);

  return false;
};

我能想到的唯一可能的方法是创建一个执行的指令

edo.directive('fileDrag', function () {
  return {
    restrict: 'A',
    link: function (scope, elem) {
      elem.bind('ondrop', function(e){
        e.preventDefault();
        var file = e.dataTransfer.files[0], reader = new FileReader();
          reader.onload = function (event) {
          console.log(event.target);
          holder.style.background = 'url(' + event.target.result + ') no-repeat center';
        };
        console.log(file);
        reader.readAsDataURL(file);

        return false;
      });
    }
  };
});

但是 (1) 它不起作用,(2) 在我修复它之前我想知道是否存在某些东西或者我是否正确地做它,

非常感谢任何提示或帮助。

最佳答案

要将评论合并为答案,将ondrop更改为drop,添加e.stopPropagation(),更改holderelem

edo.directive('fileDrag', function () {
  return {
    restrict: 'A',
    link: function (scope, elem) {
      elem.bind('drop', function(e){
        e.preventDefault();
        e..stopPropagation();
        var file = e.dataTransfer.files[0], reader = new FileReader();
          reader.onload = function (event) {
          console.log(event.target);
          elem.style.background = 'url(' + event.target.result + ') no-repeat center';
        };
        console.log(file);
        reader.readAsDataURL(file);

        return false;
      });
    }
  };
});

我在做类似的事情,这是我的工作解决方案:

HTML

app.directive("dropzone", function() {
    return {
        restrict : "A",
        link: function (scope, elem) {
            elem.bind('drop', function(evt) {
                evt.stopPropagation();
                evt.preventDefault();

                var files = evt.dataTransfer.files;
                for (var i = 0, f; f = files[i]; i++) {
                    var reader = new FileReader();
                    reader.readAsArrayBuffer(f);

                    reader.onload = (function(theFile) {
                        return function(e) {
                            var newFile = { name : theFile.name,
                                type : theFile.type,
                                size : theFile.size,
                                lastModifiedDate : theFile.lastModifiedDate
                            }

                            scope.addfile(newFile);
                        };
                    })(f);
                }
            });
        }
    }
});
div[dropzone] {
    border: 2px dashed #bbb;
    border-radius: 5px;
    padding: 25px;
    text-align: center;
    font: 20pt bold;
    color: #bbb;
    margin-bottom: 20px;
}
<div dropzone>Drop Files Here</div>

关于javascript - AngularJS 文件拖放指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712463/

相关文章:

php - Laravel-如何为用户授予多个角色?

javascript - 如何防止 Twitter Bootstrap 在页面宽度扩展时更改边距

javascript - 在 FileUpload 组件中选择文件时在页面上启用按钮

java - Web 应用程序内的路径不是直接链接

javascript - 将数据传递给 D3 函数 - Ext JS 4.2.2

php - HTML5 是否使 Javascript 游戏更安全(更安全)?

javascript - 使用变量动态设置多个对象属性

JavaScript 图像替换

javascript - 如何使用javascript在父div内显示子div而不触发其他div

php - 为什么使用 PHP 上传到 FTP 服务器的图像会损坏?