2

在3.2之前,我可以将菜单项类型设置为“外部链接”,然后将链接设置为

“javascript:myFunction()

单击时,菜单项将调用 JavaScript 函数。但是在我升级到 3.2 之后,当我做了同样的事情并尝试保存菜单项时,它说“不允许保存”。

3.2 是否阻止了这种用法?如果是,我如何让菜单项执行我的 JS 函数?

4

2 回答 2

4

不久前,我在 Joomla 版本 3.2.1 中提出了这个问题,涉及“Skype”链接,例如

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 的任何未来更新中被丢弃。

于 2014-02-04T13:19:35.170 回答
2

从技术上讲,Joomla 认为这javascript是一个协议,例如 HTTP & Co.,它在已知协议列表中查找它,但没有找到它并抛出错误。

从内线开始阅读[MenusControllerItem::save()][1]。所以基本上它与你试图使用一些 JavaScript 的事实无关,这只是一个副作用。

虽然在外部链接中使用 JavaScript 并不是真正的广告功能,而是说一个漏洞,但如果您以前使用过它确实会破坏 b/c。

你可以:

  1. Joomla 问题跟踪器中打开一个问题并报告此问题,获得一些社区反馈。修复真的很简单,它只需要被接受。

  2. 使用以下建议

    • 而不是链接放#
    • 将字段“Link CSS Style”设置为不会与其他类发生冲突的内容,例如。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可能是故意的。

于 2013-12-04T13:20:20.730 回答