Yii2按顺序注册JS Files和Inline JS

时间:2017-11-14 16:46:16

标签: javascript google-analytics yii2

我试图从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;协议需要一个类名。

2 个答案:

答案 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() ?>之后手动将代码嵌入到部分/布局文件中

相关问题