Плагины JQuery: вместе используйте jquery-upload-progress и jquery validation - PullRequest
0 голосов
/ 21 октября 2010

Я хотел бы использовать эти два плагина JQuery в одной форме:

Поведение, которое я хотел бы иметь:

  1. Подтвердите форму с помощью плагина проверки
  2. Если нет ошибок, начните загрузку и плагин uploadProgress. Если есть ошибки, покажите их и не запускайте плагин uploadProgress.

Два плагина хорошо работают отдельно. Когда я применяю оба в одной форме, это работает хорошо, если все правильно. Если в форме есть ошибки, запускается uploadProgress (запускаются функции запуска и выгрузки), но фактической загрузки нет. Он показывает панель загрузки, которая никогда не изменится, потому что форма не отправлена.

Я думаю, что проблема в том, что два плагина регистрируют что-то для выполнения при нажатии кнопки отправки.

Вот мой JavaScript (обновляется после первого ответа, но проблема все еще здесь):

/* ---------------------------------
 * Parameters for the form validator
 * --------------------------------- */
$.validator.setDefaults({
        highlight: function(input) {
                $(input).addClass("highlight");
        },
        unhighlight: function(input) {
                $(input).removeClass("highlight");
        }
});

$(document).ready(function(){
    /* ----------------------
     * Validator registration
     * ---------------------- */
    $("#upload_form").validate({
        rules: {
            title: {
                required: true,
                minlength: 5,
                maxlength: 100
            },
            file: {
                required: true,
                accept: 'ogg|ogv|avi|mpe?g|mov|wmv|flv|mp4'
            }
        },
        messages: {
            title: {
                required: "Please enter a title for the video",
                minlength: jQuery.format("The title must be at least {0} characters long"),
                maxlength: jQuery.format("The title must be shorter than {0} characters")
            },
            file: {
                required: "Please choose a video file to upload",
                accept: "Please choose a valid video file (ogg, ogv, avi, mpg, mpeg, mov, flv, mp4)"
            }
        }
    });

    /* ---------------
     * Upload progress
     * --------------- */
    $('#upload_form').uploadProgress({
            /* scripts locations for safari */
            jqueryPath: "{{MEDIA_URL|default:'/media/'}}js/jquery.uploadProgress.js",
            uploadProgressPath: "{{MEDIA_URL|default:'/media/'}}js/jquery.uploadProgress.js",

            /* selector or element that will be updated */
            progressBar: "#progress_indicator",

            /* progress reports url */
            progressUrl: '/upload/progress/',

            /* function called just before starting the upload */
            start: function() {
                $("#upload_form").hide();
                filename = $("#id_file").val().split(/[\/\\]/).pop();
                fmts = gettext("Uploading %(filename)s...");
                dat = {
                    filename: filename
                };
                s = interpolate(fmts,dat,true);
                $("#progress_filename").html(s);
                $("#progress_container").show();
            },

            /* function called each time bar is updated */
            uploading: function(upload) {
                if (upload.percents >= 100) {
                    window.clearTimeout(this.timer);
                    fmts = gettext("Saving %(filename)s...");
                    dat = {
                        filename: filename
                    };
                    s = interpolate(fmts,dat,true);
                    $("#progress_filename").html(s);
                } else {
                    fmts = gettext("Uploading %(filename)s : %(percents)s%...");
                    dat = {
                        filename: filename,
                        percents: upload.percents
                    };
                    s = interpolate(fmts,dat,true);
                    $("#progress_filename").html(s);
                }
            },

            /* how often will bar be updated */
            interval: 1000
        });
});

и соответствующий HTML:

<form id="upload_form" action="/upload/" method="post" enctype="multipart/form-data">
        <label for="id_title">Title</label>: <input id="id_title" type="text" name="title"/>
        <br/>
        <label for="id_description">Description</label>: <input id="id_description" type="text" name="description" />
        <br/>

        <label for="id_file">File</label>: <input type="file" name="file" id="id_file" />
    </div>
    <div>
        <!-- <button type="submit" class="accept" >Submit</button> -->
        <input type="submit" value="Submit" />
    </div>
</form>


<div id="progress_container">
    <div id="progress_filename"></div>
    <div id="progress_bar">
        <div id="progress_indicator"></div>
    </div>
</div>

Примечание: div progress_container скрывается через CSS при загрузке страницы.

Мое временное решение проблемы состояло в том, чтобы деактивировать проверку при отправке и использовать только другие события, но я также хотел бы проверить при отправке.

Ответы [ 2 ]

1 голос
/ 18 апреля 2015

Проблема заключается в том, что jquery-plugin-validation отправляет форму до того, как JQuery-upload-progress изменяет параметр "action" формы с идентификатором "X-Progress-ID".

Чтобы устранить эту проблему, необходимо выполнить следующее решение:установите идентификатор «X-Progress-ID» для формирования перед инициализацией проверки плагина и передайте этот идентификатор JQuery-upload-progress.

Пример кода:

var UUID="";
for (i = 0; i < 32; i++) {  UUID += Math.floor(Math.random() * 16).toString(16); }
$("#myform").validate({
   rules:{....},
   submitHandler: function(form) {
        /* patch the form-action tag to include the progress-id if X-Progress-ID has been already added just replace it */
        if(old_id = /X-Progress-ID=([^&]+)/.exec($("#myform").attr("action"))) {
            var action = $("#myform").attr("action").replace(old_id[1], UUID);
            $("#myform").attr("action", action);
        } else {
            var action = $("#myform").attr("action");
            var action_sep = (action.lastIndexOf("?") != -1) ? "&": "?";
            $("#myform").attr("action", action + action_sep + "X-Progress-ID=" + UUID);
        }           

        form.submit();
   }
});

Чем инициализировать JQuery-upload-progress и передать сгенерированный UUID

    $(" $("#myform").uploadProgress({
        uuid:  UUID,
        jqueryPath:....,
        uploadProgressPath:...,

и, наконец, исправить в jquery.uploadProgress.js 1) добавить uuid в конструктор

options = $.extend({
        uuid:   false,
        dataType: "json",
        interval: 2000,
        progressBar: "#progressbar",

2) изменить функциональность привязки:

        return this.each(function(){
        $(this).bind('submit', function() {
            var uuid = options.uuid;
            if(!options.uuid ){
                uuid = "";
                for (i = 0; i < 32; i++) { uuid += Math.floor(Math.random() * 16).toString(16); }
            }

            /* update uuid */
            options.uuid = uuid;
            /* start callback */
            options.start(uuid);

Вот и все.

0 голосов
/ 21 октября 2010

Процесс загрузки связан с событием отправки. И, таким образом, ваша форма сначала «отправляется», а затем останавливается проверкой. Если вы сначала зарегистрируете валидацию, а затем загрузите ее, она может работать.

Вы можете / должны также проверить, чтобы начать загрузку при обратном вызове «start».

Кстати:

$(document).ready(function() { $(function() {

видит немного на много, это в 2 раза та же функция.

$(function() { 

должно работать нормально.

Это "должно" работать:

$.validator.setDefaults({
    highlight: function(input) {
            $(input).addClass("highlight");
    },
    unhighlight: function(input) {
            $(input).removeClass("highlight");
    } });

    $(function() {
/* ----------------------
* Init form validation
* ---------------------- */
$("#upload_form").validate({
    rules: {
        title: {
            required: true,
            minlength: 5,
            maxlength: 100
        },
        file: {
            required: true,
            accept: 'ogg|ogv|avi|mpe?g|mov|wmv|flv|mp4'
        }
    },
    messages: {
        title: {
            required: "Please enter a title for the video",
            minlength: "The title must be at least 5 characters long",
            maxlength: "The title must be shorter than 100 characters"
        },
        file: {
            required: "Please choose a video file to upload",
            accept: "Please choose a valid video file (ogg, ogv, avi, mpg, mpeg, mov, flv, mp4)"
        }
    }
});

/* ---------------
 * Upload progress
 * --------------- */
$('#upload_form').uploadProgress({
    /* selector or element that will be updated */
    progressBar: "#progress_indicator",

    /* progress reports url */
    progressUrl: '/upload/progress/',

    /* function called just before starting the upload */
    start: function() {
        if (!$("#upload_form").valid()) {
           return false;
        }


        $("#upload_form").hide();
        $("#progress_filename").html("Uploading file...");
        $("#progress_container").show();
    },

    /* function called each time bar is updated */
    uploading: function(upload) {
        if (upload.percents >= 100) {
            window.clearTimeout(this.timer);
            $("#progress_filename").html(Saving file...);
        } else {
            $("#progress_filename").html("Uploading file : " + upload.percents + "%...");
        }
    },

    /* how often will bar be updated */
    interval: 1000
});
    });
...