Javascript 调用youtube构造函数方法时,将丢失此方法的上下文
我已经使用youtube iframe api创建了一个youtube播放器,我正在收听Javascript 调用youtube构造函数方法时,将丢失此方法的上下文,javascript,youtube,Javascript,Youtube,我已经使用youtube iframe api创建了一个youtube播放器,我正在收听结束事件,但我意识到我丢失了对此的引用,它将成为窗口,但我真的不确定如何解决此问题。我已经试着将这个绑定到contsructor等,但是没有任何乐趣,所以在你们的帮助下可以做什么 JS startPlayer: function (videoId) { var instance = this; console.log('startPlayer', instan
结束
事件,但我意识到我丢失了对此
的引用,它将成为窗口,但我真的不确定如何解决此问题。我已经试着将这个绑定到contsructor等,但是没有任何乐趣,所以在你们的帮助下可以做什么
JS
startPlayer: function (videoId) {
var instance = this;
console.log('startPlayer', instance);
if( instance.flags.isPlaying ) {
instance.selectors.playerCtn.empty();
instance.flags.isPlaying = false;
}
instance.selectors.playerCtn.append('<div id="player"></div>');
instance.player = new YT.Player('player', {
height: '390',
width: '640',
videoId: videoId,
events: {
'onReady': this.onPlayerReady,
'onStateChange': this.onPlayerStateChange
}
});
instance.flags.isPlaying = true;
},
onPlayerStateChange: function (event) {
console.log('onPlayerStateChange');
var instance = this;
console.log(instance); //undefined??
if (event.data == YT.PlayerState.PLAYING) {
console.log('PLAYING...');
}
if (event.data == YT.PlayerState.PAUSED) {
console.log('PAUSED...');
}
if (event.data == YT.PlayerState.ENDED) {
console.log('what is this', instance);
// if instance.counter === instance.playlist
if (instance.counter === instance.playlist) {
console.log('you\'ve come to the end of your playlist');
// Display message or go back to first?
return;
}
// Increase the counter
instance.counter++
// Set the new current element
instance.current = instance.selectors.listItems[instance.counter];
console.log(instance.counter);
console.log(instance.current);
// Get the new current element data-id
var videoId = instance.current.attr('data-id');
// Start the player
startPlayer(videoId);
}
if (event.data == YT.PlayerState.BUFFERING) {
console.log('BUFFERING...');
}
}
startPlayer:function(videoId){
var实例=这个;
log('startPlayer',实例);
如果(instance.flags.isplay){
instance.selectors.playerCtn.empty();
instance.flags.isplay=false;
}
instance.selectors.playerCtn.append(“”);
instance.player=新的YT.player('player'{
高度:“390”,
宽度:“640”,
videoId:videoId,
活动:{
“onReady”:this.onPlayerReady,
“onStateChange”:this.onPlayerStateChange
}
});
instance.flags.isplay=true;
},
onPlayerStateChange:函数(事件){
log('onPlayerStateChange');
var实例=这个;
console.log(实例);//未定义??
if(event.data==YT.PlayerState.PLAYING){
console.log('PLAYING…');
}
如果(event.data==YT.PlayerState.PAUSED){
console.log('PAUSED…');
}
如果(event.data==YT.PlayerState.end){
log('这是什么',实例);
//如果instance.counter==instance.playlist
if(instance.counter==instance.playlist){
log('您已经到了播放列表的末尾');
//显示消息还是返回到第一个?
返回;
}
//增加计数器
实例计数器++
//设置新的当前元素
instance.current=instance.selectors.listItems[instance.counter];
console.log(instance.counter);
console.log(instance.current);
//获取新的当前元素数据id
var videoId=instance.current.attr('data-id');
//启动播放器
startPlayer(videoId);
}
if(event.data==YT.PlayerState.BUFFERING){
log('BUFFERING…');
}
}
测试页面
此外,为什么var instance=this代码>这个
的输入时间很短,并且在任何闭包中都没有使用实例
。我添加了。绑定到除实际事件之外的所有地方!谢谢你@styler事件处理程序通常是您需要绑定的唯一位置,除非您将函数引用传递给其他用途,并且需要它们保持绑定。是的,我不需要使用实例,因此将交换它@styler您有时会看到人们将这个
别名为局部变量,这样可以得到更好的压缩代码,但是我相信在gzip压缩之后,它不会改变任何东西,即使它改变了,然后我会把这个任务委托给最小化程序本身。是的,我有时会对我应该用它做什么感到困惑,我应该给它加个别名,还是我应该在阅读其他代码的基础上直接使用它,等等,我完全明白你的意思。谢谢你的解释!
events: {
'onReady': this.onPlayerReady.bind(this),
'onStateChange': this.onPlayerStateChange.bind(this)
}