Добавление Javascript в меню WordPress

8 июл. 2014 г., 23:28:03
Просмотры: 34.1K
Голосов: 10

Существует ли способ добавить javascript в поле URL пункта меню WordPress? На моем сайте есть функция живого чата, и мне нужно разместить этот код для создания ссылки, открывающей живой чат (как предложено здесь).

<!-- НАЧАЛО ССЫЛКИ ЧАТА OLARK -->
<a href="javascript:void(0);" onclick="olark('api.box.expand')">
    Нажмите здесь, чтобы начать чат!
</a>
<!-- КОНЕЦ ССЫЛКИ ЧАТА OLARK -->

Клиент хочет разместить ссылку в панели служебной навигации, которая была создана с помощью меню WordPress в консоли WordPress. Но когда я копирую и вставляю javascript:void(0);" onclick="olark('api.box.expand') в поле URL в консоли WordPress, оно просто исчезает, и ссылка остается неактивной.

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

Кто-нибудь знает, как это сделать? Я хотел бы реализовать это без использования плагина.

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

Вы не должны иметь возможность добавлять JavaScript в меню через пользовательский интерфейс, и никогда не следует полагаться на атрибут onclick для выполнения JavaScript

Tom J Nowell Tom J Nowell
8 июл. 2014 г. 23:44:56

Почему нет? Это код, который предоставила мне компания, разрабатывающая чат.

mcography mcography
9 июл. 2014 г. 00:15:12

Это не значит, что это правильный способ, посмотрите событие .click() в jQuery

Tom J Nowell Tom J Nowell
9 июл. 2014 г. 01:08:52

Я не хотел сказать, что так и есть. Я просто хотел спросить, почему мне никогда не следует полагаться на атрибут onclick. Я посмотрю информацию про .click().

mcography mcography
9 июл. 2014 г. 17:21:04

Потому что HTML предназначен для определения документа, и добавление атрибута onclick так же плохо, как и добавление встроенного тега или атрибута style — это смешивает их. Смотрите этот вопрос, чтобы понять, почему это плохо

Tom J Nowell Tom J Nowell
9 июл. 2014 г. 17:29:31
Все ответы на вопрос 4
4

Хорошо, что это работает. Если это для клиента или если вы просто хотите более чистый код, вы можете сделать так, как предложил @Tom J Nowell.

Добавьте пользовательский пункт меню, свяжите его с никуда или куда угодно. Узнайте ID пункта меню (у каждого пункта есть свой ID), а затем нацельтесь на этот ID с помощью jQuery.

$("#menu-item-num").on("click", function(e){ 
      e.preventDefault();
      // код olark здесь
});

Таким образом, каждый раз, когда пользователь нажимает на этот menu-item, будет срабатывать скрипт выше. Вы можете подключить jQuery скрипт через functions.php.

Обновление:

  1. Убедитесь, что ваш olark.js загружается. Если вы добавляете его в подвал (footer) или заголовок (header), проверьте вашу страницу и убедитесь, что скрипт там. Также убедитесь, что в консоли браузера нет ошибок.

  2. Оберните ваш js в document ready, чтобы скрипт выполнялся в нужное время:

    jQuery(document).ready(function($) {
      $("#menu-item-38872").on("click", function(e){
      e.preventDefault();
      olark('api.box.expand');
      });
    });
    

Тот факт, что ссылка не загружается, означает, что что-то не так с самим скриптом или скрипт вообще не загружается.

9 июл. 2014 г. 01:52:15
Комментарии

Спасибо за ответ. Я не очень разбираюсь в Javascript, поэтому не могли бы вы объяснить, почему ваше решение лучше/чище? Просто пытаюсь разобраться.

mcography mcography
9 июл. 2014 г. 17:27:20

Я создал файл под названием olark.js и подключил его, но ссылка по-прежнему ведёт на # (потому что я так указал в панели управления Wordpress). Вот что я поместил в olark.js: $("#menu-item-38872").on("click", function(e){ e.preventDefault(); // olark code here olark('api.box.expand'); }); Что я делаю не так?

mcography mcography
9 июл. 2014 г. 18:36:52

Ага! jQuery(document).ready(function($) { сработало! Спасибо, @gdaniel!

mcography mcography
9 июл. 2014 г. 18:42:09

Рад, что сработало. Идея в том, чтобы скрипт был отделён от контента. Поэтому рекомендуется делать именно так.

gdaniel gdaniel
9 июл. 2014 г. 18:52:10
0

Решение #1 (не идеальное, но рабочее):

// Ссылка на Live Chat в утилитарном меню
add_filter( 'wp_nav_menu_items', 'live_chat_utility_link', 10, 2 );
function live_chat_utility_link ( $items, $args ) {
    if ( $args->theme_location == 'utility' ) {
        $items .= '<li><a href="javascript:void(0);" onclick="olark(\'api.box.expand\')" class="livechat">Live Chat</a></li>';
    }
    return $items;
}

Решение #2 (идеальное):

С помощью комментариев выше я нашел оптимальное решение. Я создал новый файл под названием olark.js и поместил в него следующий код:

jQuery(document).ready(function($) {
    $("#menu-item-38872").on("click", function(e){ 
          e.preventDefault();
          // код olark здесь
          olark('api.box.expand');
    });
});

Затем я подключил скрипт в functions.php с помощью следующего кода:

function olark_script() {
    wp_register_script( 'olark', get_stylesheet_directory_uri() . '/js/olark.js', array(), '1.0.0', true );
    wp_enqueue_script( 'olark' );
}

add_action( 'wp_enqueue_scripts', 'olark_script' );

Если решение не работает, убедитесь, что вы правильно подключаете скрипт. Я использую дочернюю тему, поэтому мне пришлось использовать get_stylesheet_directory_uri() вместо get_template_directory_uri().

9 июл. 2014 г. 00:15:54
0

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

Альтернативой может быть ссылка на несуществующий якорь, например #olark, в пункте меню. Это можно настроить через пользовательский интерфейс, и такой подход будет надежным в разных средах. Затем отдельный скрипт должен отслеживать изменения хэша (в адресной строке браузера) и действовать соответствующим образом.

Простой пример на CoffeeScript, который компилируется в JavaScript и слушает событие изменения хэша:

if window.addEventListener
  window.addEventListener 'hashchange', (event) =>
  @showLogin()
else
  window.attachEvent 'onhashchange', (event) =>
  @showLogin()
# включить возможность делиться URL
if location.hash then @showLogin()

@showLogin — это функция, которая отображает диалоговое окно для входа в систему, если хэш равен '#login'.

[редактирование] Забавно, но хэш в адресной строке не меняется при клике на пункт меню. Это неожиданно и может быть связано с тем, что другой скрипт предотвращает стандартное событие. Поэтому я добавил еще одну строку, чтобы изменить местоположение окна при клике на ссылку:

# убедиться, что хэш меняется при клике на ссылку в меню (в моем случае это почему-то не работает)
$('.menu-item a').click (event) =>
  window.location = $(event.currentTarget).attr 'href'

[/редактирование]

29 авг. 2014 г. 12:24:52
1
-2

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

function add_nav_class($output) {
$output= preg_replace('/<a/', '<a id="join_club" onclick="awf_Form_.showForm(); return false;"', $output, -1);
return $output;
}
add_filter('wp_nav_menu', 'add_nav_class');
15 нояб. 2017 г. 11:01:41
Комментарии

Это не правильное решение, оно полностью сломает меню, потому что все кнопки будут затронуты, и оно не делает того, о чём был задан вопрос.

Milan Petrovic Milan Petrovic
15 нояб. 2017 г. 11:49:29