Вложенные вызовы jQuery: как мне узнать, что происходит?

#javascript #jquery

#javascript #jquery

Вопрос:

Я работаю над некоторым устаревшим кодом jQuery, и есть часть, которая более или менее похожа на эту:

 tjq("table#tabla_pedidos tr td").click(function(){
    .
    .
    .
    tjq("body").on('click',".popup-delete", function(){
        var title = "Confirm";
        var question = "Are you sure?";
        var cancel = "NO";
        var accept = "YES";
        tjq.when( dialog(title, question, cancel, accept) ).then(
  

Где «tjq» — это имя, присвоенное «$» в этом коде, чтобы избежать конфликтов.

Что делает код? Учитывая таблицу HTML, когда пользователь нажимает на нее, отображается всплывающее окно, а если пользователь нажимает на кнопку ( ".popup-delete" ) в нем, отображается другое всплывающее окно подтверждения.

Мои проблемы в том, что это второе всплывающее окно подтверждения не работает. Ошибка, которую я получаю, это:

 dialog.js:5 Uncaught TypeError: $ is not a function
at dialog (dialog.js:5)
at HTMLAnchorElement.<anonymous> (VM337 scripts.js:388)
at HTMLBodyElement.dispatch (jquery-1.11.3.min.js:4)
at HTMLBodyElement.r.handle (jquery-1.11.3.min.js:4)
  

Вместо этого я попытался добавить tjq.dialog( . но тогда я получаю ошибку:

 Uncaught TypeError: tjq.dialog is not a function
at HTMLAnchorElement.<anonymous> (VM375 scripts.js:388)
at HTMLBodyElement.dispatch (jquery-1.11.3.min.js:4)
at HTMLBodyElement.r.handle (jquery-1.11.3.min.js:4)
  

Я думаю, что это должно быть как-то связано с вложенными вызовами jQuery, но в коде есть и другие, которые, похоже, работают (по крайней мере, с префиксом «tjq.»). Как я могу даже начать отлаживать это? Что происходит?

РЕДАКТИРОВАТЬ: чтобы ответить на вопросы, заданные ниже. Прежде всего, я думал, что «dialog ()» — это виджет «dialog», который поставляется с jQuery. Оказывается, это было не так. Вот dialog.js:

 function dialog(title, question, cancel, accept){

    var answer = new jQuery.Deferred();

    $("body").append("<div id='dialog'><div class='dialog-bg'></div><div class='dialog-window'><p class='dialog-title'>"  title  "</p><p class='dialog-question'>"  question  "</p><div class='dialog-actions'><button class='dialog-cancel'>"  cancel  "</button><button class='dialog-accept'>"  accept  "</button></div></div></div>");

    $("body").css("overflow", "hidden");

    $("body").on('click', '.dialog-cancel', function(){
        $("body").css("overflow", "auto");
        $("#dialog").remove();
        answer.resolve (false);
    });

    $("body").on('click', '.dialog-accept', function(){
        $("body").css("overflow", "auto");
        $("#dialog").remove();
        answer.resolve (true);
    });

    return answer.promise();
};
  

Что касается «tjq», он вызывается перед кодом, который я выдержал, в этой строке:

 tjq = jQuery.noConflict();
  

Способ загрузки страницы:

  1. jQuery 1.11.3.
  2. jQuery-миграция 1.2.1.
  3. Упомянутая выше вещь «tjq».
  4. Пользовательский интерфейс jQuery.

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

1. не могли бы вы опубликовать код функции диалога?

2. Как вы переопределяете $ tjq ? Это конфигурационный файл, вы упаковываете его в IIFE?

3. Ваш код вызывает jQuery.noconflict() где-нибудь? Если нет, то $ все еще сопоставляется с jQuery. И почему бы просто не вызвать jQuery with jQuery.... после выполнения этого вместо создания пользовательской ссылки?

4. Покажите нам dialog.js . Кажется, вы забыли передать туда jQuery

5. Извините за задержку, ребята. Я отредактировал вопрос

Ответ №1:

Хорошо, как упоминалось Антоном выше, оказывается, что я сопоставил jQuery с «tlq» вместо значения по умолчанию «$», но не изменил dialog.js чтобы объяснить это. Почему я этого не заметил? Потому что я думал, что «dialog ()» был виджетом диалогового окна jQuery по умолчанию, а не нашей собственной функцией.

Кроме того, «dialog.js » используется в другой части нашего веб-сайта, где jQuery не отображается, и там он работает нормально. Похоже, кто-то просто скопировал и вставил код и больше ничего не проверял.

Я не знаю, оставить ли этот вопрос в силе или просто удалить его; Я сомневаюсь, что другие пользователи найдут здесь какие-либо полезные ответы…