Javascript 模拟放置文件事件

Javascript 模拟放置文件事件,javascript,jquery,html,testing,drag-and-drop,Javascript,Jquery,Html,Testing,Drag And Drop,是否可以仅使用javascript模拟/伪造drop事件?如何测试这类事件 以这个dnd上传示例为例,是否有可能在不实际删除文件的情况下使用文件触发“删除”事件?比如说点击一个按钮 我已经开始写一个脚本,可以控制鼠标和做的把戏,但我正在寻找一个更好的解决方案 编辑 @kol应答是摆脱拖放事件的一个好方法,但我仍然必须手动从计算机中选择一个文件。这就是我对模拟感兴趣的地方。有没有办法通过编程方式创建文件变量 var fileInput = document.getElementById('file

是否可以仅使用javascript模拟/伪造drop事件?如何测试这类事件

以这个dnd上传示例为例,是否有可能在不实际删除文件的情况下使用文件触发“删除”事件?比如说点击一个按钮

我已经开始写一个脚本,可以控制鼠标和做的把戏,但我正在寻找一个更好的解决方案

编辑

@kol应答是摆脱拖放事件的一个好方法,但我仍然必须手动从计算机中选择一个文件。这就是我对模拟感兴趣的地方。有没有办法通过编程方式创建文件变量

var fileInput = document.getElementById('fileInput'),
file = fileInput.files[0];    

1。拖放用户选择的图像

我犯了一个错误。这是你们提到的精简版本,但:

  • 我添加了一个
    标签,可用于从本地计算机选择图像文件,以及
  • 我还添加了一个带有
    onclick
    处理程序的
    标记,该处理程序通过直接调用DND目标
    div
    标记的
    ondrop
    事件处理程序来模拟“drop file”事件
ondrop的处理程序如下所示:

holder.ondrop = function (e) {
    this.className = '';
    e.preventDefault();
    readfiles(e.dataTransfer.files);
}
<div id="holder" class="">
    <p>hello, world</p>
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggkFBTzlUWEwwWTRPSHdBQUFBQkpSVTVFcmtKZ2dnPT0=" width="250">
</div>
也就是说,我们必须将一个参数传递给
ondrop
,它

  • 有一个
    数据传输
    字段和一个
    文件
    数组子字段,其中包含选定的
    文件
    ,以及
  • 有一个
    preventDefault
    方法(没有主体的函数可以)
因此,“Simulate drop”按钮的
onclick
处理程序如下所示:

function simulateDrop() {
    var fileInput = document.getElementById('fileInput'),
        file = fileInput.files[0];        
    holder.ondrop({ 
        dataTransfer: { files: [ file ] }, 
        preventDefault: function () {} 
    });
}
(function () {
    var fileErrorHandler = function (e) {
            var msg = "";
            switch (e.code) {
                case FileError.QUOTA_EXCEEDED_ERR:
                    msg = "QUOTA_EXCEEDED_ERR";
                    break;
                case FileError.NOT_FOUND_ERR:
                    msg = "NOT_FOUND_ERR";
                    break;
                case FileError.SECURITY_ERR:
                    msg = "SECURITY_ERR";
                    break;
                case FileError.INVALID_MODIFICATION_ERR:
                    msg = "INVALID_MODIFICATION_ERR";
                    break;
                case FileError.INVALID_STATE_ERR:
                    msg = "INVALID_STATE_ERR";
                    break;
                default:
                    msg = "Unknown Error";
                    break;
            };
            console.log("Error: " + msg);
        },
        requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem,
        dropFile = function (file) {
            holder.ondrop({ 
                dataTransfer: { files: [ file ] }, 
                preventDefault: function () {} 
            });
        };

    if (!requestFileSystem) {
        console.log("FileSystem API is not supported");
        return;
    }
    requestFileSystem(
        window.TEMPORARY, 
        1024 * 1024, 
        function (fileSystem) {
            var textFile = {
                    name: "test.txt",
                    content: "hello, world",
                    contentType: "text/plain"
                },
                imageFile = {
                    name: "test.png",
                    content: "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
                    contentType: "image/png",
                    contentBytes: function () {
                        var byteCharacters = atob(this.content),
                            byteArrays = [], offset, sliceSize = 512, slice, byteNumbers, i, byteArray;

                        for (offset = 0; offset < byteCharacters.length; offset += sliceSize) {
                            slice = byteCharacters.slice(offset, offset + sliceSize);
                            byteNumbers = new Array(slice.length);
                            for (i = 0; i < slice.length; i++) {
                                byteNumbers[i] = slice.charCodeAt(i);
                            }
                            byteArray = new Uint8Array(byteNumbers);
                            byteArrays.push(byteArray);
                        }
                        return byteArrays;
                    }
                };

            // Create and drop text file
            fileSystem.root.getFile(
                textFile.name, 
                { create: true }, 
                function (fileEntry) {
                    fileEntry.createWriter(
                        function (fileWriter) {
                            fileWriter.onwriteend = function(e) {
                                console.log("Write completed (" + textFile.name + ")");
                                fileSystem.root.getFile(
                                    textFile.name, 
                                    {}, 
                                    function (fileEntry) {
                                        fileEntry.file(
                                            function (file) {
                                                dropFile(file);
                                            }, 
                                            fileErrorHandler
                                        );
                                    }, 
                                    fileErrorHandler
                                );    

                            };
                            fileWriter.onerror = function(e) {
                                console.log("Write failed (" + textFile.name + "): " + e.toString());
                            };
                            fileWriter.write(new Blob([ textFile.content ], { type: textFile.contentType }));
                        }, 
                        fileErrorHandler
                    );
                }, 
                fileErrorHandler
            );

            // Create and drop image file
            fileSystem.root.getFile(
                imageFile.name, 
                { create: true }, 
                function (fileEntry) {
                    fileEntry.createWriter(
                        function (fileWriter) {
                            fileWriter.onwriteend = function(e) {
                                console.log("Write completed (" + imageFile.name + ")");
                                fileSystem.root.getFile(
                                    imageFile.name, 
                                    {}, 
                                    function (fileEntry) {
                                        fileEntry.file(
                                            function (file) {
                                                dropFile(file);
                                            }, 
                                            fileErrorHandler
                                        );
                                    }, 
                                    fileErrorHandler
                                );    

                            };
                            fileWriter.onerror = function(e) {
                                console.log("Write failed (" + imageFile.name + "): " + e.toString());
                            };
                            fileWriter.write(new Blob(imageFile.contentBytes(), { type: imageFile.contentType }));
                        }, 
                        fileErrorHandler
                    );
                }, 
                fileErrorHandler
            );
        }, 
        fileErrorHandler
    );    
})();
测试

  • 选择图像文件(png、jpeg或gif)
  • 点击“模拟下降”按钮
  • 结果

    2。在没有用户交互的情况下删除自动生成的测试文件()

    我又做了一个。加载页面时,将调用一个函数,该函数:

    • 在临时文件系统中创建文本文件,并
    • 将此文本文件加载并放入目标
      ;然后
    • 在临时文件系统中创建图像文件,以及
    • 将此图像文件加载并放入目标
    此drop simulator函数调用的代码如下:

    function simulateDrop() {
        var fileInput = document.getElementById('fileInput'),
            file = fileInput.files[0];        
        holder.ondrop({ 
            dataTransfer: { files: [ file ] }, 
            preventDefault: function () {} 
        });
    }
    
    (function () {
        var fileErrorHandler = function (e) {
                var msg = "";
                switch (e.code) {
                    case FileError.QUOTA_EXCEEDED_ERR:
                        msg = "QUOTA_EXCEEDED_ERR";
                        break;
                    case FileError.NOT_FOUND_ERR:
                        msg = "NOT_FOUND_ERR";
                        break;
                    case FileError.SECURITY_ERR:
                        msg = "SECURITY_ERR";
                        break;
                    case FileError.INVALID_MODIFICATION_ERR:
                        msg = "INVALID_MODIFICATION_ERR";
                        break;
                    case FileError.INVALID_STATE_ERR:
                        msg = "INVALID_STATE_ERR";
                        break;
                    default:
                        msg = "Unknown Error";
                        break;
                };
                console.log("Error: " + msg);
            },
            requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem,
            dropFile = function (file) {
                holder.ondrop({ 
                    dataTransfer: { files: [ file ] }, 
                    preventDefault: function () {} 
                });
            };
    
        if (!requestFileSystem) {
            console.log("FileSystem API is not supported");
            return;
        }
        requestFileSystem(
            window.TEMPORARY, 
            1024 * 1024, 
            function (fileSystem) {
                var textFile = {
                        name: "test.txt",
                        content: "hello, world",
                        contentType: "text/plain"
                    },
                    imageFile = {
                        name: "test.png",
                        content: "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
                        contentType: "image/png",
                        contentBytes: function () {
                            var byteCharacters = atob(this.content),
                                byteArrays = [], offset, sliceSize = 512, slice, byteNumbers, i, byteArray;
    
                            for (offset = 0; offset < byteCharacters.length; offset += sliceSize) {
                                slice = byteCharacters.slice(offset, offset + sliceSize);
                                byteNumbers = new Array(slice.length);
                                for (i = 0; i < slice.length; i++) {
                                    byteNumbers[i] = slice.charCodeAt(i);
                                }
                                byteArray = new Uint8Array(byteNumbers);
                                byteArrays.push(byteArray);
                            }
                            return byteArrays;
                        }
                    };
    
                // Create and drop text file
                fileSystem.root.getFile(
                    textFile.name, 
                    { create: true }, 
                    function (fileEntry) {
                        fileEntry.createWriter(
                            function (fileWriter) {
                                fileWriter.onwriteend = function(e) {
                                    console.log("Write completed (" + textFile.name + ")");
                                    fileSystem.root.getFile(
                                        textFile.name, 
                                        {}, 
                                        function (fileEntry) {
                                            fileEntry.file(
                                                function (file) {
                                                    dropFile(file);
                                                }, 
                                                fileErrorHandler
                                            );
                                        }, 
                                        fileErrorHandler
                                    );    
    
                                };
                                fileWriter.onerror = function(e) {
                                    console.log("Write failed (" + textFile.name + "): " + e.toString());
                                };
                                fileWriter.write(new Blob([ textFile.content ], { type: textFile.contentType }));
                            }, 
                            fileErrorHandler
                        );
                    }, 
                    fileErrorHandler
                );
    
                // Create and drop image file
                fileSystem.root.getFile(
                    imageFile.name, 
                    { create: true }, 
                    function (fileEntry) {
                        fileEntry.createWriter(
                            function (fileWriter) {
                                fileWriter.onwriteend = function(e) {
                                    console.log("Write completed (" + imageFile.name + ")");
                                    fileSystem.root.getFile(
                                        imageFile.name, 
                                        {}, 
                                        function (fileEntry) {
                                            fileEntry.file(
                                                function (file) {
                                                    dropFile(file);
                                                }, 
                                                fileErrorHandler
                                            );
                                        }, 
                                        fileErrorHandler
                                    );    
    
                                };
                                fileWriter.onerror = function(e) {
                                    console.log("Write failed (" + imageFile.name + "): " + e.toString());
                                };
                                fileWriter.write(new Blob(imageFile.contentBytes(), { type: imageFile.contentType }));
                            }, 
                            fileErrorHandler
                        );
                    }, 
                    fileErrorHandler
                );
            }, 
            fileErrorHandler
        );    
    })();
    
    请注意,加载后,出于调试目的,可以列出自动生成的文件:

    结果

    屏幕截图显示,模拟拖放在自动生成的图像之前插入了自动生成的文本文件的内容。DND目标的HTML代码如下所示:

    holder.ondrop = function (e) {
        this.className = '';
        e.preventDefault();
        readfiles(e.dataTransfer.files);
    }
    
    <div id="holder" class="">
        <p>hello, world</p>
        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggkFBTzlUWEwwWTRPSHdBQUFBQkpSVTVFcmtKZ2dnPT0=" width="250">
    </div>
    
    
    你好,世界

    @kol答案是摆脱拖放事件的好方法,但我 仍然必须手动从我的计算机中选择一个文件。这是一点 我对模拟感兴趣。有没有办法创建一个文件 可编程变量-caiocpricci2

    试试这个

    function createFile() {
      var create = ["<!doctype html><div>file</div>"];
      var blob = new Blob([create], {"type" : "text/html"});
      return ( blob.size > 0 ? blob : "file creation error" )
    };
    createFile()
    
    函数createFile(){
    var create=[“文件”];
    var blob=new blob([create],{“type”:“text/html”});
    返回(blob.size>0?blob:“文件创建错误”)
    };
    createFile()
    
    谢谢你的回答,我不知道我们能做到。这不是我所需要的,但这应该是我问题的一部分。如果我们没有得到编辑的另一个答案,我会给你奖金!“那不是我需要的”-你到底需要什么?这不是唯一可能的解决办法。例如,(1)如果您删除动态生成的图像,或者该图像已经是页面的一部分,则可以省略“文件选择器”(file chooser),或者(2)“simulate drop”(模拟删除)按钮可以是浏览器扩展的一部分。我需要删除用户交互。生成一个“file”变量,该变量从我的系统中获取另一个文件,并可以在类似于示例fiddle的元素中“拖放”。不一定只有图像,但如果我们只能做图像,这已经足够了。作为最后一步,最好知道是否有办法从系统或服务器中选择这些文件。谢谢你的回答,这对我来说很有效。嗨,这里是@kol,我正在尝试做类似的事情,但是在Twitter的“newtweet”字段中。请您检查一下这个主题--我没有在这个主题中显示,但是我尝试的拖放代码是这样的-您的代码中的文件阅读器(
    processFile
    )部分不是必需的<代码>创建文件是您所需要的全部。