避免污染jQuery命名空间的最佳插件开发实践?

避免污染jQuery命名空间的最佳插件开发实践?,jquery,jquery-plugins,namespaces,Jquery,Jquery Plugins,Namespaces,我创建了一个jQuery插件,允许用户与树交互(创建、更新、删除节点)。至少有十几种与树交互的方法。理想情况下,我不想像现在这样用所有这些特定于树的方法污染jQuery名称空间,因为每个方法都会增加名称空间冲突的机会。我只想要一个激活插件本身的方法,所以我正在寻找重构 $('ol#tree').tree(options) // just a single jQuery method for my plugin is fine… $('li#item4').moveNode('li#item6')

我创建了一个jQuery插件,允许用户与树交互(创建、更新、删除节点)。至少有十几种与树交互的方法。理想情况下,我不想像现在这样用所有这些特定于树的方法污染jQuery名称空间,因为每个方法都会增加名称空间冲突的机会。我只想要一个激活插件本身的方法,所以我正在寻找重构

$('ol#tree').tree(options) // just a single jQuery method for my plugin is fine…
$('li#item4').moveNode('li#item6') // …however, we also have this supporting method
$('ol#tree').appendNode(node) // …and this one
$('li#item2').expandBranch() // …and this one, etc.
对于向激活的DOM元素及其子元素公开一个不会污染jQuery命名空间的接口,有哪些做法

我曾经尝试过保存创建树时返回的jQuery对象

var tree =  $('ol#tree').tree();
此树对象本身将被扩展以包括这些方法。不幸的是,由于树本身正在被定期操纵,这就有可能使该对象的状态与父DOM元素及其子元素的状态不同步。我不确定在该对象中维护状态是否值得,因为DOM本身将始终具有当前状态

我还考虑过使用名称空间(通过John Resig):


你如何处理这个问题?你能给我指出一些解决这个问题的现有插件吗?我可以从它们的代码中学到什么?

使用一个简短明了的名称!不是无聊的,而是例如尼斯树(嘿,这只是一个想法)!将接口放入名称中。像这样:

$("ol#tree").nicetree.appendNode(node);
$("ol#tree").nicetree.item("li#item2").expandBranch();
另一个想法是返回您提议的对象,但不要更新此对象。此对象只是对真实对象或DOM的引用。这增加了一层间接性,您可能会接受,也可能不会接受


作为一个插件用户,我想要两种解决方案,但稍微喜欢第一种。

以下是我提出的问题:

MarioWare = {
  Tree: {
    Methods: {
      nodes: function(){
        var selected = null;
        var context = this[0];
        if (selector === undefined) // tree.nodes();
          selected = $('li', context);
        else if (typeof selector == 'string') // tree.nodes('li:first,li:last');
          selected = $(selector, context);
        else if (typeof selector == 'number') // tree.nodes(2);
          selected = $('li', context).eq(selector);
        return MarioWare.$node(selected);
      },
      appendNode: function(){...}
    }
  },
  $tree: function(selector){
    return $.extend($(selector), MarioWare.Tree.Methods);
  },
  Node: {
    Methods: {
      select: function(multiSelect) {...}
    }
  },
  $node: function(selector){
    return $.extend($(selector), MarioWare.Node.Methods);
  }
}
通过这种方式,它的工作原理与Prototype.js中的一些实用方法类似:

var $tree = MarioWare.$tree; //shortcut
var $node = MarioWare.$node; //shortcut
var tree = $tree('ul:first');
var nodes = tree.nodes();
nodes.eq(0).select();

它总是需要一个实用访问器(例如$tree,$node),但它可以防止jQuery名称空间受到污染。我喜欢访问器澄清我们正在处理的内容的上下文,例如树或节点。

我见过这种方法,也喜欢它。但是,正如我输入的答案所示,我已经解决了一些问题。appendNode()或item()方法如何引用包含所选元素的jQuery对象(在本例中为$(“ol#tree”)?这些函数中的“this”似乎无法让您返回足够远的地方来找到jQuery对象,而只是nicetree对象,它是从jQuery原型创建的静态对象。要实现这一点,所有返回值必须使用适当的实用程序方法重新包装结果。e、 g.“select”将返回“$node(result)”。我还必须重写基本jQuery函数(如“eq”)以返回包装结果。啊!有点笨重,但它能用。
var $tree = MarioWare.$tree; //shortcut
var $node = MarioWare.$node; //shortcut
var tree = $tree('ul:first');
var nodes = tree.nodes();
nodes.eq(0).select();