После включения файла JavaScript, как я могу удалить / удалить - PullRequest
0 голосов
/ 11 апреля 2019

потому что я использую ajax для доступа к контенту на моем сайте;У меня есть этот код # 1, который динамически включает в себя файл javascript из другого каталога (в зависимости от загруженного содержимого), но включает в себя ту же функцию.

Код # 1:

var formContent = $("body form").first().attr('name');
if (typeof formContent != 'undefined') {            
    var uri = "classJS/" + formContent + "/jsc.js"; //File Javascript repeate in diferent directories.
    fetch(uri, { method: 'GET', type: 'HEAD' }).then(function(resp) {
        if (resp['status'] === 200) {

            //if Exist the Default Function (FunctionForms) set this to undefined.
            if (window.isFunction(window.FunctionForms)) {
                window.FunctionForms = undefined;
            }

            $.getScript(uri).done(function() {
                window.FunctionForms(formEvent); //call or Re-Call the function.
            });


        } else {
            console.log('%cNot find Script file: ' + formEvent, 'color: red');
        }
    });
}

Код # 2, эта функция (повторяется в каждом файле) предназначена для зарядки других специальных функций для загруженного содержимого, например:

Код # 2 Файл 1: (Может быть загружен Nраз)

function FunctionForms(formEvent) {
    console.log('%cCarga de Script JS para: ' + formEvent, 'background: #222; color: #bada55');
    window.Test();
}

function Test(){
    $('[name="s_list_2"]').unbind('click.form');
    $(document).on("click.form", '[name="s_list_2"]', function(event) {
        console.log('Is clicked');
    });
}

этот же файл из других каталогов может иметь немного другое содержимое:

function FunctionForms(formEvent) {
    //not used.........
    console.log('%cCarga de Script JS para: ' + formEvent, 'background: #222; color: #bada55');
}

Тогда: случается так, что если я ввожу то же самое содержимое5 раз; система включает в себя 5 раз один и тот же файл;но он не перезаписывает функцию и не удаляет ее, в противном случае он сохраняет ее в разных случаях;заставляя его работать N раз: в выводе консоли я получаю это.

VM6933:27 Is clicked
VM6944:27 Is clicked
VM6986:27 Is clicked
VM7022:27 Is clicked
VM7105:27 Is clicked

Я понимаю, что, очевидно, это не делает то, что я ожидаю:

if (window.isFunction(window.FunctionForms)) {
    window.FunctionForms = undefined;
}

1 Ответ

0 голосов
/ 11 апреля 2019

Проблема не в функции, а в привязке события.Каждый раз, когда вы загружаете файл, он делает:

$(document).on("click.form", '[name="s_list_2"]', function(event) {
    console.log('Is clicked');
});

, который добавляет еще один обработчик кликов.

Похоже, вы сначала пытались удалить старый обработчик, но вы этого не сделалиправильно.Чтобы удалить делегированный обработчик события, вы должны использовать тот же синтаксис делегирования с .off():

$(document).off("click.form", '[name="s_list_2"]');

Вы используете:

$('[name="s_list_2"]').unbind('click.form');

, который удаляет только тот обработчик, которыйбыло добавлено с:

$('[name="s_list_2"]').on('click.form', function ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...