Как разрешить пункту меню выполнять Javascript в Joomla 3.2?

До версии 3.2 я мог установить тип элемента меню «внешняя ссылка», а затем установить ссылку как

"javascript:моя функция()"

При щелчке пункт меню вызывает функцию JavaScript. Но после того, как я обновился до 3.2, когда я сделал то же самое и попытался сохранить пункт меню, он сказал: «Сохранить не разрешено».

3.2 заблокировал это использование? Если да, как мне заставить функцию JS выполняться пунктом меню?


person shenkwen    schedule 01.12.2013    source источник


Ответы (2)


Я столкнулся с этой проблемой некоторое время назад, в версии 3.2.1 Joomla относительно ссылки «Skype», например.

скайп: мой логин

Это связано с типами протоколов, которые разрешены и определены в этом файле:

/administrator/components/com_menus/controllers/item.php, строка ~180.

Есть массив, определяющий допустимые схемы:

$scheme = array('http', 'https', 'ftp', 'ftps', 'gopher', 'mailto', 'news', 'prospero', 'telnet', 'rlogin', 'tn3270', 'wais', 'url', 'mid', 'cid', 'nntp', 'tel', 'urn', 'ldap', 'file', 'fax', 'modem', 'git');

При добавлении skype в конец списка Joomla! разрешено сохранение внешней ссылки. То же самое относится и к javascript. В любом случае вам следует учитывать любую угрозу безопасности, связанную с этим решением.

Кроме того, вы должны иметь в виду, что это переопределение может быть отменено в любом будущем обновлении joomla.

person cosval    schedule 04.02.2014

С технической точки зрения Joomla считает, что javascript — это протокол, такой как HTTP & Co., она ищет его в списке известных протоколов, не находит и выдает ошибку.

Начните читать со строки внутри [MenusControllerItem::save()][1]. Так что в основном это не имеет никакого отношения к тому факту, что вы пытаетесь использовать JavaScript, это просто побочный эффект.

Хотя использование JavaScript во внешней ссылке на самом деле не является рекламируемой функцией, а скорее лазейкой, она нарушает b/c, если вы использовали ее раньше.

Вы можете:

  1. Откройте задачу в отслеживании задач Joomla и сообщите об этой проблеме, чтобы получить отзывы сообщества. Исправить очень просто, его просто нужно принять.

  2. Воспользуйтесь предложением ниже:

    • Instead of link put #
    • Установите в поле «Связать стиль CSS» что-то, что не конфликтует с другими классами, например. my-function
    • Сохранять
    • Вы можете использовать jQuery для перехвата события клика по ссылке и запуска вашей функции. См. код ниже:
    jQuery(document).ready(function($){
        // Select element based on the class set in Joomla backend
        $( ".my-function" ).on( "click", function(e) {
            // Do not follow the link
            e.preventDefault();
    
            // Call function
            myFunction(1);
        });
    });
    
    
    function myFunction(x)
    {
        alert("I was called" + x);
    }
    

Обновление: после короткого обсуждения с автором изменения я понял, что это может быть связано с проблемой безопасности. Так что может быть все-таки намеренно не разрешать js.

person Valentin Despa    schedule 04.12.2013
comment
Большое спасибо. На самом деле я пошел изучать jQuery и понял это до того, как увидел ваш пост. Было радостно, когда тебя заставляют узнавать что-то новое. - person shenkwen; 10.12.2013