54 votes

Empêcher le formulaire de se soumettre, en utilisant Jquery

J'essaie d'empêcher mon formulaire de se soumettre si une validation échoue. J'ai essayé de suivre cette procédure poste précédent mais ça ne marche pas pour moi. Qu'est-ce qui me manque ?

<input id="saveButton" type="submit" value="Save" />
<input id="cancelButton" type="button" value="Cancel" />
<script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<script type="text/javascript">

    $(document).ready(function () {
        $("form").submit(function (e) {
            $.ajax({
                url: '@Url.Action("HasJobInProgress", "ClientChoices")/',
                data: { id: '@Model.ClientId' },
                success: function (data) {
                    showMsg(data, e);
                },
                cache: false
            });
        });
    });
    $("#cancelButton").click(function () {
        window.location = '@Url.Action("list", "default", new { clientId = Model.ClientId })';
    });
    $("[type=text]").focus(function () {
        $(this).select();
    });
    function showMsg(hasCurrentJob, sender) {
        if (hasCurrentJob == "True") {
            alert("The current clients has a job in progress. No changes can be saved until current job completes");
            if (sender != null) {
                sender.preventDefault();
            }
            return false;
        }
    }

</script>

0 votes

Quelle fonction dans le code ci-dessus empêche le formulaire de se soumettre ? Que fait la fonction showMsg ? Pourquoi utilisez-vous sender.preventDefault() ; l'argument sender est-il un événement ? preventDefault() est utilisé pour arrêter le comportement normal d'un élément lors d'un événement comme un clic, etc.

0 votes

L'expéditeur se réfère à e : événement

104voto

Vega Points 44724

Encore une fois, AJAX est asynchrone. Donc la fonction showMsg ne sera appelée qu'après une réponse positive du serveur et l'événement de soumission du formulaire n'attendra pas le succès d'AJAX.

Déplacez le e.preventDefault(); comme première ligne du gestionnaire de clics.

$("form").submit(function (e) {
      e.preventDefault(); // this will prevent from submitting the form.
      ...

Voir le code ci-dessous,

Je veux qu'il soit autorisé HasJobInProgress == False

$(document).ready(function () {
    $("form").submit(function (e) {
        e.preventDefault(); //prevent default form submit
        $.ajax({
            url: '@Url.Action("HasJobInProgress", "ClientChoices")/',
            data: { id: '@Model.ClientId' },
            success: function (data) {
                showMsg(data);
            },
            cache: false
        });
    });
});
$("#cancelButton").click(function () {
    window.location = '@Url.Action("list", "default", new { clientId = Model.ClientId })';
});
$("[type=text]").focus(function () {
    $(this).select();
});
function showMsg(hasCurrentJob) {
    if (hasCurrentJob == "True") {
        alert("The current clients has a job in progress. No changes can be saved until current job completes");
        return false;
    } else {
       $("form").unbind('submit').submit();
    }
}

0 votes

Cela ne va-t-il pas l'empêcher dans toutes les situations ?

0 votes

À quelle condition vous voulez que l'événement soit autorisé. Vous devez probablement l'empêcher de se soumettre, puis attendre la réponse AJAX et déclencher la soumission manuellement.

0 votes

Je veux qu'il soit autorisé HasJobInProgress == False

15voto

Arjun Raj Points 473

Utiliser cela aussi :

if(e.preventDefault) 
   e.preventDefault(); 
else 
   e.returnValue = false;

Becoz e.preventDefault() n'est pas pris en charge par IE (certaines versions). Dans IE, c'est e.returnValue = false

10 votes

Si vous utilisez jQuery, vous pouvez utiliser en toute sécurité e.preventDefault() . jQuery se chargera de la compatibilité avec le navigateur x.

0 votes

Cool, je ne le savais pas.

0 votes

De la jQuery sur API : "Le fait de retourner false à partir d'un gestionnaire d'événement appellera automatiquement event.stopPropagation() y event.preventDefault() ." Il poursuit : "A false peut également être transmise au gestionnaire en tant que raccourci de l'option function(){ return false; } "

3voto

Downpour046 Points 1014

Essayez le code ci-dessous. e.preventDefault() a été ajouté . Cela supprime l'action d'événement par défaut pour le formulaire.

 $(document).ready(function () {
    $("form").submit(function (e) {
       $.ajax({
            url: '@Url.Action("HasJobInProgress", "ClientChoices")/',
            data: { id: '@Model.ClientId' },
            success: function (data) {
                showMsg(data, e);
            },
            cache: false
        });
        e.preventDefault();
    });
});

De plus, vous avez mentionné que vous vouliez que le formulaire ne soit pas soumis sous prétexte de validation, mais je ne vois pas de code de validation ici ?

Voici un exemple de validation ajoutée

 $(document).ready(function () {
    $("form").submit(function (e) {
      /* put your form field(s) you want to validate here, this checks if your input field of choice is blank */
    if(!$('#inputID').val()){ 
       e.preventDefault(); // This will prevent the form submission
     } else{
        // In the event all validations pass. THEN process AJAX request.
       $.ajax({
            url: '@Url.Action("HasJobInProgress", "ClientChoices")/',
            data: { id: '@Model.ClientId' },
            success: function (data) {
                showMsg(data, e);
            },
            cache: false
       });
     }

    });
 });

0 votes

Je ne suis pas en train de valider un champ. La partie ajax du code appelle une méthode qui vérifie si un travail pour le client est déjà en cours. Je ne veux pas permettre que plusieurs travaux pour le même client soient mis en file d'attente.

3voto

Sandeep Points 68

Une approche différente pourrait être

    <script type="text/javascript">
    function CheckData() {
    //you may want to check something here and based on that wanna return true and false from the         function.
    if(MyStuffIsokay)
     return true;//will cause form to postback to server.
    else
      return false;//will cause form Not to postback to server
    }
    </script>
    @using (Html.BeginForm("SaveEmployee", "Employees", FormMethod.Post, new { id = "EmployeeDetailsForm" }))
    {
    .........
    .........
    .........
    .........
    <input type="submit" value= "Save Employee" onclick="return CheckData();"/>
    }

0voto

keivan kashani Points 227

Il s'agit d'un code JQuery pour empêcher l'envoi des données.

$('form').submit(function (e) {
            if (radioButtonValue !== "0") {
                e.preventDefault();
            }
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X