实例检查附加到数据属性的 jQuery 插件实例
instanceof check for jQuery plugin instances attached to data attribute
我创建了一个jQuery插件,它在内部使用类实例化,大致如下:
;(function ($, window, document, undefined) {
'use strict';
function MyPlugin(element, options) {
this.settings = $.extend({}, options);
this.$el = $(element);
this.init();
return this;
}
MyPlugin.prototype = {
init: function(){},
method1: function(){},
method2: function(){}
}
$.fn.myplugin = function (options, val) {
return this.each(function () {
if(typeof options === 'object'){
if (undefined == $(this).data('myplugin')) {
var plugin = new MyPlugin(this, options);
$(this).data('myplugin', plugin);
}
}
});
}
})(jQuery, window, document);
现在,从外部JavaScript代码中,我想确定.data('myplugin')
可用的对象是否是MyPlugin的实例。即使控制台在扩展三角形前面清楚地注销"MyPlugin",以下代码:
$(el).data('myplugin') instanceof MyPlugin
错误中断,声称未定义 MyPlugin。(很可能是因为原型已在封装中定义)
那么检查instanceof
的正确方法是什么?
注释作为答案:您的 MyPlugin 函数被周围的匿名函数隐藏。给它一个名字,并将其视为命名空间。我不声称自己是原始Javascript对象的专家(因为我使用TypeScript来简化所有这些混乱):
JSFiddle: http://jsfiddle.net/TrueBlueAussie/o6s4yep4/3/
;var mynamespace = function ($, window, document, undefined) {
'use strict';
mynamespace.MyPlugin = function(element, options) {
this.settings = $.extend({}, options);
this.$el = $(element);
this.init();
return this;
}
mynamespace.MyPlugin.prototype = {
init: function () {},
method1: function () {},
method2: function () {}
}
$.fn.myplugin = function (options, val) {
return this.each(function () {
if (typeof options === 'object') {
if (undefined == $(this).data('myplugin')) {
var plugin = newmynamespace.MyPlugin(this, options);
$(this).data('myplugin', plugin);
}
}
});
}
};
mynamespace(jQuery, window, document);
var $el = $('#el');
$el.click(function () {
$(el).myplugin();
debugger;
alert($(el).data('myplugin') instanceof mynamespace.MyPlugin);
});
注意:我不确定为什么当您单击元素时会导致 false,但这至少对您来说是一个很好的起点。
如果我做对了:
var MyPlugin;
;(function ($, window, document, undefined) {
'use strict';
MyPlugin = function(element, options) {
this.settings = $.extend({}, options);
this.$el = $(element);
this.init();
return this;
}
// rest of code goes here
相关文章:
- 使用jQuery获取Dropzone实例/对象
- 不再需要时使用jQuery/kill实例
- 使用jQuery在类的每个实例上添加随机CSS
- jQuery"焦点”;在一个实例中有效,但在其他实例中无效
- 单击按钮创建多实例jQuery UI对话框
- Jquery将事件绑定到页面上的多个实例
- Jquery类选择器无法选择用.append()添加的新类实例
- jQuery多点击实例
- jquery获取类的下一个实例的值
- 在 jQuery 中将文本框作为实例传递
- Jquery插件使用第二个实例's选项
- Browserify:如何 aviod 两个 jQuery 实例
- 为什么e.fn.e.init或x.fn.x.init(chrome调试器中的jQuery实例名称)中有第二个e或x
- 触发不同实例设置的 jQuery 自定义事件
- 如何动态引用 jQuery 插件实例
- Jquery:在一个字符串中查找所有实例模式,提示用户替换模式的所有实例,然后进行替换
- 使用 JQuery 在 5 秒后隐藏元素的实例
- jQuery插件实例并删除/销毁它们
- Reset All按钮从JS literal添加一个新的实例jQuery
- 获取可见的特定选择器的实例(jQuery)