Инициирование события изменения при вводе файла при вызове из JavaScript (т. Е. Головная боль) - PullRequest
0 голосов
/ 15 марта 2011

Я не знаю, что я делаю не так. Я нашел исправления / хаки для этого, но ни один из них, похоже, не работает. Попытка использовать одну кнопку / изображение (что-то) вместо элемента управления входным файлом. Это работает до сих пор за исключением в Internet Explorer. То есть, появляется диалоговое окно «Выбрать файл», в котором вы можете выбрать файл, соответствующее текстовое поле заполняется, но событие изменения не запускается Я пробовал сосредоточиться, размыть, жить, изменить свойства, изменить, изменить ... но они просто не будут работать. Любая помощь?

JQuery:

      $(function() {
            var a = $('a.#LinkUpload');
            var f = $('input.#file');
            a.click(function() {
                f.click();
            });
            f.change(function() {
                alert('changed!');
            });
        });

HTML:

    <body>
    <form action="">
        <div>
            <a id="LinkUpload">Click Me!</a>
            <input type="file" id="file" name="file" />
        </div>
    </form>
</body>

Ответы [ 4 ]

0 голосов
/ 01 сентября 2011

Это было изменено в новой версии jQuery.Я обновил с 1.4.4 до 1.6.2, и он прекрасно работает без обходного пути.

0 голосов
/ 15 марта 2011

Понял! (Думаю).

$(function() {
    var a = $('#LinkUpload');
    var f = $('#file');
    a.click(function() {
        f.click();
        setTimeout(function() {
            f.val(f.val());
        }, 1);
    });
    if ($.browser.msie && $.browser.version < 9) {
        f.bind('propertychange', function() {
            alert('changed');
        });
    } else {
        f.change(function() {
            alert('changed!');
        });
    }
});

Кажется, работает.

0 голосов
/ 17 июня 2011

Вот немного более чистая реализация файловой части решения Оппдала:

f.bind(($j.browser.msie && $j.browser.version < 9) ? 'propertychange' : 'change',
       function(){ 
           alert('changed!');
       });
0 голосов
/ 15 марта 2011

@ Пойнти сказал это. Если это идентификатор, вам не нужно указывать имя тега, поэтому просто сделайте что-то вроде:

var $a = $('#LinkUpload'),
    $b = $('#file');

Также рекомендуется добавлять $ (знак доллара) в имена переменных при кэшировании объекта jQuery, просто чтобы вы знали, что переменная на самом деле является объектом jQuery.

...