2012-10-03 78 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>元素解决了问题。

相关问题