yii2.0 如何按需加载并管理CSS样式及JS脚本 [ 2.0 版本 ]
(注:以下为Yii2.0高级应用测试)
Yii2.0对于CSS/JS 管理,使用AssetBundle资源包类。
视图如何按需加载CSS/JS ?
资源包定义:
backend/assets/AppAsset.php
namespace backend\assets;
use yii\web\AssetBundle;
/**
* @author chan <maclechan@qq.com>
* @since 2.0
*/
class AppAsset extends AssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
//全局CSS
public $css = [
'css/animate.css',
'css/style.min.css',
];
//全局JS
public $js = [
'js/jquery-2.1.1.js'
];
//依赖关系
public $depends = [
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
];
//定义按需加载JS方法,注意加载顺序在最后
public static function addScript($view, $jsfile) {
$view->registerJsFile($jsfile, [AppAsset::className(), 'depends' => 'api\assets\AppAsset']);
}
//定义按需加载css方法,注意加载顺序在最后
public static function addCss($view, $cssfile) {
$view->registerCssFile($cssfile, [AppAsset::className(), 'depends' => 'api\assets\AppAsset']);
}
}
视图中如何使用:
use yii\helpers\Html;
use backend\assets\AppAsset;
use backend\widgets\Alert;
/* @var $this \yii\web\View */
/* @var $content string */
AppAsset::register($this);
查看源文件,看清CSS和JS的加载顺序
可以看出以此顺序为:依赖关系 -> 自定义全局CSS/JS
如果,某个视图需要单独引入一个CSS/JS,并且,在页面中还要写些CSS/JS,该如何做?
1,在页面中单独写样式:
$cssString = ".gray-bg{color:red;}";
$this->registerCss($cssString);
2,在页面中单独写JS(使用数据块)
<div id="mybutton">点我弹出OK</div>
<?php $this->beginBlock('test') ?>
$(function($) {
$('#mybutton').click(function() {
alert('OK');
});
});
<?php $this->endBlock() ?>
<?php $this->registerJs($this->blocks['test'], \yii\web\View::POS_END); ?>
在视图中引入不是定义在全局里的CSS或JS。
分别有两种方法:
方法1,在资源包管理器里面定义一个方法,然后在视图中注册即可(推荐使用这种)
如上面代码己定义:
//定义按需加载JS方法,注意加载顺序在最后
public static function addScript($view, $jsfile) {
$view->registerJsFile($jsfile, [AppAsset::className(), 'depends' => 'api\assets\AppAsset']);
}
视图中使用如下:
AppAsset::register($this);
//只在该视图中使用非全局的jui
AppAsset::addScript($this,'@web/js/jquery-ui.custom.min.js');
//AppAsset::addCss($this,'@web/css/font-awesome/css/font-awesome.min.css');
查看下源码,特别的注意下,加载的顺序,是我们想要的结果
此外注意:在上面的addScript方法中,如果没有 ’depends‘=>’xxx‘ ,此处加载的顺序将会颠倒。
方法2,不需要在资源包管理器中定义方法,只要在视图页面直接引入即可
AppAsset::register($this);
//css定义一样
$this->registerCssFile('@web/css/font-awesome.min.css',['depends'=>['api\assets\AppAsset']]);
$this->registerJsFile('@web/js/jquery-ui.custom.min.js',['depends'=>['api\assets\AppAsset']]);
//$this->registerJsFile('@web/js/jquery-ui.custom.min.js',['depends'=>['api\assets\AppAsset'],'position'=>$this::POS_HEAD]);
//以上定义两种有点区别,见下图
加载在body区
加载在head中
博客源文地址:
http://blog.csdn.net/maclechan/article/details/45803821
(源创)
maclechan 杭州
注册时间:2015-05-10
最后登录:2019-11-14
在线时长:18小时40分
最后登录:2019-11-14
在线时长:18小时40分
- 粉丝37
- 金钱125
- 威望35
- 积分655
共 15 条评论
楼主辛苦了,咱们网站也有上传图片的功能,以后再发帖请上传到咱们服务器上,不要再外部引用了。
我是找了半天没找到,图片就只有一个链接。最后没办法。
@╃巡洋艦㊣ 站长,评论时的markdown解析器是不是有问题,点击修改保存后有时
`
会失效,有时会多一个`在页面上。和预览时不一致。自定义加载Assets不就得了,然后说明是否依赖jquery,bootstrap等库
和我写的差不多,相互补充吧。http://www.yiichina.com/tutorial/387
$this->registerJs( '$("document").ready(function(){ $("#login-form").validate({ errorElement : "small", errorClass : "error", rules: { "AgNav[nav_cn]": { required: true, }, }, messages:{ "AgNav[nav_cn]" : { required : "此字段不能为空.", }, } }); });' );
再补个写法
这种写法太恶心了,建议使用代码块写法 $this->beginBlock('test')
要是我定义了两个布局 一个只加载css/animate.css 另一个只加载'css/style.min.css'呢
那把另一个写到布局里面去
超赞,没这文章我还真连css,js 都引不进去。
这个全局的引用方式!如果是模块内呢?样式是模块里面的只是针对模块!..
是的。....
点赞赞赞赞赞
补个直接写最上面
$this->registerCssFile('@web/css/index-css.css');
赞,zan
0=api\assets\AppAsset
这个属性是怎么回事,可不可以去掉同问 一样的问题
非常不错的文章,谢谢,学习了
开头就说“全局css”,"全局js",这个说法不妥。何为全局?你所谓的全局就是如下吗?
AppAsset::register($this);
所谓的按需加载,单独引入JS/CSS就是如下吗?
$this->registerCssFile('@web/css/font-awesome.min.css',['depends'=>['api\assets\AppAsset']]); AppAsset::addScript($this,'@web/js/jquery-ui.custom.min.js');
如何全局了,怎么体现全局?如何按需加载了,两者的区别在哪里?没有说明白吧,这样的字眼容器误导人。
只能说文中所谓的全局和单独引入都是引入某些JS/CSS到当前视图的方式而已。
我可以写个AssetBundle,那么在视图中就应该
XXX::register($this);
如果没有写AssetBundle,而要临时紧急需要加载一个js,那么就要
$this->registerJsFile('xxxx.js');
还有,那个
是个什么东西,你没有介绍吧?在你的html截图里体现的有点模糊,说明不了单独加载时depends的作用,估计api\assets\AppAsset就是那个yii.js吧。
个人理解,欢迎拍砖
我是用的基础 版的用了这种方法还是不行,而且 也不报错,心塞,用这种可以<?=Html::jsFile('@web/js/t.js')?>,这是什么情况 ,
为什么后面有尾巴