jquery иногда выполняется несколько раз

#jquery

#jquery

Вопрос:

У меня проблема с on функцией jquery, иногда скрипт выполняется многократно, что указывается в журнале XHR в моем вызове консоли несколько раз. ниже приведен сценарий, который иногда выполняется более одного раза.

 $('body').on('blur', 'input.required', function () {
    var i = 0;
    var row = $(this).closest('tr');
    var SID = row.find('.students-cb');
    row.find('input.required').each(function () {
        if ($(this).val().length > 0) {
            i  ;
        }
    });
    if (i == 3) {
        var fname = row.find('input.required').eq(0).val();
        var lname = row.find('input.required').eq(1).val();
        var grade = row.find('select[name=grade]').eq(0).val();
        var pass = row.find('input.required').eq(2).val();
        var json = {
            "baseRequest": {
                "ssoUserName": ssoUserName,
                "authToken": authToken,
                "ncesNbr": "1926"
            },
            "firstName": fname,
            "lastName": lname,
            "password": pass,
            "gender": "m",
            "gradeLevel": grade,
            "passwordComplexityLevel": grade,
            "handedPreference": "left"
        };
        var SIDval = SID.val() == 'on' ? '' : (SID.val() == 'off' ? '' : SID.val());

        if (SIDval.length > 0) { // update
            json.SID = SID.val();
            poster('hwtStudentWS/updateStudent', json, function (data) {
                if (data != false) {
                    if (isTyped) {
                        if ($('.success_update').length == 0) {
                            var msg = '<span class="success_update pull-right" style="font-size:14px;font-weight:bold;color:#00ca00;">All changes saved</span>';
                            $(msg).appendTo('#class-info');
                        } else {
                            $('.success_update').show();
                        }
                        setTimeout(function () {
                            $('.success_update').fadeOut();
                        }, 2000);
                        isTyped = false;
                    }
                }
            }, 'http://url.com/');
        } else { //create
            if (grade.length > 0) {
                json.CID = CID;
                json.teacherUID = teacherUID;
                poster('hwtStudentWS/createStudent', json, function (data) {
                    SID.val(data.SID);
                    SID.attr('data-cid', CID);
                    SID.attr('data-studentname', data.firstName   ' '   data.lastName);
                    SID.closest('tr').find('.required').addClass('saved');
                    if ($('.success').length == 0) {
                        var msg = '<span class="success pull-right" style="font-size:14px;font-weight:bold;color:#00ca00;">License has been assigned</span>';
                        $(msg).appendTo('#class-info');
                    } else {
                        $('.success').show();
                    }
                    setTimeout(function () {
                        $('.success').fadeOut();
                    }, 2000);
                }, 'http://url.com/');
            } else {
                alert('please select grade level');
            }

        }
    }
});
  

что-то не так с моим кодом? как предотвратить on выполнение этого несколько раз. любая помощь будет оценена

HTML

 ...
<tr>
  <td>
    <input type="checkbox" class="select students-cb" />
    <div class="checkbox-replacement"></div>
  </td>
    <td width="15%"><input type="text" name="fname" class="col-md-12 required" placeholder="First Name" /></td>
    <td width="15%"><input type="text" name="lname" class="col-md-12 required" placeholder="Last Name" /></td>
    <td width="15%"><select name="" class="custom-arrow grade">
    <option value="">Grade Level</option>
    <option value="k">K</option>
        <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    </select></td>
    <td width="15%"><input type="password" name="password" class="col-md-12 required" placeholder="Password" /></td>
    <td><select name="licenses" class="custom-arrow licenses product-dropdown"></select></td>
</tr>
...
  

PS: <tr> может быть более одного

Комментарии:

1. Можете ли вы также опубликовать соответствующий HTML-код?

2. @veelen пожалуйста, ознакомьтесь с обновлением

Ответ №1:

IIRC jQuery .on() добавляет новый обработчик к событию.

Вероятно, ваш скрипт вызывается более одного раза, поэтому одна и та же функция продолжает добавляться к событию.

Сначала попробуйте разорвать связь с событием:

 $('body')
    .off('blur', 'input.required')              // remove 'blur' event handler first
    .on('blur', 'input.required', function () { // then, add the new handler
    ... [snip] ...
    });
  

Комментарии:

1. я попробую. я скоро сообщу вам результат