`
jxncau
  • 浏览: 11621 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

jQuery namespace

    博客分类:
  • js
阅读更多
jQuery encourages using namespaces for methods in the $ namespace, like $.foo.bar() rather than $.bar(). This works for $ because methods don't expect this to refer to anything specific, and the way javascript works is to assign this to the last-named object, so in $.foo.bar(), this refers to $.foo.

This idea fails for plugins, however, since plugins expect this to refer to the jQuery object that started the chain. If I define $.fn.bar = function(){}, then when $(...).bar() is called, this refers to $(...), just as we want. But if I define $.fn.foo.bar = function(){}, then when $(...).foo.bar() is called, this refers to $(...).foo, which is an object that knows nothing about jQuery. There's no way to make an object reference return something else.

But all is not lost. We can define a function that returns an object, and that function can use this to set the returned object to be just like a jQuery object, but with the desired namespaced methods in it. The inefficient way to do that is to copy the new methods into the jQuery object, but if we can manipulate the prototype chain directly (as we can in Firefox) we can add our new methods to the chain without copying.

So a namespacing plugin would be:

[javascript] view plaincopyprint?(function ($) { 
    if({}.__proto__) { 
        // mozilla & webkit expose the prototype chain directly  
        $.namespace=function (name) { 
            $.fn[name]=function namespace() { 
                // insert this function in the prototype chain  
                this.__proto__=arguments.callee; 
                return this; 
            }; 
            $.fn[name].__proto__=$.fn; 
        }; 
        $.fn.$=function () { 
            this.__proto__=$.fn; 
            return this; 
        }; 
    } 
    else { 
        // every other browser; need to copy methods  
        $.namespace=function (name) { 
            $.fn[name]=function namespace() { 
                return this.extend(arguments.callee); 
            }; 
        }; 
        $.fn.$=function () { 
            // slow but restores the default namespace  
            var len=this.length; 
            this.extend($.fn); 
            this.length=len; 
            // $.fn has length = 0, which messes everything up  
            return this; 
        }; 
    } 
})(jQuery); 
(function ($) {
if({}.__proto__) {
// mozilla & webkit expose the prototype chain directly
$.namespace=function (name) {
$.fn[name]=function namespace() {
// insert this function in the prototype chain
this.__proto__=arguments.callee;
return this;
};
$.fn[name].__proto__=$.fn;
};
$.fn.$=function () {
this.__proto__=$.fn;
return this;
};
}
else {
// every other browser; need to copy methods
$.namespace=function (name) {
$.fn[name]=function namespace() {
return this.extend(arguments.callee);
};
};
$.fn.$=function () {
// slow but restores the default namespace
var len=this.length;
this.extend($.fn);
this.length=len;
// $.fn has length = 0, which messes everything up
return this;
};
}
})(jQuery);

And you could use it like:

[javascript] view plaincopyprint?$.namespace('danny'); 
$.namespace('danny2'); 
$.fn.danny.foo=function () { 
    return this.css('color','green') 
}; 
$.fn.danny2.foo=function (x) { 
    alert(x); 
    return this; 
}; 
// now we have two different methods "foo"  
$('p').danny().foo(); 
// colors paragraphs green  
$('p').danny2().foo('Hello, world'); 
// alerts 'Hello, world'  
$('p').danny().foo().danny2().foo('Hello, world'); 
// chaining works  
$.fn.danny.add=function (a,b) { 
    alert(a+b); 
    return this; 
}; 
// defines a function with the same name as a real jQuery one  
$('p').danny().add(1,2).$().add('div'); 
// the $() plugin restores the real jQuery namespace to a chain  
$.namespace('danny');
$.namespace('danny2');
$.fn.danny.foo=function () {
return this.css('color','green')
};
$.fn.danny2.foo=function (x) {
alert(x);
return this;
};
// now we have two different methods "foo"
$('p').danny().foo();
// colors paragraphs green
$('p').danny2().foo('Hello, world');
// alerts 'Hello, world'
$('p').danny().foo().danny2().foo('Hello, world');
// chaining works
$.fn.danny.add=function (a,b) {
alert(a+b);
return this;
};
// defines a function with the same name as a real jQuery one
$('p').danny().add(1,2).$().add('div');
// the $() plugin restores the real jQuery namespace to a chain 

The namespacing is per-chain only; $('p').danny() does not affect any subsequent statements. Plugins that call pushStack will reset the namespacing, but in general the namespace function should be called right before the method, so that should not be an issue.

This is inefficient, obviously, adding an extra function call and possible a lot of copying with extend, but for most code that is insignificant.
分享到:
评论

相关推荐

    jQuery完全实例.rar

    jQuery1.2 API 中文版折叠展开折叠全部展开全部 英文说明 核心jQuery 核心函数 jQuery(expression,[context]) jQuery(expression,[context]) 这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组...

    jquery-rss:jquery的易于使用的rss插件,带有模板

    jquery.rss 该插件可用于读取RSS提要并将其转换为自定义HTML。备择方案该库的原始JavaScript版本可以在以下位置找到: 。... // This will add the plugin to the jQuery namespace通过cdnjs: <script src="h

    JQuery In Action.PDF

    By using the `.noConflict()` method, developers can integrate JQuery seamlessly with other libraries without namespace conflicts. - **Example:** `var jq = $.noConflict(); jq(document).ready(function...

    jquery在sp中的应用图解

    《jQuery在SharePoint中的应用详解》 在现代Web开发中,jQuery是一个不可或缺的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互等任务。在SharePoint环境中,jQuery的应用同样广泛且强大,可以...

    利用jquery扩展的验证工具库

    该工具库的namespace及主要功能如下: $.brady.util: 放置常用的工具 bindDyanPrompt: 把一段信息用一个动态的面板内显示出来,直接指定容器就行了 toFixedWidth: 定义一个返回定长的字符串工具函数 formatDate: ...

    struts2+ajax+jquery

    <package name="default" namespace="/" extends="struts-default"> <result type="json">/success.jsp</result> <!-- JSON结果 --> ``` 这里的`MyAction`类会处理请求并设置模型数据,然后Struts2的JSON插件...

    Jquery与struts2

    <package name="default" namespace="/" extends="struts-default"> <!-- ... --> <param name="includeProperties">key ``` 这将使Struts2以JSON格式返回数据,只包含`key`属性。 #### 4. ...

    struts2+jquery实现ajax

    <package name="default" namespace="/" extends="struts-default"> ``` 6. **处理响应数据**: 在jQuery的`success`回调函数中,你可以获取并处理返回的JSON数据,更新DOM或者其他前端逻辑。例如,如果...

    jquery javascript .Net 图片截图

    这通常涉及到图像处理库,例如System.Drawing namespace中的类。开发者可以使用Bitmap对象加载原始图片,然后基于接收到的坐标创建一个新的Bitmap对象,只包含用户选定的部分。最后,截取的图片会被保存,并生成一个...

    jQuery读取XML

    - 在处理XML数据时,需注意可能出现的命名空间问题,可能需要使用`$.ajax()`的`namespace`选项或处理命名空间的函数。 - 为了兼容旧版本的jQuery,确保你的jQuery库版本支持`$.ajax()`和`$.get()`方法的XML处理。 ...

    jquery跨域调用webservice

    [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 [System.Web....

    jquery的ajax传json对象数组到struts2的action

    <package name="default" namespace="/" extends="json-default"> <!-- ... --> ``` 然后,创建一个Action类,声明一个List类型的属性,用来接收前端发送的JSON数组: ```java public class UserAction extends ...

    ( Struts2+JQuery插件的使用

    <package name="jquery" extends="struts-default,json-default" namespace="/"> <!-- 其他配置 --> ``` 在JSP页面中,我们需要引入Struts的标签库和Struts jQuery插件的标签库: ```jsp ...

    jQuery学习记录----处理XML数据(二)

    在实际应用中,我们可能还需要处理XML命名空间(Namespace)问题,因为某些XML文档会定义自己的命名空间以避免元素名冲突。这时,我们需要在选择器中指定命名空间,如`$("ns:element", xml)`,其中`ns`是命名空间...

    VS 2008_JS、Jquery提示

    只需在JavaScript文件中使用JSDoc注释格式,如`@namespace`、`@class`和`@member`,VS将自动识别这些注释并提供提示。 ### 4. **使用JS Debugging** VS 2008允许你在浏览器中调试JavaScript代码。在HTML文件中设置...

    jquery1.11.0手册

    jQuery 1.11.0 速查表 核心 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 each(callback) size() length selector ...

    asp.net+jquery+ajax所有调用例子

    [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class WebService : System.Web.Services....

    jquery命名空间模拟

    本篇文章将深入探讨如何在JavaScript中模拟jQuery的命名空间,以实现更有序、更安全的代码组织。 首先,我们需要理解JavaScript的命名空间是如何工作的。由于JavaScript本身没有内置的命名空间机制,我们通常通过...

    struts2使用jquery整合ajax、json用户登录实例源码

    <package name="default" namespace="/" extends="struts-default"> <param name="includeProperties">success,message ``` 这里,LoginAction是处理登录的Action,result类型设置为json,表示将返回JSON...

    struts2整合jquery

    <package name="default" namespace="/" extends="struts-default"> <result type="json"></result> ``` **2. 添加jQuery框架** 在HTML页面中引入jQuery库,以便在客户端使用jQuery进行Ajax请求。例如,在...

Global site tag (gtag.js) - Google Analytics