Jquery plugins 从服务器加载jQuery插件默认值(AJAX)

Jquery plugins 从服务器加载jQuery插件默认值(AJAX),jquery-plugins,jquery,Jquery Plugins,Jquery,我正在使用以下格式的私有jQuery插件: (function( $ ){ var defaults = {}; $.fn.cmFlex = function(opts) { this.each(function() { //Element specific options var o = $.extend({}, defaults, opts); //Code here

我正在使用以下格式的私有jQuery插件:

    (function( $ ){
      var defaults = {};

      $.fn.cmFlex = function(opts) {

        this.each(function() {
            //Element specific options
            var o = $.extend({}, defaults, opts);

            //Code here
        });

        //code Here
      };
    })( jQuery );
在首次调用$.cmFlex()之前,我将如何继续从服务器加载默认选项

$.getJSON("http://my.domain.com/prefsUrl?callback=?", function(defaults){
      $.fn.cmFlex = function(opts) {

        this.each(function() {
            //Element specific options
            var o = $.extend({}, defaults, opts);

            //Code here
        });

        //code Here
      };
});
假设prefsUrl返回一个有效的JSONP响应。如果您不熟悉JSONP,我建议您用谷歌搜索它。

您有两个选择:

  • Quick n'dirty和“secure”选项:对服务器进行同步调用。您可以设置一个ajax对象来锁定浏览器,直到它得到答案。jQuery的Ajax方法中有一个名为
    async
    的选项,默认设置为true。如果将其更改为false,JS执行流将挂起,直到您从服务器获得答案。这不是一个很好的解决方案,因为如果您的服务器停机,或者生成这些全局变量是一个很长的过程,那么用户就会等待它
  • 更干净但“不安全”选项:在第一次调用
    cmFlex
    时,检查
    默认值是否为
    null
    。如果是,则调用Ajax方法来填充它,并放置一个执行
    cmFlex
    函数的回调函数。这里的问题是,如果在获得默认值之前再次调用它,您将对服务器进行重复调用
  • 清洁和安全选项:在对象中放置一个标志,类似于
    isLoaded
    ,如果用户第二次调用
    cmFlex
    ,并且该标志设置为
    false
    ,则引发异常,或将此调用添加到队列中进行处理

祝你好运

问题在于,在请求完成之前,函数将不可用,并且您没有任何声明性方法(除了循环请求
typeOf($.cmFlex)
)。