如果在文档外部声明,则Jquery函数将不起作用

时间:2016-10-12 17:59:07

标签: javascript jquery function scope

我们有一个简单的Jquery函数来序列化表单的输入,并在$(document).ready()

之外声明它
(function( $ ){
   $.fn.serializeObject = function() {
     var formObj = {};
     var a = this.serializeArray();
     $.each(a, function() {
       if (formObj[this.name] !== undefined) {
         if (!formObj[this.name].push) {
           formObj[this.name] = [formObj[this.name]];
         }
         formObj[this.name].push(this.value || '');
       } else {
         formObj[this.name] = this.value || '';
       }
     });
     return formObj;
   };
})( jQuery );

我们已多次使用此功能,并在提交表格时调用:

$(document).ready(function(){

  $('#test').submit(function(){
      var vars = $(this).serializeObject();
      console.log(vars);
      return false;
  });

});

这总是有效但我们正在开发一个新项目,我们收到以下错误:

  

未捕获的TypeError:$(...)。serializeObject不是函数

这是fiddle

在新项目中,只有当serializeObject函数在文档就绪

内时才有效
$(document).ready(function(){

 (function( $ ){
   $.fn.serializeObject = function() {
     var formObj = {};
     var a = this.serializeArray();
     $.each(a, function() {
       if (formObj[this.name] !== undefined) {
         if (!formObj[this.name].push) {
           formObj[this.name] = [formObj[this.name]];
         }
         formObj[this.name].push(this.value || '');
       } else {
         formObj[this.name] = this.value || '';
       }
     });
     return formObj;
   };
  })( jQuery );

  $('#test').submit(function(){
      var vars = $(this).serializeObject();
      console.log(vars);
      return false;
  });

});

我们使用相同版本的Jquery而没有其他外部库。 有任何想法吗?感谢

1 个答案:

答案 0 :(得分:2)

您不止一次包含jQuery,而且这里发生了什么。这可以"删除"插件也是如此。

  1. 您包含jQuery
  2. 定义函数并将其附加到jQuery函数/对象。
  3. 你再次包含jQuery。这个新的jQuery不包含你附加到另一个jQuery实例的函数。