当动态创建文件输入时,jQuery文件上载无效

And*_*mes 6 html javascript jquery file-upload blueimp

我正在使用这个jquery上传器(http://blueimp.github.io/jQuery-File-Upload/basic.html),当文件输入放在网站的原始代码中时,它工作正常,但我动态追加使用jquery的字段,它不起作用.这是触发上传的jquery:

$('.fileupload').fileupload({
    dataType: 'json',
    done: function (e, data) {
        $.each(data.result.files, function (index, file) {
            alert(file.name);
            //$('<p/>').text(file.name).appendTo(document.body);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

这就是应该触发上传的内容:

<input class="fileupload" type="file" name="files[]" data-url="uploads/">
Run Code Online (Sandbox Code Playgroud)

这是jquery附加的代码:

$(document).on('click','.addItem', function(){
            $('<!--ROW START-->\
                <form class="widget-content item" data-url="uploads/">\
                    <div class="row">\
                        <div class="col-md-3"><input type="text" class="form-control" name="itemName[]"></div>\
                        <div class="col-md-3"><textarea class="auto form-control" name="itemDescription[]" cols="20" rows="1" style="word-wrap: break-word; resize: vertical;"></textarea></div>\
                        <div class="col-md-3"><textarea class="auto form-control" name="itemCondition[]" cols="20" rows="1" style="word-wrap: break-word; resize: vertical;"></textarea></div>\
                        <input type="hidden" class="itemId" name="itemId[]" value="">\
                        <input type="hidden" name="itemInventoryId[]" value="<?=$_GET["inventory_id"]?>">\
                        <input type="hidden" name="itemParent[]" value="'+$(this).closest('.formHolder').data('parent-room')+'">\
                        <div class="col-md-2">\
                            <div class="fileinput-holder input-group">\
                                <input class="fileupload" type="file" name="files[]">\
                            </div>\
                        </div>\
                        <div class="col-md-1 align-center"><i class="save icon-ok large"> </i>&nbsp;&nbsp;&nbsp;<i class="delete icon-trash large"> </i></div>\
                    </div>\
                </form>\
            <!--/ROW END-->').fadeIn(500).appendTo($(this).parents().siblings('.items'));
            $(this).parent().parent().siblings('.widget-header, .header-margin, .hide').removeClass('hide').fadeIn();
        });
Run Code Online (Sandbox Code Playgroud)

就像我说的,当我把它添加到实际的代码中,而不是动态它的罚款.有人可以帮忙吗?

Mic*_*bak 18

这是因为fileupload在添加元素之前绑定事件.

尝试将代码移动到回调函数中,该函数将在创建输入元素后执行.由于appendTo() 不支持回调,您可以使用each(callback):

$('code_that_you_append').appendTo('some_element').each(function () {
    // here goes $('.fileupload').fileupload({ ... }) function
});
Run Code Online (Sandbox Code Playgroud)

如果需要将事件绑定到.fileupload代码中的多个位置,则可以创建一个函数来避免代码重复,如下所示:

function bindFileUpload() {
    $('.fileupload').fileupload({
        dataType: 'json',
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                alert(file.name);
            });
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

然后在回调中调用它,就像之前一样:

$('code_that_you_append').appendTo('some_element').each(function () {
    bindFileUpload();
});
Run Code Online (Sandbox Code Playgroud)

我创建了一个小演示.它绑定click而不是fileupload简化事物(fileupload是外部插件......),但一般规则保持不变.