Фиксим jquery плагин ajaxfileupload

Плагин служит для загрузки файлов на сервер. Плагин очень старый и давно не поддерживается разработчиками. Но так случилось что я использую это плагин очень давно, и по мере надобности приходилось его фиксить и расширять. Сейчас я использую чаще плагин от разработчиков mail — FileApi, но иногда все же использую ajaxfileupload, его преимущество что он содержит мало кода и следовательно мало весит и быстро загружается.

  1. В функции createUploadForm строчку
    var newElement = $(oldElement).clone();
    

    заменяем на

    var newElement = $(oldElement).clone(true); /* fix 1 */
    

    Это делаем для того чтобы не терять навешанные события на нашем элементе — input[type=’file’]

  2. В функции createUploadForm строчку
    $(oldElement).attr('id', fileId);
    

    заменяем на

    $(oldElement).attr('id', fileId)
        .removeAttr("class"); /* fix 2 */
    

    Это делаем для того чтобы старый элемент больше не участвовал в поиске по селекторам

  3. В функции ajaxFileUpload
    xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
    

    заменяем на

    xml.responseText = ""; /* fix 3 */
    if (io.contentWindow.document.body) {
        if (io.contentWindow.document.getElementsByTagName("pre").length) {
            xml.responseText = io.contentWindow.document.getElementsByTagName("pre")
    [0].innerHTML.replace(/^"/, "").replace(/"$/, "");
        } else {
            xml.responseText = io.contentWindow.document.body.innerHTML;
        }
    }
    

    Содержимое полученное в ответе, браузеры оборачивают в тег pre, поэтому избавляемся от этого.

  4. В функции ajaxFileUpload строчку
    xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
    

    заменяем на

    xml.responseText = io.contentDocument.document.getElementsByTagName("pre")[0].innerHTML; /* fix 4 */
    

    Причина такая же как и для фикса 3

  5. В функции ajaxFileUpload строчку
    jQuery.handleError(s, xml, status, e);
    

    заменяем на

    if (s.error) /* fix 5*/
        s.error(xml, status);
    

    В новых версиях jquery нет функции jQuery.handleError

  6. В функции uploadHttpData строчку
    eval( "data = " + data );
    

    заменяем на

    eval("data = " + data.match(/\{[\s\S]*\}/)[0].replace(/&lt;/g, '<').replace(/&gt;/g, '>')); /* fix 6 */
    

    Причина такая же как и для фикса 3

  7. После строчки
    var form = $('#' + formId);
    

    Добавляем

    var query_string_part = 'ajaxFileUpload=1'; /* ext 1 */
    if (s.data !== undefined) {
        if (typeof s.data == 'string') {
            query_string_part += '&' + s.data;
        }
        else {
            for (var key in s.data) {
                query_string_part += '&' + key + '=' + s.data[key]
            }
        }
    }
    if (s.url.indexOf('?') != -1) {
        s.url += '&';
    }
    else {
        s.url += '?';
    }
    s.url += query_string_part;
    

    На сервер отсылаем параметр ajaxFileUpload, для того чтобы определить что данный запрос пришел от данного плагина.
    Так же отсылаем на сервер дополнительные данные — s.data.

По теме:
Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Внедряем js модуль в query plugin

Например написан модуль SelectControl по принципу amd : define("SelectControl", ["jquery"/* TODO uncomment: , "addJqueryPlugin" */], function($) { function SelectControl() { this.init.apply(this, Read more

Soap вызов, используя jquery.ajax

Иногда не хочется делать запрос с клиента на свой сервер, который в свою очередь, используя soap клиент, делает запрос еще на Read more

Редактор текста и html — TinyMCE

TinyMCE — бесплатный javascript HTML редактор, легко внедрить в сайт, имеет кучу плагинов и гибко настраивается. Заходим на официальный сайт и Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *