Почему мой JavaScript-класс не работает в WordPress? Конструктор не запускается, и изменения не применяются к DOM.

Вопрос или проблема

Я работаю над сайтом WordPress и пытаюсь реализовать JavaScript класс (MobileUI) для обработки изменений в интерфейсе, специфичных для мобильных устройств. Однако, класс вообще не работает. Когда я обновляю браузер, ничего не происходит, и команда alert() внутри конструктора не срабатывает. Я тестировал alert() вне класса, и он работает, но когда помещается внутрь конструктора, не выполняется. Я также удалял все из класса, кроме конструктора, но проблема остается.

Ожидаемый результат:

  • Команда alert() внутри конструктора должна срабатывать при загрузке страницы, указывая на то, что класс создается.
  • Класс должен применять изменения к DOM (например, скрывать элементы, перемещать элементы) в зависимости от ширины экрана.

Фактический результат:

  • Команда alert() внутри конструктора не срабатывает.
  • Никакие изменения не применяются к DOM.

Код:
Вот JavaScript класс, который я использую:

export default class MobileUI {
    constructor(ui_body, scrW_min, scrW_max) {
        alert("Hello, I am mobile UI"); // Этот alert не срабатывает
        // Свойства
        this.body = document.querySelector(ui_body);
        this.sidebar = this.body.querySelector('.sidebar');
        this.shoppingMenu = this.body.querySelector('.shopping-menu-wrapper .shopping-menu');
        this.shoppingActions = this.shoppingMenu.querySelector('.menu-icon');
        this.scrW_min = scrW_min;
        this.scrW_max = scrW_max;
        this.prodViews = this.body.querySelectorAll('.child-cat-content .child-cat-header .view-icons .view-icon');
        this.targetProdViews = this.body.querySelector('.view-icons #view-stacked, .view-icons #view-tile');

        // Методы
        this.hide_shopping_menu();
        this.hide_specified_views();
        this.move_shopping_actions();
    }

    hide_specified_views() {
        this.prodViews.forEach(view => {
            const viewInvisible="viewInvisible";
            view.classList.toggle(viewInvisible);
        });
    }

    move_shopping_actions() {
        if (!this.sidebar.contains(this.shoppingActions)) {
            this.sidebar.appendChild(this.shoppingActions);
        } else {
            this.body.appendChild(this.shoppingActions);
        }
    }

    hide_shopping_menu() {
        const screenWidth = window.innerWidth;
        if (screenWidth >= this.scrW_min && screenWidth <= this.scrW_max) {
            this.shoppingMenu.classList.add('shopInvisible');
            this.hide_specified_views();
            this.move_shopping_actions();
        }
    }
}

Как я использую класс:

  1. Я импортировал класс в своем основном JavaScript файле:

    import MobileUI from './/modules/mobile_ui_changes.js';
    
  2. Я создаю экземпляр класса после загрузки DOM:

    document.addEventListener('DOMContentLoaded', () => {
        const mobileUIChanges = new MobileUI('body', 360, 1080);
    });
    

HTML структура:
Вот соответствующая HTML структура:

<body class="tax-product_cat">
    <div class="sidebar"><!--content--></div>
    <div class="shopping-menu-wrapper">
        <div class="shopping-menu">
            <div class="menu-icon">Shopping Actions</div>
        </div>
    </div>
    <div class="child-cat-content">
        <div class="child-cat-header">
            <div class="view-icons">
                <div class="view-icons">
                  <img id="view-stacked" class="view-icon" src="<?php echo esc_url(get_template_directory_uri()); ?>/assets/images/view-stacked-accent.svg" alt="Stacked View">
                  <h6 class="view-heading">Stacked</h6>
                  <img id="view-tile" class="view-icon" src="<?php echo esc_url(get_template_directory_uri()); ?>/assets/images/view-tile.svg" alt="Tile View">
                  <h6 class="view-heading">Tile</h6>
                  <img id="view-table" class="view-icon" src="<?php echo esc_url(get_template_directory_uri()); ?>/assets/images/view-table.svg" alt="Table View">
                  <h6 class="view-heading">Table</h6>
               </div>
            </div>
        </div>
    </div>
</body>

Что я пробовал:

  1. Размещение команды alert() вне класса: она работает.
  2. Размещение команды alert() внутри конструктора: она не работает.
  3. Удаление всего из класса, кроме конструктора: alert() все равно не срабатывает.
  4. Проверка консоли браузера на наличие ошибок: ошибки не регистрируются.
  5. Убедиться в существовании элементов DOM: элементы присутствуют в HTML.

Среда:

  • Версия WordPress: 6.7.2
  • Тема: пользовательская тема
  • Библиотеки: Node.JS, WordPress Scripts
  • инструмент сборки: Webpack
  • Браузер: Mozilla Firefox для ZorinOS 135.0 (64-бит)
  • Операционная система: ZorinOS 17.2

Вопросы:

  1. Почему конструктор не срабатывает и как это исправить?
  2. Существуют ли какие-либо специфичные для WordPress проблемы, которые могут помешать работе класса?
  3. Как можно убедиться, что класс создается правильно и применяет необходимые изменения к DOM?

Вам нужно зарегистрировать скрипт в WordPress, обычно вы используете функцию wp_enqueue_script() в вашей теме или плагине. Эта функция обеспечивает добавление ваших скриптов на ваш сайт WordPress в правильном порядке и только при необходимости.

Вот общий процесс регистрации скрипта:

Откройте файл functions.php вашей темы (или соответствующий файл в вашем плагине).

Используйте функцию wp_enqueue_script() для добавления вашего JavaScript файла.

Вот пример, как зарегистрировать скрипт:

function my_custom_scripts() {
// Зарегистрировать кастомный JavaScript файл
wp_enqueue_script(
    'my-custom-script',          // Идентификатор для скрипта
    get_template_directory_uri() . '/js/custom-script.js', // Путь к скрипту
    array('jquery'),             // Зависимости (необязательно, например, jQuery)
    null,                        // Номер версии (необязательно, установите null, чтобы избежать версионирования)
    true                         // Загружать скрипт в подвале (true) или в заголовке (false)
   );
}
add_action('wp_enqueue_scripts', 'my_custom_scripts');

Разбивка параметров wp_enqueue_script():

Идентификатор: Уникальное имя для скрипта. В этом примере, это ‘my-custom-script’.

Ресурс: Местоположение вашего JavaScript файла. В примере выше, он находится в папке js директории темы.

Зависимости: Это массив других скриптов, которые должны быть загружены перед вашим скриптом. В данном случае, это jQuery (необязательно).

Версия: Вы можете указать номер версии для вашего скрипта или установить его в null, чтобы WordPress обрабатывал это автоматически.

В подвал: Значение true загружает скрипт в подвале, что обычно предпочтительнее для производительности, в то время как false загрузит его в заголовке.

Общие советы:
Убедитесь, что путь к файлу правильный:
Используйте get_template_directory_uri() для темы или plugin_dir_url(FILE) для плагина.

Сжмите скрипты для производства: хорошей практикой является сжатие JavaScript файлов перед их регистрацией на вашем сайте для улучшения производительности.
Дайте мне знать, если вам нужна помощь в какой-либо части процесса!

Ответ или решение

Причина, по которой ваш JavaScript класс не работает в WordPress, в частности, почему конструктор класса MobileUI не срабатывает, может быть связана с несколькими факторами, большинство из которых вращаются вокруг интеграции и работы JavaScript в экосистеме WordPress. Рассмотрим возможные причины и предоставим решения в соответствии с теорией, примерами и приложением.

Теория

JavaScript в WordPress выполняется с помощью технологии очередей, которая обеспечивает правильную загрузку скриптов. Это особенно важно, поскольку неверная загрузка скриптов может привести к таким проблемам, как несрабатывание конструктора класса или отсутствие изменений в DOM. Чтобы код в WordPress работал корректно, он должен быть закружен и работать в правильное время и в соответствующем контексте.

Примеры

  1. Неправильное подключение скриптов: Вы должны использовать wp_enqueue_script(), чтобы обеспечить, что ваш JavaScript-файл правильно загружен. Это ключевой аспект, специфичный для экосистемы WordPress. Он необходим для управления зависимостями скриптов и их приоритетом загрузки.

  2. Ошибка в JavaScript-коде: Любая ошибка в скрипте JavaScript может привести к тому, что последующий код не будет выполнен. Ошибки часто незаметны на первый взгляд и могут зависеть от порядка загрузки или выполнения кода. Консоль разработчика в браузере является идеальным инструментом для диагностики таких ошибок.

  3. Неправильная инициализация класса: Убедитесь, что класс MobileUI инициализируется после полной загрузки DOM, что вы и сделали, используя событие DOMContentLoaded. Однако, обратите внимание на правильность пути и имя файла, из которого импортируется ваш класс.

Приложение

Чтобы устранить возникшую проблему, следуйте предложенному ниже стэку решений и рекомендаций:

  1. Проверка подключения скриптов:

    • Убедитесь, что wp_enqueue_script() правильно подключает ваш JavaScript-файл. Вам необходимо добавить код подключения в functions.php вашей темы или плагина. Например:
      function my_custom_scripts() {
       wp_enqueue_script(
           'my-custom-script',    
           get_template_directory_uri() . '/js/custom-script.js',
           array('jquery'),       
           null,                  
           true                   
       );
      }
      add_action('wp_enqueue_scripts', 'my_custom_scripts');
    • Убедитесь, что путь к вашему файлу корректен и скрипт находится в указанной директории. Используйте get_template_directory_uri() для тем или plugin_dir_url(__FILE__) для плагинов.
  2. Обработка и исправление ошибок:

    • Проверьте консоль браузера на наличие ошибок. Любые ошибки в консоли могут указать на неправильное использование переменных или синтаксические ошибки.
    • Убедитесь, что HTML-элементы, указанные в вашем коде селектора, корректны и существуют на странице.
  3. Оптимизация и проверка исполнения:

    • Проверьте, что все версии и зависимости указаны правильно в wp_enqueue_script().
    • Убедитесь, что ваш JavaScript действительно импортирован и инициализируется, добавив отладочный console.log() перед инициализацией класса для проверки того, что скрипт выполнен.
    • Если возможно, попробуйте временно убрать все дополнительные функции класса, оставив только конструктор, чтобы точно убедиться в его правильной инициализации.

В случае успешного выполнения этих шагов ваш конструктор класса MobileUI должен начать правильно работать в WordPress, и вы сможете увидеть ожидаемые изменения в DOM. Если проблема сохраняется, возможно, стоит внимательно пересмотреть зависимостиб с PST агейами и правильность использования шаблонизатора, такого как PHP в WordPress, что может вмешиваться в ваш JavaScript-код.

Оцените материал
Добавить комментарий

Капча загружается...