如何阻止Joomla包含jQuery?

时间:2014-02-26 20:45:03

标签: joomla joomla3.0

我最近从Joomla 3.2.1升级到Joomla 3.2.2。

在Joomla 3.2.1中,我手动取消设置jQuery:

$doc = JFactory::getDocument();

$dontInclude = array(
'/media/jui/js/jquery.js',
'/media/jui/js/jquery.min.js',
'/media/jui/js/jquery-noconflict.js',
'/media/jui/js/jquery-migrate.js',
'/media/jui/js/jquery-migrate.min.js',
'/media/jui/js/bootstrap.js',
'/media/system/js/core-uncompressed.js',
'/media/system/js/tabs-state.js',
'/media/system/js/core.js',
'/media/system/js/mootools-core.js',
'/media/system/js/mootools-core-uncompressed.js',
);
foreach($doc->_scripts as $key => $script){
    if(in_array($key, $dontInclude)){
        unset($doc->_scripts[$key]);
    }
}

但这不适用于Joomla 3.2.2。有没有办法在3.2.2中不包含Joomla的jQuery?

8 个答案:

答案 0 :(得分:7)

另一个适用于Joomla 3.4的变体是编辑模板> index.php文件,如:

$doc = JFactory::getDocument();

$headData = $doc->getHeadData();
$scripts = $headData['scripts'];

//scripts to remove, customise as required

unset($scripts[JUri::root(true) . '/media/system/js/mootools-core.js']);
unset($scripts[JUri::root(true) . '/media/system/js/mootools-more.js']);
unset($scripts[JUri::root(true) . '/media/system/js/core.js']);
unset($scripts[JUri::root(true) . '/media/system/js/modal.js']);
unset($scripts[JUri::root(true) . '/media/system/js/caption.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/jquery.min.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/jquery-noconflict.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/bootstrap.min.js']);
unset($scripts[JUri::root(true) . '/media/jui/js/jquery-migrate.min.js']);

$headData['scripts'] = $scripts;
$doc->setHeadData($headData);

答案 1 :(得分:2)

您需要在每个文件名之前添加JUri::root(true)前缀 - 相对路径不起作用

答案 2 :(得分:2)

我添加了:

            $doNotInclude = array(
                'jquery',
                'bootstrap',
                'behavior',
            );
            if(in_array($file, $doNotInclude)){
                return;
            }

紧接着:

            list($key, $prefix, $file, $func) = static::extract($key); 

在libraries / cms / html / html.php中的“_”函数中。

我不喜欢它,因为它是对Joomla核心的修改,但它有效。我仍在寻找更好的解决方案。

答案 3 :(得分:1)

你也可以尝试这样的事情:

$removeScripts = [
    '/media/jui/js/jquery.min.js',
    '/media/jui/js/jquery-noconflict.js',
    '/media/jui/js/jquery-migrate.min.js',
    '/media/system/js/caption.js',
];
foreach ($removeScripts as $removeScript) {
    unset($this->_scripts[JURI::root(true).$removeScript]);
}

答案 4 :(得分:0)

问题在于您的in_array

如果您通过更改此项删除它:

foreach($doc->_scripts as $key => $script){
    if(in_array($key, $dontInclude)){
        unset($doc->_scripts[$key]);
    }
}

到此:

foreach($doc->_scripts as $key => $script){
    unset($doc->_scripts[$key]);
}

然后它工作正常。检查阵列密钥是否存在是没有意义的,因为我没有自己手动删除任何这些文件。

希望这有帮助

答案 5 :(得分:0)

Joomla 3.3.6以不同的方式加载脚本,因此$ doc-> _scripts将不返回任何内容......因此没有任何内容可以取消设置。

我建议使用此插件:https://github.com/Poznakomlus/joomla_options

它允许你删除bootstrap,jQuery和mootools(你可以选择禁用什么)。

免责声明:我与插件开发者或插件本身没有任何联系。

答案 6 :(得分:0)

如果您正在编写自定义模板或组件,则需要删除Joomla中默认加载的所有脚本,您可以创建一个简单的插件并将执行绑定到onBeforeCompileHead事件。

我的实施如下。它非常简单。您可以进一步使用搜索列表,特定于文件名或只是将父文件夹列入黑名单。

protected $app;
public function onBeforeCompileHead() {
    // Front end
    if ($this->app instanceof JApplicationSite) {
        $doc = JFactory::getDocument();
        $search = array(
            'jui/js/',
            'system/js/'
        );
        foreach ($doc->_scripts as $key => $script) {
            foreach ($search as $findme) {
                if (stristr($key, $findme) !== false) {
                    unset($doc->_scripts[$key]);
                }
            }
        }
    }
}

答案 7 :(得分:0)

这在 joomla 3.9 中对我有用

<?php

defined('_JEXEC') or die('Restricted access');
$unset_scripts = [
    '/media/jui/js/jquery.min.js',
    '/media/jui/js/jquery-noconflict.js',
    '/media/jui/js/jquery-migrate.min.js',
    '/media/system/js/caption.js',

];
foreach ($unset_scripts as $script) {
    unset($this->_scripts[JURI::root(true) . $script]);
}
if (isset($this->_script['text/javascript'])) {
    $captionJsStr = '%jQuery\(window\)\.on\(\'load\',\s*function\(\)\s*{\s*new\s*JCaption\(\'img.caption\'\);\s*}\);\s*%';
    $this->_script['text/javascript'] = preg_replace($captionJsStr, '', $this->_script['text/javascript']);
    if (empty($this->_script['text/javascript'])) {
        unset($this->_script['text/javascript']);
    }

}
$this->_scripts = array();

?>
<!DOCTYPE html>