我的jquery ui小部件有一些属性需要在回调时访问。问题是上下文是暂时的。
我读到的所有内容都说要在_create
构造函数中创建我的变量,并在that
:中保留对小部件的引用
(function ($) {
$.widget("tsp.videoWrapper", {
options: {
value: 0,
playBtnObj: null,
timeboxElement: null,
chapterNavElement: null,
segmentBarElement: null,
positionViewElement : null
},
_create: function () {
var that = this;
var thatElm = $(that.element);
that.Video = thatElm.children("video")[0];
if (that.Video == null) {
console.log("Video element not found.");
return;
}
that._addHandlers();
},
_addHandlers: function () {
this.Video.addEventListener("loadedmetadata", this._videoInited, false);
if (this.Video.readyState >= this.Video.HAVE_METADATA) {
this._videoInited.apply(this.Video); // missed the event
}
},
_videoInited: function (evt) {
console.log(this);
console.log(this.Video.textTracks[0]);
});
}(jQuery));
尝试在_videoInit
中引用that
会产生错误:
使用隐式定义的全局变量
但是:
console.log(this);
在_videoInit
中是指视频本身,因此调用
console.log(this.Video.textTracks[0]);
失败,因为video
没有Video
属性。为了简单起见,我省略了一堆其他代码,但在这次调用之后,我实际上需要一个对小部件的引用,以使用加载到视频中的提示来做一些事情,所以只需要这样做:
console.log(this.textTracks[0]);
不是一个选项。
如何访问上下文以获取视频,然后使用小部件实例的属性对其进行处理?
例如,我该怎么做?
_videoInited: function (evt) {
// pretend up in _create I had: that.Cues=[]
that.Cues = that.Video.textTracks[0].cues;
});
由于如上所述的隐式错误,我不能使用that
,并且由于this
是视频元素引用而不是videoWrapper
窗口小部件引用,所以我不能使用this
。我做不到:
that.Cues = that.Video.textTracks[0].cues;
在CCD_ 12中,因为CCD_。"从对象的方法访问对象属性"似乎是一件很基本的事情。
好的,所以从这个对this-in-javascript-prototype-functions的保留引用中,我得到了jquery绑定方法。这个问题是关于原型的,我认为原型就像静态方法,但它似乎有效。
设置处理程序:
var that = this;
$(this.Video).bind("loadedmetadata", function (event) {
event.widget = that; that._videoInited(event);
});
绑定页面上说现在使用方法上的jquery
var that = this;
$(this.Video).on("loadedmetadata", function (event) {
event.widget = that; that._videoInited(event);
});
然后使用我想要的:
_videoInited: function (evt) {
console.log(evt); // has a new dynamic widget property
console.log(this); // refers to the widget
感觉有点奇怪和松散,但似乎不出所料。