现在的位置: 首页 > 综合 > 正文

jquery订阅发布插件代码草稿,为jquery扩展jquery.publish,jquery.subscribe方法

2012年11月07日 ⁄ 综合 ⁄ 共 5161字 ⁄ 字号 评论关闭

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>

 

--

-- 

抱歉!评论已关闭.