Jquery Chrome文件上传错误:更改事件不会对同一文件执行两次

Jquery Chrome文件上传错误:更改事件不会对同一文件执行两次,jquery,html,google-chrome,file-upload,onchange,Jquery,Html,Google Chrome,File Upload,Onchange,我正在开发这个html5文件上传插件,但它在谷歌Chrome上有一个bug,我无法理解和修复它。它在Firefox上运行良好 问题是你不能从桌面上传同一个文件两次 当您第一次单击、选择并单击“确定”从桌面上载文件时,它会发出一条消息,例如“.button-1”-取决于您单击的上载按钮 如果您再次尝试上载同一个文件,这行代码将不再执行 $(".upload-file",object_parent).change(function() { ...

我正在开发这个html5文件上传插件,但它在谷歌Chrome上有一个bug,我无法理解和修复它。它在Firefox上运行良好

问题是你不能从桌面上传同一个文件两次

当您第一次单击、选择并单击“确定”从桌面上载文件时,它会发出一条消息,例如“.button-1”-取决于您单击的上载按钮

如果您再次尝试上载同一个文件,这行代码将不再执行

$(".upload-file",object_parent).change(function() {

             ...
             ...

             alert($cm.selector);

});
你知道这个插件出了什么问题吗

(function($){

    // Attach this new method to jQuery
    $.fn.extend({ 

        // This is where you write your plugin's name
        upload_file_html5: function(options) {

            // Set the default values, use comma to separate the settings, example:
            var defaults = {
                objectSuperparent:    '.media'
            }

            var options =  $.extend(defaults, options);
            var o = options;

            var $cm = this.click(function(e){

                // <a> button is the object in this case.
                var object = $(this);

                // Get other info from the element belong to this object group.
                var object_href = object.attr('href');
                var object_parent = object.parent();
                alert($cm.selector);

                // Trigger the click event on the element.
                // Due to security policies triggering click on the input type=file is not allowed/supported in some browsers and Opera is one of them.
                //$('input[type=file]').trigger('click'); // or:
                $(".upload-file",object_parent).click();

                return false;

            });

            // Trigger ajax post when ever the file is changed by the user.
            var $cm_2 = $(".upload-file").change(function(){

                // <input> is the object in this case.
                var object = $(this);

                var object_form = object.parent();
                var object_superparent = object.parents(o.objectSuperparent);
                var path_config = $($cm.selector,object_superparent).attr('href');
                var path_post = object_form.attr('action');

                alert($cm.selector);
                //alert(path_config);

                ....
                ....

            });

        }
    });

})(jQuery);

它在Chrome上运行正常,但最近失败了,可能Chrome已经在我的机器上更新了最新版本,这次更新导致了错误?

是的。我的Chrome与Firefox有不同的行为,但我认为Chrome是正确的

根据:

当控件失去输入焦点且自获得焦点后其值已被修改时,将发生onchange事件

如果尝试上载同一文件,则文件输入的值不会更改。尝试将其打印出来:

$('.button-2').click(function(){
    console.log($(".list .upload-file").val())
    return false;
});

如果要上载两次,请清除文件输入值

$('input[type="file"]').val(null);

可能是输入正在重新呈现。不管出于什么原因,这对我来说都无关紧要。 “更改”上的$。回调功能丢失

尝试使用.delegate函数,我绝对喜欢!

好的,所以委托是完全相同的,它只是告诉jquery,如果屏幕上呈现的元素有一个特定的句柄,请将一个功能附加到它

因此,即使元素被重新渲染,它仍将继续工作

$(document).delegate('.file_upload_btn', 'change', function(){});

你可能会认为这是一个一次性功能&说有什么区别,但这为我节省了很多项目时间。

谢谢。那么我不应该使用onchange事件?或者我可以通过任何方式上传相同的文件?谢谢:-请参阅下面的@fundon,了解有效的解决方案是的,我选择了同一个文件,我将删除JSFIDLE链接、objectSuperparent和所有代码。谢谢,我对此非常恼火!