我的代码是外部.as
文件。 Google在demo上提供了此代码,其中包含this
关键字:
import com.google.analytics.AnalyticsTracker;
import com.google.analytics.GATracker;
var tracker:AnalyticsTracker = new GATracker( this, "UA-111-222", "AS3", true );
playGame.addEventListener( MouseEvent.CLICK, onButtonClick );
function onButtonClick ( event:Event ):void
{
tracker.trackPageview("/myGame1");
}
此代码在默认上下文中可能正常工作,但由于我将此代码嵌入到我定义包的外部.as
文件中,显然this
引用不同,因为执行上下文不同
目前,这就是我的方式:
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.external.ExternalInterface;
import com.google.analytics.AnalyticsTracker;
import com.google.analytics.GATracker;
public class DetailView extends MovieClip {
//private var tracker:GATracker;
private var tracker:AnalyticsTracker;
function slugify(text) {
text = text.replace(/[^-a-zA-Z0-9,&\s]+/ig, '');
text = text.replace(/-/gi, "_");
text = text.replace(/\s/gi, "-");
return text.toLowerCase();
}
public static var NEXTOFFER:String = "DETAIL_NEXTOFFER";
public static var TERMS:String = "DETAIL_TERMS";
private var link:String;
private var fbshare:String;
private var twshare:String;
private var offerID:Number;
private var details:Sprite;
private var terms:Sprite;
public function DetailView() {
ExternalInterface.call( "console.log", 'before');
ExternalInterface.call( "console.log", typeof GATracker );
ExternalInterface.call( "console.log", typeof this );
tracker = new GATracker( this, "UA-WATEVER", "AS3", true );
ExternalInterface.call( "console.log", 'after');
请注意,我有4次拨打console.log
。第3次火灾,但在new GATracker
声明之后,第4次没有发射。
当我应该传递不同的上下文时,我感觉我用new GATracker
创建的对象覆盖了整个包。
我认为我应该传递的正确上下文是不在{/ 1}}默认值时不在包/外部文件中,我假设它引用了主阶段对象。
如果我的假设是正确的,我将如何从构造函数内部引用主阶段对象?
答案 0 :(得分:1)
如果要引用主舞台,则需要等到对象添加到舞台后才能引用它。
它可能看起来像这样:
public function DetailView()
{
addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
}
protected function onAddedToStage( event:Event ):void
{
tracker = new GATracker( this, "UA-WATEVER", "AS3", true );
removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
}
另一种方法是侦听ENTER_FRAME事件,并在处理程序中检查阶段的非null值,然后删除处理程序并初始化变量。
答案 1 :(得分:1)
问题是当您尝试初始化跟踪器时,您的类对象不在舞台上。查看GATracker的源代码,您传入的this
引用用于从stage loaderInfo对象获取swf url:Line 218。
如果您在当前使用this
的地方传递的任何displayObject不在舞台上,则此操作将失败:
//_display contains a reference to the first property from the constructor
_env.url = _display.stage.loaderInfo.url;
解决方案是:
ADDED_TO¬STAGE
添加一个监听器,并且只启动你的跟踪器。this
。只要对象在舞台上,您为第一个参数传递的范围就是无关紧要的。