2012-10-03 93 views
26

的特性 '節點名稱' 我有以下代碼:jQuery的驗證遺漏的類型錯誤:無法讀取空

$(document).ready 
(
    function() 
    { 
     $.validator.addMethod(
     "lessThan", 
     function (value, element, param) 
     { 
      // bind to the blur event of the target in order to revalidate whenever the target field is updated    
      var target = $(param) 
      .unbind(".validate-lessThan") 
      .bind 
      (
       "blur.validate-lessThan", 
       function() 
       { 
        $(element).valid(); 
       } 
      ); 
      return parseFloat(value) <= parseFloat(target.val()); 
     }, 
     "Valoarea trebuie sa fie mai mica sau egala decat valoarea initiala" 
     ); 
    } 
); 


$('#gvListDetaliiElemTranAdaugare input[name$=Valoare]').each 
    (
     function (index, domEle) 
     { 
      $(this).rules 
      (
       "add" 
       , { 

        required: true, 
        minlength: 1, 
        range: [0.1, Number.MAX_VALUE], 
        lessThan: '#ListaDetaliiElemTranModelAdaugare_' + index + '__ValoareRamasa', 
        messages: 
        { 
         required: "Valoarea este necesara!", 
         minlength: "Valoarea este necesara!", 
         range: "Valoarea este necesara!", 
         lessThan: "Valoarea trebuie sa fie mai mica sau egala cu " + $('#ListaDetaliiElemTranModelAdaugare_' + index + '__ValoareRamasa').val() 


        } 
       } 
      ); 
     } 
    ); 

的代碼,然後失敗,reeaches $(本).rules()有:Uncaught TypeError: Cannot read property 'nodeName' of null。 通過$('#gvListDetaliiElemTranAdaugare input[name$=Valoare]')返回的HTML是:

[ 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_0__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[0]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 18590 , 0)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_1__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[1]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 22972 , 1)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_2__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[2]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 23036 , 2)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_3__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[3]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 23038 , 3)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_4__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[4]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 425306 , 4)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_5__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[5]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 425308 , 5)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_6__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[6]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 425309 , 6)​" type=​"text" value=​"0.00000000000">​ 
, 
<input data-type=​"decimal" id=​"ListaDetaliiElemTranModelAdaugare_7__Valoare" name=​"ListaDetaliiElemTranModelAdaugare[7]​.Valoare" onchange=​"OnValoareChange($(this)​.val()​, 425310 , 7)​" type=​"text" value=​"0.00000000000">​ 
] 
+0

爲什麼你不只是添加驗證功能及其規則作爲json中的屬性? –

+0

,因爲我需要一個示例 –

+0

檢查此頁http://jquery.bassistance.de/validate/demo/ –

回答

69

我已經找到了問題。

問題是我試圖驗證的HTML沒有包含在<form>...</form>標記中。

只要我這樣做,我有一個context不是空的。

+4

這個人抓住了我近2個小時......元素必須在表單內。 Duhhhh :(感謝分享!:)只是提及:在我的情況下,我試圖添加一個規則到輸入文件。這是我在Firebug上得到的如此有用的錯誤:在這個jQuery行上''elem null':'f(elem.nodeType && elem.nodeType!== 1 && elem.nodeType!== 9)' –

+2

它使我在過去的一個小時內成爲一個白癡,字段都是一種形式,但是當jQuery對話框打開時,它將它們移出窗體,然後驗證失敗並顯示一條奇怪的錯誤消息。爲什麼jQuery UI不會在控制檯中發出警告消息? –

4

問題發生是因爲我試圖在創建HTML元素之前綁定它。

我的腳本被加載到HTML的頂部,它需要加載到我的HTML代碼的底部。

+0

對我來說同樣的情況, 我也在插入事件之前在嵌套窗體上添加了規則。謝啦! –

0

我有這個問題,這是因爲面板超出了[data-role =「page」]元素。

4

我在Backbone項目中遇到了這個問題:我的視圖包含一個輸入並被重新渲染。 這裏是發生了什麼(例如複選框):

  • 第一次渲染髮生;
  • 應用jquery.validate,在輸入上添加事件onClick;
  • 查看重新呈現,原始輸入消失,但jquery.validate仍然綁定到它。

解決方案是更新輸入,而不是完全重新呈現它。下面是實現的一個想法:

var MyView = Backbone.View.extend({ 
    render: function(){ 
     if(this.rendered){ 
      this.update(); 
      return; 
     } 
     this.rendered = true; 

     this.$el.html(tpl(this.model.toJSON())); 
     return this; 
    }, 
    update: function(){ 
     this.$el.find('input[type="checkbox"]').prop('checked', this.model.get('checked')); 
     return this; 
    } 
}); 

這樣你就不必改變任何現有代碼調用render(),只需確保更新()讓你的HTML同步,你是好去。

+0

我不明白這一點,你能告訴我如何在實踐中應用它嗎? – user3808307

0

我在升級到Bootstrap 4後遇到nodeName類似的錯誤時發現了這個答案。問題是這些選項卡沒有navnav-tab類;將這些添加到<ul>元素解決了問題。

相關問題