2012-10-03 3 views
26

の私は、次のコードを持っている:jQueryが捕捉されない例外TypeErrorを検証:プロパティを読み取ることができません 'nodeNameの' ヌル

$(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() 


        } 
       } 
      ); 
     } 
    ); 

コードは、それは$(this)を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のプロパティとしてそのルールを持つvalidate関数を追加するだけではないのはなぜですか?私が例に –

+0

は; tはあなたが正確にやろうとしているもの –

+0

チェック私はdidnのこのページhttp://jquery.bassistance.de/validate/demo/ –

答えて

69

私は問題を発見しました。

問題は、私が検証しようとしていたHTMLが<form>...</form>タグ内に含まれていなかったということでした。

すぐに、私はcontextであり、nullではありませんでした。

+4

これはほぼ2時間私を捕まえました...要素はフォーム内になければなりません。 Duhhhh :(感謝のために!:)ちょうど言及する:私の場合、私は入力ファイルにルールを追加しようとしていた。これは、このjQuery行でFirebug: 'elem null'という非常に有用なエラーです。' f(elem.nodeType && elem.nodeType!== 1 && elem.nodeType!== 9) ' –

+2

これは、過去1時間に私がばかげているようにしました。フィールドはすべてフォームにありましたが、jQueryダイアログを開いたときにフォームから移動して、奇妙なエラーメッセージで検証が失敗しました。 jQuery UIがコンソールで警告メッセージを表示しないのはなぜですか? –

4

HTML要素が作成される前にバインドしようとしていたため、問題が発生しました。

私のスクリプトは、HTMLの上にロードされ、それが私のHTMLコードの下部にロードする必要があります。

+0

私にとっても同じケース また、挿入イベントの前にネストされたフォームにルールを追加していました。ありがとう! –

0

私はこの問題を持っていたパネルが要素[データ-役割=「ページ」]の外にあったので、それがでした。

4

私はバックボーンプロジェクトでこの問題を持っていた:私の見解では、入力が含まれていると再レンダリングされます。 次のようなことが起こります(チェックボックスの例)。

  • 最初のレンダリングが発生します。
  • 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>要素にそれらを追加して問題を修正しました。

関連する問題