2012-07-23 60 views
1

我想提出一個表單驗證功能,並有下面的代碼爲它jQuery插件和封鎖

(function ($) { 
    $.fn.validate_thing = function (success_call_back) { 
     var call_back = true; 
     debugger; 
     if (!this.is('form')) { 
      return false; 
     } 

     $('input.empty').each(function() { 
      if(!$(this).text()) { 
       alert($(this).attr('name')); 
       call_back = false; 
      } 
     }); 
    } 
})(jQuery); 

的問題是,在頁面加載時我得到一個JavaScript錯誤說「對象不是一個函數」在(jQuery)線上。如果我通過調試器完成這一步,我不會遇到這個問題。如果我把它放在文檔就緒函數中,我不會遇到這個問題。我認爲這可能與jQuery沒有被加載的腳本運行有關,但我在包含此代碼的庫之前包含jQuery庫,更不用說如果我不在閉包中執行此操作,即這樣做

$.fn.validate_thing = function (success_call_back) { 
    var call_back = true; 
    debugger; 
    if (!this.is('form')) { 
     return false; 
    } 

    $('input.empty').each(function() { 
     if(!$(this).text()) { 
      alert($(this).attr('name')); 
      call_back = false; 
     } 
    }); 
} 

它的工作原理。

所以我有幾個解決這個問題的方法,但我仍然想知道爲什麼會發生這種情況。提前致謝。

這裏是如果你在上線得到一個錯誤,我以前也有在JavaScript頁面

engine = new function() { 
this.request = function (params) { 
    var data = params.data ? params.data : ''; 

    if (params.url) { 
     var url = params.url; 
     var page = document.URL.split('/').pop(); 
     var page = page.split('.')[0]; 
     data += 'content_page='+page+'.tpl'; 
    } 
    else { 
     var url = document.URL; 
    } 

    debugger; 
    if (params.action) { 
     data += data ? '&action='+params.action : "action="+params.action; 
    } 

    $.ajax({ 
     url : url, 
     type : 'POST', 
     data : data, 
     dataType: 'json', 
     success : function(data) { 
      debugger; 
      if (data && data.partials) { 
       for (var key in data.partials) { 
        var element = data.partials[key]; 
        $('#'+element.partial_name).replaceWith(element.partial_content); 
       } 
      } 
     }, 
     error : function (jqXHR, textStatus, errorThrown) { 
      debugger; 

      alert('ajax error: '+errorThrown); 
     } 
    }).success(params.success); 
} 
} 
+0

你在那之前還有其他的代碼嗎?如果在最後一行出現錯誤,它可能會將括號'(function(){...})解釋爲代碼之前的任何函數調用(我承認,這是一個長鏡頭)。 – 2012-07-23 23:56:26

+0

'(function($){})(jQuery);'立即執行一個函數,傳入'jQuery'對象(在函數內部是'$')。對於你在做什麼,我認爲沒有必要使用附件 – MrOBrian 2012-07-24 00:06:26

+0

@MrOBrian:在定義jQuery插件時通常會這樣做。全局'$'可能不會引用jQuery。 – 2012-07-24 00:16:43

回答

0

,很可能是JavaScript的解釋括號(function() { ... })作爲函數調用任何的前面的代碼。如果您在前一行中忘記了分號,就會發生這種情況。

考慮一下:

var foo = {}; 
var bar = foo 
(function() { 

}()); 

注意,分號foo後缺少,因此JavaScript的解釋代碼foo(...),這引發錯誤

對象是不是一個函數