删除另一个函数中的对象

时间:2012-03-07 05:23:17

标签: javascript jquery html5 object

我正在试图弄清楚这是否可行。首先,我应该说我正在克隆FileReader对象并在整个应用程序中保留它(因此我可以允许用户在正式上传之前删除文件)。

所有这一切都运行正常,但我想要找出允许用户从此克隆对象中删除成员的最佳方法(成员与文件[我的情况下的图像]相同)在普通的FileReader对象中。)

所以基本上我克隆了对象,向它添加pseudoHash,这允许我引用用户想要删除的克隆成员,并在点击“删除”图标时,我搜索我绑定到该图标的关联pseudoHash,在克隆对象中,并删除该成员。如果对象在它自己的函数中,它会正常工作,但事实并非如此。所以我在尝试删除对象的成员时遇到了麻烦。在这种情况下,我将files设为全局,但它仍无效。

        // Our FileList object
        files = e.target.files;
        // Create a clone since FileList is readonly
        files = cloneObject(files);
        // If files isn't empty, give the user the option to remove members
        if (files.length) {
            files = removeSelected(files);
        }

这是我的功能。不幸的是,当我点击从“上传队列”中删除图像时,它应该通过这个函数,但它实际上不会删除对象,因为我知道Javascript不会完全删除对象,所以如果它是最后一个成员,我尝试将其设置为空对象,但这不起作用。如果它不是最后一个成员,我只想在它的位置删除它。同样,因为这是一个单独的函数而不是父函数,它只删除对变量的本地引用。

   // Remove selected file from cloned fileList object
    var removeSelected = function(files) {
    var dataPseudoHash = $(this).attr('data-pseudo-hash');

        $('#js-selected-files').delegate('.js-remove-selected', 'click', function() {

            if (files.length == 1) {
                $('.js-image-upload').attr('disabled', true).addClass('btn_disabled');
                files = {};
                delete files;
            } else {
                // Loop through our files object and if we find a member with the same
                // pseudoHash as the attribute from whatever 'X' icon that was clicked, remove it
                $.each(files, function(i, dataPseudoHash) {
                    if (files[i].pseudoHash == dataPseudoHash) {
                        delete files[i];
                        files.length -= 1;
                    }
                });
            }

            // Remove hidden input that prevents duplicate files being uploaded of
            $('.js-pseudo-hash[value="' + dataPseudoHash + '"]').remove();

            $(this).parent().fadeOut('normal', function() {
                $(this).remove();
            });
        return files;
    };

处理此问题的最佳方法是什么?也许将标志设置为true或false,然后根据具体情况在父函数中相应地删除对象或其成员?不太确定。除此之外,我已经让它上传文件了,但我需要找到如何完全删除对象或对象的属性(如果点击所有“删除”图标)。

1 个答案:

答案 0 :(得分:0)

首先,您应该知道delete运算符只删除对象的数组或元素,而不是整个数组。在你的第一个if条件

if (files.length == 1) {
            $('.js-image-upload').attr('disabled', true).addClass('btn_disabled');
            files = {};
            delete files;
}

您正在删除返回false的整个对象。 现在,如果你能在任何情况下手动检查第二个if条件是否为真,那将会更好。