我试图从Google Analytics docs注册以下内容:
<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<!-- End Google Analytics -->
所以我在我的小部件中执行了以下操作:
$this->view->registerJs('
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga(\'create\', \'UA-XXXXX-Y\', \'auto\');
ga(\'send\', \'pageview\');
', View::POS_HEAD);
$this->view->registerJsFile(
'https://www.google-analytics.com/analytics.js',
[
'async'=>'async',
'position' => View::POS_HEAD,
]
);
但是注册的JS文件出现在Inline JS之前。有没有办法让脚本尊重订单?
我考虑过使用AssetBundle而且&#39;取决于&#39;协议,但在Yii2 Docs中没有关于AssetBundle中的Inline JS的内容。
你可以给Inline JS一个关键,但遗憾的是,&#39;取决于&#39;协议需要一个类名。
答案 0 :(得分:2)
您可以将第一个代码块移动到js文件并在资产包中使用它。然后对于第二个js url,将该资产用作依赖
google_analytics.js
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
GoogleAnalyticsAsset.php
<?php
namespace app\assets;
use yii\web\AssetBundle;
class GoogleAnalyticsAsset extends AssetBundle
{
public $basePath = '@webroot/web';
public $baseUrl = '@web/web';
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
public $css = [
];
public $js = [
'js/google_analytics.js',
];
public $depends = [
];
}
在小部件内
use app\assets\GoogleAnalyticsAsset;
public function init() {
GoogleAnalyticsAsset::register( $this->getView() );
parent::init();
}
public function run()
{
$this->registerJsFile('https://www.google.com/jsapi',['position' => \yii\web\View::POS_HEAD,'depends' => 'app\assets\GoogleAnalyticsAsset']);
}
答案 1 :(得分:1)
不幸的是,唯一简单的方法是在这种特殊情况下不使用AssetBundle,并在<?php $this->head() ?>
之后手动将代码嵌入到部分/布局文件中