【问题标题】:Ajax post array: Uncaught TypeError: Illegal invocationAjax 发布数组:未捕获的类型错误:非法调用
【发布时间】:2014-06-24 05:14:59
【问题描述】:

我正在尝试将 json 数组发送到 upload.php 文件。弹出如下错误:

未捕获的类型错误:非法调用

我也尝试添加processData: false,但是没有任何内容发布到upload.php。

我的代码:http://jsfiddle.net/r0330537/86yqj/

HTML

<div id="dropzone" class="dropzone">
    Drop uw bestanden en/of zip hier
</div>

JQUERY

$( document ).ready( function() {
    ...
    function drop(event) {
        //console.log( "drop", event );
        event.stopPropagation();
        event.preventDefault();
        $(this).removeClass("dragging");

        var data = event.dataTransfer,
            fileList = data.files,
            file = new Array();

        for(i = 0; i < fileList.length; i++) {
            file.push( fileList[i] );
        }

        console.log( file );
        // ajax
        $.ajax({    
            type : "POST",
            url : "ajax/upload.php",
            dataType : "json",
            data : { "file": file },
            succes : function(data) {
                console.log(data);
            }
        });
    }

    var dropzone = $( ".dropzone" ).get(0);
    ...
    dropzone.addEventListener( "drop", drop, false );
});

【问题讨论】:

    标签: php jquery ajax arrays json


    【解决方案1】:

    你需要将你的事件监听器包装成这样的函数

     var dropzone = $( ".dropzone" ).get(0);
        dropzone.addEventListener( "dragenter", function(){dragEnter(event)}, false );
        dropzone.addEventListener( "dragexit", function(){dragExit(event)}, false );
        dropzone.addEventListener( "dragover", function(){dragOver(event)}, false );
        dropzone.addEventListener( "drop", function(){drop(event)}, false );
    });
    

    编辑:您在这里遗漏了很多代码,并且有更好的方法来执行此方法

    尽管您需要序列化文件数组才能完成这项工作,但这是对您的代码的最终编辑

       $( document ).ready( function() {
        console.log( "ready!" );
    
        function dragEnter(event) {
            event.stopPropagation();
            event.preventDefault();
            $(this).addClass("dragging");
        }
        function dragExit(event) {
            event.stopPropagation();
            event.preventDefault();
            $(this).removeClass("dragging");
        }
        function dragOver(event) {
            event.stopPropagation();
            event.preventDefault();
            $(this).addClass("dragging");
        }
    
        function drop(event) {
            //console.log( "drop", event );
            event.stopPropagation();
            event.preventDefault();
            $(this).removeClass("dragging");
    
            var data = event.dataTransfer,
                fileList = data.files,
                file = new Array();
    
            for(i = 0; i < fileList.length; i++) {
                file.push( fileList[i] );
            }
            file = JSON.stringify( file);
            console.log( file );
            // ajax
            $.ajax({    
                type : "POST",
                url : "ajax/upload.php",
                dataType : "json",
                data : { "file": file },
                succes : function(data) {
                    console.log(data);
                }
            });
        }
    
        var dropzone = $( ".dropzone" ).get(0);
        dropzone.addEventListener( "dragenter", function(){dragEnter(event)}, false );
        dropzone.addEventListener( "dragexit", function(){dragExit(event)}, false );
        dropzone.addEventListener( "dragover", function(){dragOver(event)}, false );
        dropzone.addEventListener( "drop", function(){drop(event)}, false );
    });
    

    您可以查看here
    当然它会发布到所需的 url,它不在 jsfiddler :)

    【讨论】:

    • 我相信这不是您所写的需要。你能解释为什么它是需要吗? -1
    • 我试过这样做,但它忽略了 event.stopPropagation(); event.preventDefault();
    • 您的编辑错误。没有全局event。我想你想做类似function(ev){dragEnter(ev)}
    • 亲爱的卢克,就像你做的那样 -1 没有讨论你可以搜索你自己为什么需要这个,并为@Miaw 检查更新
    • 没有讨论?我的第一条评论是什么?这不是讨论的尝试吗?
    【解决方案2】:

    首先,在这里发布您的代码...至少是一个 sn-p。

    您将 File 对象放入 ajax 选项数组的 data 键中。这可能会导致序列化数据时出现问题。放入您需要的 data 仅键数据

    顺便说一句,仅使用 xhr 上传是可能的,但不幸的是,您不能像在示例中那样进行上传...

    请看这个答案...jQuery Ajax File Upload

    【讨论】:

    • 我可以这样做,但它最终仍然是一个数组。下次我会尽量记住放一个sn-p :)
    • 您可以立即编辑您的问题并添加一个 sn-p。否则这个问题就不是应该的了。这将确保 StackOverflow 保持与现在一样的质量。谢谢!
    • 问题是现在我似乎无法检索到 url op 删除的文件。我试过查看 FileReader api,但我不知道如何获取 url。你知道怎么做吗?
    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2011-05-15
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多