Скрипт загрузки работает с jQuery v1.3.2, но не с 1.6.2

Я хотел бы использовать этот скрипт для загрузки нескольких файлов с помощью jQuery v1.6.2. Он хорошо работает с любой версией =‹ 1.3.2, но не с 1.4.x или новее.

Не могли бы вы помочь мне заставить его работать с 1.6.2?

когда я выбираю 3 файла для загрузки, я удаляю первый; все поля ввода 2-го и 3-го файла тоже были удалены. :(

(В jQuery v1.3.2 2-й и 3-й не удаляются.)

HTML:

<input type="file" class="upload" name="fileX[]" />
<div id="queue" class="queue"></div>

JavaScript:

$(document).ready(function () {

    $("input.upload").change(function () {
        validateFile(this);
    });


    function validateFile(myelement) {

        //$(myelement).hide();//disabled to test

        $(myelement).parent().prepend('<input type="file" class="upload" name="fileX[]" />').find("input").change(function () {
            validateFile(this)
        });
        var elementval = myelement.value;
        if (elementval != '') {
            $("#queue").append('<div>' + elementval + '&nbsp;&nbsp;<a class="remove">X</a></div>').find("a").live('click', function () {
                $(this).parent().remove();
                $(myelement).remove();
                return true;
            });
        }
    };

});

person pobela76    schedule 20.07.2011    source источник
comment
Попробуйте заменить .live() на .bind()?   -  person Zomxilla    schedule 20.07.2011
comment
jQuery не серьезно относится к поддержанию обратной совместимости между выпусками. Ваши варианты в основном переносят код на последнюю версию или продолжают использовать более старую версию.   -  person aroth    schedule 20.07.2011
comment
Я пробовал .live() и .blind(), но все равно не работает. я хотел бы портировать его на последнюю версию (1.6.2) потому что у меня есть другие скрипты, которые не работают с 1.3.2   -  person pobela76    schedule 20.07.2011
comment
Можете ли вы дать нам сообщение об ошибке из консоли браузера? Это может иметь какое-то отношение к .value по сравнению с .val().   -  person nren    schedule 20.07.2011
comment
я пробовал var elementval = $(myelement).val(); и var elementval = myelement.val(); но я все еще получил тот же результат. в консоли браузера нет сообщения об ошибке.   -  person pobela76    schedule 20.07.2011
comment
попробуйте на jsfiddle.net/NkS5R . Я не уверен, какие части не работают   -  person Emil    schedule 20.07.2011


Ответы (1)


Я до сих пор не могу понять, почему он удаляет все входы. Я могу только представить, что это связано с привязкой переменной myelement к событию живого клика. Мы повторно используем эту переменную каждый раз, когда вызывается функция изменения ввода, и я не уверен, как jQuery обрабатывает это с этими <a> событиями щелчка. Думаю, покопаюсь.

Однако я придумал обходной путь.

Вместо того, чтобы хранить элемент внутри живого события, привязанного к <a>, я дал ввод и очередь div data-id. Поэтому, когда нажимается #queue a, он сопоставляет ввод со своим собственным идентификатором данных:

$(document).ready(function () {
    var count = 0;
    $('input.upload').live('change', function() {
        $(this).parent().prepend('<input type="file" class="upload" name="fileX[]" />');
        $(this).attr('data-id', count);
        $('#queue').append('<div data-id="' + count + '">' + $(this).val() + '&nbsp;&nbsp;<a class="remove">X</a></div>');
        count++;
    });
    $('#queue div a').live('click', function() {
        $('input[data-id="' + $(this).parent().attr('data-id') + '"]').remove()
        $(this).parent().remove();
    });
});         
person nren    schedule 20.07.2011
comment
Вы спасаете мой день, ваш обходной путь работает. Большое тебе спасибо! - person pobela76; 20.07.2011