Search code examples
javascriptjqueryjquery-steps

Jquery-Steps : going back stucks with end less loop, if you skipped a step before


I am implementing jquery-Step Advance Form

Here i need to skip a step if age is less than 18, That's a similar example working in above link, when i tried to implement the same , It goes well for skipping a step but once i need to go back on click of previous button, JS use to get stuck with end less loop !!

Here i created jsfiddle for the same

Here is JS

$(function () {

    $("#form-3").steps({
        bodyTag: "fieldset",
        headerTag: "h1",
        onStepChanging: function (event, currentIndex, newIndex) {
            if (currentIndex > newIndex) {
                return true;
            }

            if (newIndex === 3 && Number($("#age").val()) < 18) {
                return false;
            }

            var form = $(this);

            if (currentIndex < newIndex) {
                $("#form-3 .body:eq(" + newIndex + ") label.error", form).remove();
                $("#form-3 .body:eq(" + newIndex + ") .error", form).removeClass("error");
            }

            return true;
        },
        onStepChanged: function (event, currentIndex, priorIndex) {
            if (currentIndex === 2 && Number($("#age").val()) >= 18) {
                $(this).steps("next");
            }

            if (currentIndex === 2 && priorIndex === 3) {
                $(this).steps("previous");
            }
        },
        onFinishing: function (event, currentIndex) {
            return true;
        },
        onFinished: function (event, currentIndex) {
            var form = $(this);
            form.submit();
        }
    })
});

here is HTML

<form id="form-3" action="#">
        <h1 class="noDisplay">Account</h1>
        <fieldset>
            <legend>Account Information</legend>
            <h3> Your Information</h3>
            <ul>
                <li>
                    <div><label for="userName">User name *</label></div>
                    <div><input id="userName" name="userName" type="text" class="required" data-msg-required="Username Required!"/></div>
                    <div class="cell"><div class="registerError"></div></div>
                </li>
                <li>
                    <div><label for="password">Password *</label></div>
                    <div><input id="password" name="password" type="text" class="required" data-msg-required="Password Required!"></div>
                    <div class="cell"><div class="registerError"></div></div>
                </li>
                <li>
                    <div><label for="confirm">Confirm Password *</label></div>
                    <div><input id="confirm" name="confirm" type="text" class="required" data-msg-required="Confirm Password Required!"></div>
                    <div class="cell"><div class="registerError"></div></div>
                </li>   
            </ul>
            <p>(*) Mandatory</p>
        </fieldset>

        <h1 class="noDisplay">Profile</h1>
        <fieldset>
            <legend>Profile Information</legend>
            <h3> Your Information</h3>
            <label for="name">First name *</label>
            <input id="name" name="name" type="text" class="required">
            <label for="surname">Last name *</label>
            <input id="surname" name="surname" type="text" class="required">
            <label for="email">Email *</label>
            <input id="email" name="email" type="text" class="required email">
            <label for="address">Address</label>
            <input id="address" name="address" type="text">
            <label for="age">Age (The warning step will show up if age is less than 18) *</label>
            <input id="age" name="age" type="text" class="required number">
            <p>(*) Mandatory</p>
        </fieldset>

        <h1 class="noDisplay">Warning</h1>
        <fieldset>
            <legend>You are to young</legend>
            <h3> Your Information</h3>
            <p>Please go away ;-)</p>
        </fieldset>

        <h1 class="noDisplay">Finish</h1>
        <fieldset>
            <legend>Terms and Conditions</legend>
            <h3> Your Information</h3>
            <input id="acceptTerms" name="acceptTerms" type="checkbox" class="required"> <label for="acceptTerms">I agree with the Terms and Conditions.</label>
        </fieldset>
    </form>

I have observed currentIndex and newIndex parameter are not getting correct values but i don't understand why?


Solution

  • In onStepChanged were two statements in the wrong order so I changed it an as of now it works fine.

    I already fixed it in the blog article. But just try it yourself here.

    Here is the fixed JS code

    onStepChanged: function (event, currentIndex, priorIndex)
    {
        // Suppress (skip) "Warning" step if the user is old enough and wants to the previous step.
        if (currentIndex === 2 && priorIndex === 3)
        {
            $(this).steps("previous");
            return;
        }
    
        // Suppress (skip) "Warning" step if the user is old enough.
        if (currentIndex === 2 && Number($("#age").val()) >= 18)
        {
            $(this).steps("next");
        }
    }