我最近从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?
答案 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>