首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Chrome文件上传错误: on change事件不会对同一文件执行两次

Chrome文件上传错误: on change事件不会对同一文件执行两次
EN

Stack Overflow用户
提问于 2012-02-06 11:01:18
回答 3查看 14.7K关注 0票数 24

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

jsfiddle link

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

当你第一次点击,选择,并点击确定从你的桌面上传一个文件,它应该提醒一条消息,例如'.button-1‘-取决于你点击的上传按钮。

然后,如果您再次尝试上传相同的文件,这行代码将不会再执行。

代码语言:javascript
复制
$(".upload-file",object_parent).change(function() {

             ...
             ...

             alert($cm.selector);

});

你知道这个插件出了什么问题吗?

代码语言:javascript
复制
(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更新了我的机器的最新版本,这个更新导致了错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-06 15:18:09

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

根据W3C's document的说法

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

onchange事件

如果您尝试上载相同的文件,则文件输入的值不会更改。试着把它打印出来:

代码语言:javascript
复制
$('.button-2').click(function(){
    console.log($(".list .upload-file").val())
    return false;
});
票数 18
EN

Stack Overflow用户

发布于 2012-07-01 17:20:34

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

代码语言:javascript
复制
$('input[type="file"]').val(null);

jsfiddle test

票数 50
EN

Stack Overflow用户

发布于 2017-01-01 21:34:08

可能是输入正在被重新呈现。无论出于什么原因,这对我来说都是无关紧要的。$.on('change',callback)功能丢失。

尝试使用我非常喜欢的.delegate函数!http://api.jquery.com/delegate/

委托是完全一样的,它只是告诉jquery,如果有一个元素呈现在屏幕上,用一个特定的句柄,附加一个功能。

因此,即使重新呈现该元素,它仍将保持功能。

代码语言:javascript
复制
$(document).delegate('.file_upload_btn', 'change', function(){});

您可能认为这是一个丢弃的函数&说有什么不同,但这为我节省了大量的项目时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9155136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档