Jhtml :: script命令-如何推迟到jQuery加载后?


11

JHtml::script习惯在自定义开发的模块中向页面添加脚本。但是,这些脚本会在J3添加jQuery之前注入到头部中,例如:

<!-- my module js -->
<script src="/modules/mod_tiles/js/jquery.isotope.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/jquery.hoverintent.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/mod_tiles.js" type="text/javascript"></script>
<!-- then joomla loads jQuery --->
<script src="/media/jui/js/jquery-noconflict.js" type="text/javascript"></script>
<script src="/media/jui/js/jquery.min.js" type="text/javascript"></script>

如何强制Joomla在其他任何脚本之前加载jQuery?

Answers:



2

如果我正确阅读了您的问题,则说明您正在开发自己的模块。

在default.php-模块的视图中尝试此操作(在“ tmpl”中):

JHtml::stylesheet('modules/'.$module->module.'/assets/css/yourfile.css');

JHtml::script('modules/'.$module->module.'/assets/js/yourscript.js');

或这个 :

JHtml::_('stylesheet', 'modules/'.$module->module.'/assets/css/anotherfile.css');

JHtml::_('script', 'modules/'.$module->module.'/assets/js/othercript.js');

在这两种情况下,您都应在jQuery之后注入您的JS文件,前提是您在其中创建了“ asset”文件夹,并在其中创建了“ css”和“ js”文件夹。

第二种解决方案更符合joomla 3.XX API。

希望能帮助到你。


我在这里所做的唯一更改是添加了assets文件夹-这没有什么不同,脚本仍然在jQuery之前加载。我也想知道将这种代码放入模板文件的智慧(特别是如果有多个模板使用相同的脚本,DRY等)的情况
编码手

下摆,您的评论很奇怪->“将这种代码放入模板文件中”。我曾经(也许不是很清楚)在谈论由您开发并基于isotope.js和其他JS脚本的模块。如果我错了,我非常抱歉,您实际上正在使用名为mod_tiles的第三方模块。顺便说一句,还有其他方法可以在模板中插入JS脚本。
ghazal 2014年

抱歉,我不是想听起来那么刺耳!必须为时过早...您完全正确,这就是我正在做的-这是我的模块。我所说的模板文件default.phptmpl模块的(template)文件夹中。我认为脚本应该在mod_tiles.php(“控制器”)而不是default.php(视图)中加载。
codinghands

将其放在tmpl / default.php中可以进行覆盖。在mod_tiles.php中,它不能被覆盖。
sovainfo 2014年

2

上周,我遇到了这个问题,它与我调用JHtml :: script的位置有关。您是在视图中还是视图模板中执行此操作?如果您尝试在视图本身中添加脚本(views / yourview / view.html.php),则会在Joomla!自己的脚本之前插入脚本,但是如果您在模板中添加脚本(views / yourview / tmpl / default.php),它们将插入Joomla!的脚本之后。

祝好运!


该模块仅包含mod_tiles.php,一个helper.php文件和一个模板(default.php)tmpl。我尝试在mod_tiles.php和default.php中添加脚本-均在jQuery之前加载。
codinghands

0

这可能是由于其开发人员mod_tiles用来导入脚本的方法所致。我认为在这种情况下,他们还没有遵守Joomla编码标准。

您有2种选择(我能想到):

  1. 如果脚本是从模块内tmpl文件夹中的文件中导入的,则可以使用进行模板覆盖并更改脚本的导入方式JHtml
  2. 您可以下载并安装jQuery Easy,这是一个导入jQuery并将其置于所有其他脚本之上的插件。

希望这可以帮助


我开发了模块-应该使用哪种方法?我问了一个问题(joomla.stackexchange.com/questions/325/…),并被告知JHtml :: script是前进的道路。
codinghands

0

我想在事实之后加上两位。我有几个脚本和样式表,需要为组件中的每个视图加载,并且希望单点发生以确保按正确的顺序加载它们。

在文件中components\myComponent\mycomponent.php

defined('_JEXEC') or die;

// Include dependancies
jimport('joomla.application.component.controller');

JHtml::stylesheet('http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css', array(), true);
JHtml::stylesheet('components/com_mycomponent/assets/css/mycomponent.css');

JHtml::_('jquery.framework');   // Make sure jQuery is loaded before component JS
JHtml::script( 'components/mycomponent/assets/js/jquery.cookie.js');

// Execute the task.
$controller = JControllerLegacy::getInstance('Mycomponent');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();

-1

我知道这是一个古老的话题,但是您是否触底?我刚刚遇到了同样的问题。我已经找到了原因,但没有找到问题/解决方案;我暗中怀疑这是一个错误,但可以与其他人一起尝试。

场景:您已经创建了一个包含jQuery依赖脚本的模块,因此您可以在default.php视图中使用以下命令:

$doc = JFactory::getDocument();
$doc->addScript("media/mod_accordion/js/accordion.js");

然后安装模块并为其指定模块位置,假设为“ left”。当您查看前端源代码时,一切看起来都不错,所有脚本都在包含在其中的脚本之后加载

JHtml::_('bootstrap.framework');

但是,如果您给模块一个位置“手风琴”并使用joomla loadposition功能将该模块添加到文章中

{loadposition accordion}

然后在bootstrap.framework文件之前添加了Accordion.js。

我能够使它工作的唯一方法是将脚本添加为内联脚本,而不是包含在头部。

编辑:包括CSS也一样;它被添加到css声明列表的顶部(在模板和bootstrap css文件之前)。这样做的障碍是在CSS声明中添加!important。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.