是否可以使用jQuery实现以下目的: 我想创建两个具有不同功能且具有相同名称的不同对象。
var item = new foo();
item.doSomething();
var item2 = new bar();
item2.doSomething();
此外,我希望能够将创建的项目用作“常规”jQuery对象 - 例如,拖动项目并在拖动停止时执行正确的doSomething()函数。
答案 0 :(得分:16)
我们已经找到了解决问题的方法。 它由3个独立的步骤组成: 首先,必须创建初始jQuery项:
var item = $.create("div");
然后创建一个你想要创建的javascript对象的实例,并将它的所有函数和属性复制到jQuery项:
$.extend( item, new foo.bar() );
最后,初始化对象。请注意,上一步中的构造函数不能用于此,因为“this”对象是不同的。
item.initialize();
在此之后,对象$(item)可以像常规jQuery对象一样使用,而且它具有函数和局部变量,如常规javascript对象。
item.doSomething(); var offset = $(item).offset();
因此,您可以创建具有可由jQuery使用的“类”的DOM对象。 顺便说一句,我们使用DUI来创建名称空间。
希望有人会发现解决方案很有帮助。它使我们的代码更好。
答案 1 :(得分:5)
我仍然是JS和jQuery的新手,所以请随意拍下我(也就是'提供建设性的批评'),但我发现这适用于构建JS对象以便在屏幕上显示表示:
function SomeClass (params) {
// other properties and functions...
this.view = function () {
var e = $('<div />', {
'class': 'someClass'
});
return e;
}();
}
var someClassInstance = new SomeClass(params);
$('#someClassContainer').append(someClassInstance.view);
来自更传统的OOP背景,并习惯使用MVC模式,这对我来说很友好。任何建议欢迎...
答案 2 :(得分:3)
这是Building Object-Oriented jQuery Plugins
(function($){
var MyPlugin = function(element, options){
var elem = $(element);
var obj = this;
var settings = $.extend({
param: 'defaultValue'
}, options || {});
// Public method - can be called from client code
this.publicMethod = function(){
console.log('public method called!');
};
// Private method - can only be called from within this object
var privateMethod = function(){
console.log('private method called!');
};
};
$.fn.myplugin = function(options){
return this.each(function(){
var element = $(this);
// Return early if this element already has a plugin instance
if (element.data('myplugin')) return;
// pass options to plugin constructor
var myplugin = new MyPlugin(this, options);
// Store plugin object in this element's data
element.data('myplugin', myplugin);
});
};
})(jQuery);
测试用法
$('#test').myplugin();
var myplugin = $('#test').data('myplugin');
myplugin.publicMethod(); // prints "publicMethod() called!" to console
还有一个基于此模式的插件Tagger基于此模式。
答案 3 :(得分:2)
<script type="text/javascript">// <![CDATA[
//Lets consider it as our class wrapper
(function( $ ) {
$.fn.testClass = function( initvar ) {
this.testMethod = function(status) {
this.test = status;
//lets call a method of a class
this.anotherMethod();
};
this.anotherMethod = function() {
alert("anotherMethod is called by object " + this.test);
};
this.getVars = function() {
alert("Class var set in testMethod: I am object " + this.test + "\nClass var set in constractor: " + this.class_var);
};
//lets init some variables here, consider it as a class constractor
this.class_var = initvar;
//THIS IS VERY IMPORTANT TO KEEP AT THE END
return this;
};
})( jQuery );
$(function() {
//Now lets create objects
var object1 = $(document.body).testClass("1");
var object2 = $(document.body).testClass("2");
//lets call method testMethod
object1.testMethod("1");
object2.testMethod("2");
//lets lets see what we have at the end
object1.getVars();
object2.getVars();
});
// ]]></script>
答案 4 :(得分:1)
不确定Object Orientation部分,但是jQuery已经支持你所描述的那种拖放功能。
使用JQuery添加拖放支持 http://geekswithblogs.net/AzamSharp/archive/2008/02/21/119882.aspx
答案 5 :(得分:1)
我更喜欢比JohnnyYen等人提出的更简单的方法
基本上,我创建了一个类并将DOM元素分配给属性。
例如
/* CONSTRUCTOR: Tile */
function Tile(type, id){
this.type = type;
this.id = id;
this.DOM = $('#' + id);
}
/* METHOD: nudge */
Tile.prototype.nudge = function(direction){
var pos = this.DOM.offset();
var css_top = this.DOM.css("top");
var top = css_top.substring(0 , css_top.indexOf('px'));
var css_left = this.DOM.css("left");
var left = css_left.substring(0 , css_left.indexOf('px'));
var width = this.DOM.width();
var height = this.DOM.height();
switch(direction){
case 'up':
this.DOM.css({ "top": (+top - 75) + "px" });
break;
case 'left':
this.DOM.css({ "left": (+left - 75) + "px" });
break;
case 'right':
this.DOM.css({ "left": (+left + 75) + "px" });
break;
case 'down':
this.DOM.css({ "top": (+top + 75) + "px" });
break;
}
}
注意:这是未经测试的代码,但它说明了我的观点。
答案 6 :(得分:0)
我知道这个问题很老,但这就是我构建客户端代码的方式。
我使用自己的oop框架来构建我的控制器/应用程序。如果我将一个类设置为单例,它将在doc ready上执行,并作为我的客户端应用程序的入口点。
https://github.com/KodingSykosis/jOOP
任何需要全局访问的代码,我使用$ .extend或$ .fn.extend扩展jQuery。
api.jquery.com/jQuery.extend
查看或演示样式代码,我使用jQueryUI小部件工厂。我的控制器类的任务是创建窗口小部件实例化所需的任何元素。通过使用事件或回调来促进任何沟通。