Приостановить отправку формы для проверки - PullRequest
6 голосов
/ 17 ноября 2010

У меня есть какая-то форма, которая загружает файл в iframe. Я бы хотел оставить его до тех пор, пока не проверю, действительно ли он действителен для ajax. Как я могу это сделать ? Мой код приостанавливает отправку и возвращает результат проверки (в настоящее время это просто фиктивная функция, которая возвращает «result»: «true»), но затем действие «submit» не выполняется. Также нормально ли, что для получения данных ответа после получения статуса ответа 200 требуется ~ 2 с?

Вот мой HTML:

<div id="message" style="background:black; width:400px; height:80px; display:none; color:white;">
</div>
<h1>Submit</h1>
<form action="{{upload_url}}" target="upload_target" method="POST" id="file_upload_form" enctype="multipart/form-data">
    {% render_upload_data upload_data %}
    <table>{{ form }}</table>    
    <p>
        <input type="hidden" maxlength="64" name="myfileid" value="{{ myfileid }}" >
    </p>
    <p>
        <input type="submit" id="file_upload_submit" value="Submit" />
    </p>
    <iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>

Js:

$(function() {

    $('#file_upload_submit').click(function(e){
        e.preventDefault();
        var fileUploadForm = document.getElementById('file_upload_form');

        $.ajax({
            type: "POST",
            url: '/artifact/upload/check-form/',
            data: 'foo=bar',
            dataType: "json",
            success: function(data){
                if(data['result'] == "true"){
                    $("#message").show();
                    $("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
                    setTimeout(function(){
                        $("#message").fadeOut("slow", function () {
                            $("#message").hide();
                        });
                    }, 1500);
                     $('#file_upload_form').attr('target','upload_target').submit(function(){
                        alert('Handler for .submit() called.');
                        return false;
                    });
                }
                else{
                    $("#message").show();
                    $("#message").fadeIn(400).html('<span">'+data["message"]+'</span>');
                    setTimeout(function(){
                        $("#message").fadeOut("slow", function () {
                            $("#message").hide();
                        });
                    }, 1500);                    
                    return false;
                }
            }
        });
        return false;        
    });

});    

</script>

и ссылка: http://ntt.vipserv.org/artifact/


EDIT

С помощью приведенного ниже кода я могу выполнить проверку, а затем, когда ее результат будет положительным, отправляется форма. Теперь, если я жестко закодирую цель для формы, мое предупреждение не отображается, и я почти уверен, что загрузка не выполняется (к сожалению, список загрузок обновляется каждые 8 ​​часов. Я буду знать, сработало ли это через некоторое время). Если цель не указана, файл загружается с перенаправлением, поэтому весь прослушиватель события submit не указывается.

<script>  
    $('#fake_upload_submit').click(function(e){
        e.preventDefault();

        var fileUploadForm = document.getElementById('file_upload_form');
        fileUploadForm.addEventListener("submit", function() {
            alert("sent in iframe");
            fileUploadForm.target = 'upload_target';
        }, false);       

        $.ajax({
            type: "POST",
            url: '/artifact/upload/check-form/',
            data: 'foo=bar',
            dataType: "json",
            success: function(data){
                if(data['result'] == "true"){
                    $("#message").show();
                    $("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
                    setTimeout(function(){
                        $("#message").fadeOut("slow", function () {
                            $("#message").hide();
                        });
                    }, 1500);

                    fileUploadForm.submit();

                }
                else{
                    $("#message").show();
                    $("#message").fadeIn(400).html('<span">Response false</span>');
                    setTimeout(function(){
                        $("#message").fadeOut("slow", function () {
                            $("#message").hide();
                        });
                    }, 1500);                    
                    return false;
                }
            }
        });
        return false;        
    });   
</script>

HTML:

<div id="message" style="background:black; width:400px; height:80px; display:none; color:white;">
</div>
<h1>Submit</h1>
<form action="{{upload_url}}" method="POST" target="" id="file_upload_form" enctype="multipart/form-data">
    {% render_upload_data upload_data %}
    <table>{{ form }}</table>    
    <p>
        <input type="hidden" maxlength="64" name="myfileid" value="{{ myfileid }}" >
    </p>
    <p>
        <input type="submit" style="display:none" id="true_upload_submit" value="Submit" />
    </p>    
    <iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>
    <p>
        <input type="submit" id="fake_upload_submit" value="Submit" />
    </p>

Ответы [ 5 ]

1 голос
/ 17 ноября 2010

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

Вместо этого вы можете просто отправить формудобавления обработчика отправки:

$('#file_upload_form').attr('target','upload_target').submit();
0 голосов
/ 22 ноября 2010

Хаффа верна . Я полагаю, что следующее изменение заставит работать первый скрипт. Изменить

                     $('#file_upload_form').attr('target','upload_target').submit(function(){
                        alert('Handler for .submit() called.');
                        return false;
                    });

до

                     $('#file_upload_form').attr('target','upload_target').submit();

Ваша отладка нарушила представление. Если вы хотите продолжить отладку, измените код на:

                     $('#file_upload_form').attr('target','upload_target').submit(function(){
                        alert('Handler for .submit() called.');
                        return true;
                    }).submit();

Вы должны вызвать submit() самостоятельно, чтобы вызвать событие отправки. Если функция submit возвращает false, она не будет продолжена, поэтому вы должны вернуть true.

Это третья версия этого вопроса, которую вы опубликовали. Я согласен с другими, что вы можете решить свою проблему слишком сложно. Это тот случай, когда вы можете вообще отказаться от JavaScript и перейти к простому HTML-сообщению. Есть ли веская причина, почему это не вариант?

0 голосов
/ 17 ноября 2010

Как насчет того, чтобы вообще избежать проблемы, имея скрытую кнопку отправки для отправки формы и видимую кнопку, которая запускает проверку, и если все в порядке, тогда она выполняет нажатие на соответствующую скрытую кнопку отправки?

0 голосов
/ 17 ноября 2010

Скорее всего, вам будет проще (если, возможно, больше раздражать пользователей), если вы используете синхронный XHR вместо асинхронного.

Либо перехватите отправку формы с помощью JavaScript и отправьте ее с помощью XHR, если проверка на стороне сервера пройдет успешно.

0 голосов
/ 17 ноября 2010

Я думаю, что вы, возможно, переборщите с представлением формы, но я, возможно, тоже неправильно это прочитал Я также не могу иметь все факты. Не лучше ли просто отправить форму через вызов ajax и вернуть результат отправки (проверка завершилась неудачно или успешно)?

Псевдокод:

JQuery:

var formData = data;
ajax(formData);

Обработка форм:

if(valid) {
  submit(formData);
  return true;
} else {
  return false;
}

Я могу предоставить реальный код при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...