Подтвердить что ты не робот

JQuery Несколько динамических форм для нескольких динамических iFrames

Я создаю многофайловую загрузку. В процессе проверки, когда я создаю список файлов (перед их отправкой), первый динамически созданный <form> будет отправлять и работать как ожидалось, но другой динамически созданный <form> не будет. Это не работает в IE7 + или FireFox...

Также следует отметить, что этот код находится в SharePoint 2007, если есть какие-либо ограничения, о которых можно указать! Спасибо!

Использовать случай

  • Пользователь нажимает на просмотр и выбор файла...
  • Элемент управления <input type="file" /> скрыт.
  • jQuery обертывает <form> вокруг <input type="file" /> и добавляет новый <iframe>, который форма ссылается на target для ответа и отправляет форму.
  • На стороне сервера я запустил некоторую проверку и отправку имени, размера и опции для удаления.
  • В <iframe> (ответе) пользователь видит что-то вроде Winter.jpg | 10 KB | (x) удалить
  • jQuery clone() элемент управления <input type="file" class="uploader" /> и append() к <div> в случае, если пользователь хочет загрузить больше.
  • Примечание: помните, что clone(), <form> и <iframe> получают уникальные идентификаторы для id, name и target соответственно. Файл .ashx был протестирован и работает. Я смущен, почему я не могу продолжать создавать новые <form> s, <input type="file"/> и <iframe> и добавлять в список...

HTML

<div id="files">
    <div class="field">
        <input id="file" type="file" name="file" class="uploader" value="Browse..." />
    </div>
</div>

Javascript
К сожалению, код может быть немного неряшливым - пробная версия и ошибка здесь...

<script type="text/javascript">
    $('.uploader').live('change', function(){
        var $clone = $(this).parent().clone();
        var filename = $(this).val().substring($(this).val().lastIndexOf('\\')+1);

        //var $form = $('<form id="uploadForm" action="_layouts/GetFileInfo.ashx" method="post" target="fileinfo" enctype="multipart/form-data">');
        var $form = $('<form>').attr('id', 'uploadForm').attr('action', '_layouts/GetFileInfo.ashx').attr('method', 'post').attr('target', 'fileinfo').attr('enctype', 'multipart/form-data');
        var $result = $('<iframe name="fileinfo' + _uploadId + '" src="upload.html" frameBorder="0" allowtransparency="true" style="width: 250px; height: 25px; border:0;">');

        $form[0].id += _uploadId;
        $form[0].target += _uploadId;
        $clone.find('input')[0].id += _uploadId;
        $clone.find('input')[0].name += _uploadId;

        //remove button
        $('<div class="remove" style="float:right;">').html("x").appendTo($(this).parent());

        //append the goodness           
        $(this).parent().append($result);
        $(this).wrap($form);

        //let the form render and submit
        window.setTimeout(function(){
            $('#files form').last().submit();
        }, 1000);

        $(this).hide();

        $clone.find('input').val('');

        $(this).parents('#files').append($clone);

        _uploadId++;
    });
</script>

Я подумал, что вы, ребята, можете спросить, вот здесь выведенный HTML...

Выделенный HTML

<div style="float: left;" class="col" id="files">
    <div class="field">
        <form id="uploadForm0" action="_layouts/GetFileInfo.ashx" method="post" target="fileinfo0" enctype="multipart/form-data">
            <input type="file" value="Browse..." class="uploader" name="file" id="file" style="display: none;">
        </form>
        <div style="float: right;" class="remove">x</div>
        <iframe frameborder="0" style="width: 250px; height: 25px; border: 0pt none;" allowtransparency="true" src="upload.html" name="fileinfo0"></iframe>
    </div>
    <div class="field">
        <form id="uploadForm1" action="_layouts/GetFileInfo.ashx" method="post" target="fileinfo1" enctype="multipart/form-data">
            <input type="file" value="Browse..." class="uploader" name="file0" id="file0" style="display: none;">
        </form>
        <div style="float: right;" class="remove">x</div>
        <iframe frameborder="0" style="width: 250px; height: 25px; border: 0pt none;" allowtransparency="true" src="upload.html" name="fileinfo1"></iframe>
    </div>
    <div class="field">
       <input type="file" value="Browse..." class="uploader" name="file01" id="file01">
    </div>
</div>
4b9b3361

Ответ 1

Все, этот вопрос по-прежнему остается, но я внедрил jQuery Forms (который также работает с многоформатными формами с использованием iframes), изменил дизайн a бит, и он работает.

Если бы мне пришлось догадаться, я думаю, что проблема возникла где-то при создании <form>, <input type="file" /> и других элементов на лету в JS. Это было так, как если бы у SharePoint было правило или слушатель, который не учитывал событие формы submit() и return false;, не позволяя ему перейти к обработчику ASHX...

Я использую тот же HTML выше, только теперь JavaScript использует один элемент управления <input type="file /> и <form>. Я добавляю результат через $.ajaxSubmit({success: function(result)}).

Я все еще clone() входы и добавлю их к результату. Когда пользователь выбирает загрузку изображений, я просто создаю объект <form> в JS и также использую $.ajaxSubmit.

Я перебираю через context.Request.Files в С# и присоединяю их к связанному ListItem в SharePoint 2007.

Cheers,
Бобби

Ответ 2

Попробуйте передать true методу clone(). Это связывает данные и события.

Источник: jQuery

Ответ 3

По словам меня, используйте функцию клонирования jQuery, которая может решить вашу проблему, вот ссылка http://api.jquery.com/clone/