2010-02-01 2 views
4

У меня есть страница, которая загружает форму HTML через запрос $ .ajax.Загрузка файла jQuery после загрузки страницы

Форма имеет возможность загрузки файлов. Я попробовал несколько плагинов загрузки Ajax, и все они требуют от меня создать экземпляр некоторого объекта типа ajaxUpload(), который внутренне создает прослушиватель кликов. Однако эти прослушиватели не запускаются, потому что динамически загруженная форма не доступна DOM.

Чтобы обойти такие вещи в прошлом, я использовал live() для прослушивания. Но я не могу объявить эти экземпляры ajaxUpload в качестве живого события. Итак, как я могу заставить эту кнопку загрузки функционировать?

ответ

0

Я решил эту проблему, используя другой модуль для добавления https://github.com/valums/file-uploader

, который позволяет мне вызвать функцию для создания загрузчиком из элемента DOM в любое желаемое время. Поэтому я могу вызвать функцию только тогда, когда мне нужен загрузчик. Таким образом, мне не нужно полагаться на живые события.

1

Кажется, я откуда-то вспоминаю, что плагин livequery может обрабатывать такие вещи. В своем стремлении к истине, я наткнулся на это:

Issue with binding in jQuery for copied elements

+0

LiveQuery не работает в jquery 1.4, который мне нужен. Спасибо хоть. Сейчас я экспериментирую с live(). – Jono

0

Не могли бы вы добавить динамически загруженный формы документа? (затем экземпляр объекта ajaxUpload «после», форма добавляется в документ)

+0

Я делаю именно это, и он не работает. Это связано с тем, что когда я добавляю форму, она не привязывается к DOM. Поэтому, даже если я объявляю объект после его загрузки, он не может проанализировать этот раздел DOM. – Jono

1

AJAX не может загружать файл. jQuery form plugins, используя скрытую технику iframe для загрузки файла. Чтобы выполнить реальную загрузку AJAX, вы можете использовать загрузчик на основе Flash. Я рекомендовал вам попробовать uploadify.

+0

AJAX может загружать в iframe, который подходит для моих целей. Я попытался загрузить и swfupload, и они всегда дают мне проблемы. И я бы предпочел не заниматься вспышкой. – Jono

+0

+1 Uploadify является фантастическим для проекта, который я делаю! ty :) – balexandre

+0

Вспышка также не является технически AJAX (или AJAJ). Все новейшие браузеры, кроме IE, поддерживают загрузку файлов с помощью XHR. Плагин формы JQuery от Malsup использует XHR для отправки файла в более новые браузеры и ухудшает трюк iframe в старых браузерах и IE. Я не использовал другие решения, но плагин malsup отлично работает для меня до сих пор! – wprl

0

Вот лучшее, что я был в состоянии сделать до сих пор:

$('#uploadButton').live('click', function(){     
    new AjaxUpload('uploadButton', { 
     action: 'upload-handler.php', 
     onComplete: function(file, response){ 
     alert(response); 
     }); 
}); 

живой() работает, но это только конкретизирует объект после щелчка. Поэтому мне нужно снова щелкнуть его, чтобы триггер загрузки работал.

Так что я пытался каким-то образом удалить дополнительный клик. Я надеялся, что следующий будет работать в конце функции, но она не имеет:

$(this).trigger("click"); 
+1

См. Мой ответ. Почему бы не сделать это не в обработчике кликов, а в обратном вызове после завершения запроса ajax для формы? – lawrence

1

Что вы имеете в виду форма не доступна в DOM когда вы запрашиваете его с помощью AJAX? Почему бы и нет?

$.get(url_that_has_form, null, function(resp) { 
    $('#some_container').html(resp); 
    // Now the form is part of the document. 
    // Run your ajax upload stuff here. 
    new AjaxUpload('#id_of_form_you_just_added', options); 
}, 'html'); 
+0

Это не сработает. Загрузка HTML не добавляет его в DOM в jQuery. Это цель live(). – Jono

+0

Вы ошибаетесь. Загрузка HTML не автоматически * добавляет его в DOM; поэтому я * явно * добавляю его с вызовом .html(). Вы также можете использовать append() или любые другие связанные методы. Цель live() заключается в том, что вы можете настроить обработчики событий * до * выборки. – lawrence

0

@ lawrence Спасибо, я столкнулся с той же проблемой, после загрузки html в качестве части формы, элементов загрузки конгруэнтов, мне нужно дважды щелкнуть. Хотя я пробовал много методов, чтобы перекрыть дескриптор щелчка после загрузки html, но не удалось.

В конце страницы я прочитал это $ (this) .trigger ("click"); и я меняю его в соответствии со мной и место в конце вызова ajax, и он работает. jQuery ("# ​​upload"). Trigger ("click"); Ура ... Спасибо каждому телу.

Смежные вопросы