0

我正在创作一个实例化地图的插件。然后,该地图将提供移动到地球上另一个地方的功能。

该脚本使地图很好。但是,我不能“附加”元素上的函数,以供回调中的另一个插件使用。

这是我尝试过的方法;在插件中:

(function($){
  $.fn.mapDo(options){
    map = new BlahMap(this.get(0));

    this.moveTheMap = function(place){
      map.moveItToThat(place);
    }; // nope.
  }
})(jQuery);

那么,鉴于:

$(map).mapDo();

$(otherElement).otherControl({
  callback: function(place){
    $(map).moveTheMap(place); // moveTheMap is not there on $(map)!
  }
};

问题

如果可能,如何向地图 jQuery 或 DOM 元素添加函数?如果没有,我该如何提供这种功能?

更重要的是,通过这种方式分离事物,我是否走在正确的道路上?我对 Javascript 有点陌生,这些任务通常是如何在保持组件分开的同时完成的?

虽然这是我的尝试,但更一般地说,我在从 jQuery 插件输出内容的同时保持可链接性的概念上苦苦挣扎。在这种情况下,我想做的是从插件中输出一个回调,该回调将在稍后的执行中作用于被调用的元素。

4

2 回答 2

1

您可以存储mapwith.data方法。

(function($){
  $.fn.mapDo = funciont(options) {
    this.data('map', new BlahMap(this.get(0)));
    return this;
  };
  $.fn.moveTheMap = function(place) {
      var map = this.data('map');
      if (map) {
         map.moveItToThat(place);
      }
      return this;
  };
})(jQuery);
于 2012-08-02T09:10:07.490 回答
1

插件通常只向 jQuery 原型添加一个方法,并且对插件实例的方法调用是用字符串完成的。

(function($) {
    $.fn.mapDo = function(options) {
        var args = [].slice.call(arguments, 1); //Get all the arguments starting from 2nd argument as an array
        return this.each(function() {
            var $this = $(this),
                instance = $this.data("map-instance");
            if (!instance) {
                $this.data("map-instance", (instance = new BlahMap(this, options)));
            }
            if (typeof options == "string") {
                instance[options].apply(instance, args);
            }
        });
    };
})(jQuery);

$(elem).mapDo( "moveTheMap", place ); //This would also instantiate the plugin if it wasn't instantiated

这是 jsfiddle 展示它的实际效果:

http://jsfiddle.net/X8YA8/1/

于 2012-08-02T09:10:20.067 回答