【问题标题】:jQuery File Upload not working when file input dynamically created动态创建文件输入时,jQuery文件上传不起作用
【发布时间】:2013-10-19 16:07:37
【问题描述】:

我正在使用这个 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);
        });
    }
});

这就是应该触发上传的原因:

<input class="fileupload" type="file" name="files[]" data-url="uploads/">

这是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();
        });

就像我说的,当我将它添加到实际代码中时,而不是动态地它很好。有人可以帮忙吗?

【问题讨论】:

  • 通常在输入元素附加到正文之前调用 $.fileUpload 时会发生这种情况。尝试在创建和附加元素后调用它。
  • 我已经在文档底部弹出了它,没有运气:(
  • 我添加了附加的代码,所以你可以看到

标签: javascript jquery html file-upload blueimp


【解决方案1】:

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

尝试将您的代码移动到回调函数中,该函数将在您创建输入元素后执行。由于appendTo()doesn't support callback,你可以使用each(callback)

$('code_that_you_append').appendTo('some_element').each(function () {
    // here goes $('.fileupload').fileupload({ ... }) function
});

如果你需要在代码中多处绑定事件到.fileupload,你可以创建一个函数来避免代码重复,像这样:

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

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

$('code_that_you_append').appendTo('some_element').each(function () {
    bindFileUpload();
});

我创建了一个little demo。它绑定click 而不是fileupload 以简化事情(fileupload 是外部插件...),但一般规则保持不变。

【讨论】:

  • 你可以发布示例吗?
  • 已添加。如果您可以发布用于附加表单的 jQuery 代码,我就能使我的示例更加精确。
  • 所以它需要使用我附加的代码吗?我要添加多个项目,这是最佳做法吗?
  • 代码已添加:)
  • 我已经更新了我的答案,以展示如何避免代码重复,以防您需要在多个地方绑定此事件。
【解决方案2】:

您需要使用 jQuery live() 函数。

我发现这个技巧对我有用。

jQuery fileupload for dynamically added input field

【讨论】:

  • 如果您无法使用此解决方案,请参阅此答案:stackoverflow.com/questions/5540561/… 我必须替换我的 "$('.class').on('click, function(e){ " 包装器 "$(document).on('click', '.class', function(e){" 以便检查每个点击事件。
【解决方案3】:

首先将上传函数与静态标识符绑定。这里,'document' 是静态标识符。您可以使用类似这样的尚未动态添加的任何内容。通常,文档的使用频率更高。

$(document).on('click', '.fileupload', function () {
    $('.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);
            });
        }
    });
});

【讨论】:

  • 这个问题已经超过 3 年了,接受的答案很好
【解决方案4】:

注意:请先查看已接受的答案。

我认为接受的答案几乎没有错误。我只是想恢复它。 在@Michał Rybak little demo 上,您会看到每次我们点击add item 时,另一个点击事件也将添加到先前添加的new link(添加更多然后new link 并首先查看new link 显示警报时间数@ 987654327@)。因为每次它添加new link 时,我们都会再次向所有new link 元素添加点击事件。

 $('<p><a href="#" class="link">new link</a></p>').appendTo('body').each(function () {
      // bindClickToLink call every 'new link' and add click event on it
        bindClickToLink();
    });  

为了解决这个问题,改为将点击事件添加到我们刚刚添加到新创建项目的所有项目。这是我的解决方案my demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多