jquery订阅发布插件代码草稿!
jquery订阅发布插件代码草稿,为jquery扩展jquery.publish,jquery.subscribe方法
---
jquery订阅发布插件代码草稿
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello </title>
<link rel="stylesheet" type="text/css" href="css/reset.css" />
<script type="text/javascript" src="js/jquery-1.4.2.js"></script>
<!--
<script type="text/javascript" src="js/init.js"></script>
-->
</head>
<body>
<script type="text/javascript">
(function ($) {
var opts = Object.prototype.toString;
$.global = this;
$.isString = jQuery.fn.isString = function (/*anything*/it) {
return (typeof it == "string" || it instanceof String); // Boolean
}
$.isArray = jQuery.fn.isArray = function (/*anything*/it) {
return it && (it instanceof Array || typeof it == "array"); // Boolean
}
$.isFunction = jQuery.fn.isFunction = function (/*anything*/it) {
return opts.call(it) === "[object Function]";
};
$.isObject = jQuery.fn.isObject = function (/*anything*/it) {
return it !== undefined &&
(it === null || typeof it == "object" || $.isArray(it) || $.isFunction(it)); // Boolean
}
$.isArrayLike = jQuery.fn.isArrayLike = function (/*anything*/it) {
return it && it !== undefined && // Boolean
!$.isString(it) && !$.isFunction(it) &&
!(it.tagName && it.tagName.toLowerCase() == 'form') &&
($.isArray(it) || isFinite(it.length));
}
$.isAlien = jQuery.fn.isAlien = function (/*anything*/it) {
return it && !$.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
}
$._listener = {
// create a dispatcher function
getDispatcher: function () {
return function () {
var ap = Array.prototype, c = arguments.callee, ls = c._listeners, t = c.target;
// return value comes from original target function
var r = t && t.apply(this, arguments);
// make local copy of listener array so it is immutable during processing
var i, lls;
lls = [].concat(ls);
// invoke listeners after target function
for (i in lls) {
if (!(i in ap)) {
lls[i].apply(this, arguments);
}
}
// return value comes from original target function
return r;
};
},
// add a listener to an object
add: function (/*Object*/source, /*String*/method, /*Function*/listener) {
source = source || $.global;
var f = source[method];
if (!f || !f._listeners) {
var d = $._listener.getDispatcher();
d.target = f;
// dispatcher holds a list of listeners
d._listeners = [];
// redirect source to dispatcher
f = source[method] = d;
}
return f._listeners.push(listener); /*Handle*/
},
remove: function (/*Object*/source, /*String*/method, /*Handle*/handle) {
var f = (source || $.global)[method];
if (f && f._listeners && handle--) {
delete f._listeners[handle];
}
}
};
$.connect = jQuery.fn.connect = function (/*Object|null*/obj,
/*String*/event,
/*Object|null*/context,
/*String|Function*/method,
/*Boolean?*/dontFix) {
var a = arguments, args = [], i = 0;
args.push($.isString(a[0]) ? null : a[i++], a[i++]);
var a1 = a[i + 1];
args.push($.isString(a1) || $.isFunction(a1) ? a[i++] : null, a[i++]);
for (var l = a.length; i < l; i++) { args.push(a[i]); }
return $._connect.apply(this, args); /*Handle*/
}
$._connect = function (obj, event, context, method) {
var l = $._listener, h = l.add(obj, event, $.hitch(context, method));
return [obj, event, h, l]; // Handle
}
$.disconnect = jQuery.fn.disconnect = function (/*Handle*/handle) {
if (handle && handle[0] !== undefined) {
$._disconnect.apply(this, handle);
delete handle[0];
}
}
$._disconnect = function (obj, event, handle, listener) {
listener.remove(obj, event, handle);
}
$._hitchArgs = function (scope, method /*,...*/) {
var pre = $._toArray(arguments, 2);
var named = $.isString(method);
return function () {
var args = $._toArray(arguments);
var f = named ? (scope || $.global)[method] : method;
return f && f.apply(scope || this, pre.concat(args)); // mixed
} // Function
}
var efficient = function (obj, offset, startWith) {
return (startWith || []).concat(Array.prototype.slice.call(obj, offset || 0));
};
$._toArray =
/*$.isIE ? function (obj) */
$.browser.msie ? function (obj) {
return ((obj.item) ? slow : efficient).apply(this, arguments);
} :
efficient;
$.hitch = jQuery.fn.hitch = function (/*Object*/scope, /*Function|String*/method /*,...*/) {
if (arguments.length > 2) {
return $._hitchArgs.apply($, arguments); // Function
}
if (!method) {
method = scope;
scope = null;
}
if ($.isString(method)) {
scope = scope || $.global;
if (!scope[method]) { throw (['$.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
return function () { return scope[method].apply(scope, arguments || []); }; // Function
}
return !scope ? method : function () { return method.apply(scope, arguments || []); }; // Function
}
$._topics = {};
$.subscribe = jQuery.fn.subscribe = function (/*String*/topic, /*Object|null*/context, /*String|Function*/method) {
return [topic, $._listener.add($._topics, topic, $.hitch(context, method))]; /*Handle*/
}
$.unsubscribe = jQuery.fn.unsubscribe = function (/*Handle*/handle) {
if (handle) {
$._listener.remove($._topics, handle[0], handle[1]);
}
}
$.publish = jQuery.fn.publish = function (/*String*/topic, /*Array*/args) {
var f = $._topics[topic];
if (f) {
f.apply(this, args || []);
}
}
$.connectPublisher = jQuery.fn.connectPublisher = function ( /*String*/topic,
/*Object|null*/obj,
/*String*/event) {
var pf = function () { $.publish(topic, arguments); }
return event ? $.connect(obj, event, pf) : $.connect(obj, pf); //Handle
};
})(jQuery);
function Tom(topic) {
this.topic = topic;
this.hello = function () {
alert("Hello,I'm Tom!");
//Tom直接发布信息,不针对某个具体的目标
$.publish(this.topic);
}
}
function Jerry(topic) {
this.topic = topic;
this.hello = function () {
alert("Hello,I'm Jerry");
}
//Jerry直接预订信息,但不针对某个具体的来源
$.subscribe(this.topic, this, "hello");
}
var tom = new Tom("/hello");
var jerry = new Jerry("/hello");
tom.hello();
</script>
</body>
</html>
--
--