jQuery对象插件不是持久的

时间:2013-12-06 12:48:04

标签: javascript jquery jquery-plugins

我正在尝试使用自定义属性和函数扩展jquery元素,以便我可以随时跟踪元素并获取自定义属性。

目前我已经这样做了:

 jQuery.fn.designerElement = function (tpl, cls) {
      this.__template = tpl
      this.des__class = cls;
      this.compile = function () {
          this.html(this.__template(this));
          return this;
      }

      return this;
  };

  var template = Handlebars.compile(
      '<div id="' + +new Date() + '" class="{{des__class}}"></div>'
  );

  var el = $('<div></div>').designerElement(template, "form-container");

  el.attr('id', "test");

  el.compile();

  $('body').append(el);

现在,如果我打电话给$('#test').compile(),它说方法未定义。

这是一个小提琴:http://jsfiddle.net/jmorvan/HLVj4/

为了解释我的上下文,我需要在对象上直接使用方法和属性才能使某些dataBinding工作,这就是为什么我不能使用.data()。在我看来,jquery插件将是最好的方法,但我绝对错过了一些东西。

所以要明确我需要能够访问这样的属性:$('#test').__template以及函数。

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

我想你已经知道发生了什么,但这里有一个简短的解释:使用$('#test')你正在创建一个新的jQuery对象。它包含相同的元素,但您要定义jQuery对象的属性,而不是元素。所以你要问的是,是否有一种方法可以为元素添加功能,但附加了jQuery对象。在jQuery中data()毕竟可以用来做到这一点:

jQuery.fn.designerElement = function (tpl, cls) {
    this.__template = tpl
    this.des__class = cls;
    this.compile = function () {
        this.html(this.__template(this));
        return this;
    }
    this.data('this', this);
    return this;
};

使用以下命令检索该对象:

var test = $('#test').data('this');

这是the fiddle

另一种解决方案是将所有这些对象存储在全局可用的数组或JSON对象中。