2013-06-04 47 views
2
<h3>Customer</h3> 
<dl> 
    <dd> 
     <input name="customer[customerId]"> 
    </dd> 
    <dt>customer[customerName]</dt> 
    <dd> 

     <input name="customer[customerName]"> 
     <span class="error">Find me</span>  
    </dd> 
</dl> 

<h3>Address</h3> 

<dl>  
    <dd> 
     <input name="customer[address][addressId]"> 
    </dd> 
    <dd> 
     <input name="customer[address][address1]"> 
    </dd> 
    <dd> 
     <input name="customer[address][address2]"> 
    </dd> 
    <dt>customer[address][address3]</dt> 
    <dd> 
     <input name="customer[address][address3]"> 
     <span class="error">Find me</span> 
    </dd> 
</dl> 

<h3>District</h3> 
<dl> 
    <dt>customer[district][districtId]</dt> 
    <dd> 
     <select name="customer[district][districtId]"><br> 
      <option value="">Choose district</option> 
      <option value="1">Area 1</option> 
     </select> 
     <span class="error">Find me</span> 
    </dd> 
</dl> 

的Javascript:從JSON查找元素

// Form error messages 
var result = {messages: { 
'customer' : { 
    'customerName' : { 'isEmpty' : "Value is required and can't be empty"} , 
    'address' : { 
     'address3' : { 'isEmpty' : "Value is required and can't be empty"} 
    }, 
    'district' : { 
     'districtId' : { 'isEmpty' : "Value is required and can't be empty"} 
    }, 
} 
}}; 

function parseMessages(messages, parent, result, prefix) { 
    result = result || []; 
    parent = parent || ''; 
    prefix = prefix || []; 
    $.each(messages, function (name, value) { 
     var inputName = ''; 
     if (prefix.length > 0) { 
      inputName += parent; 
      $.each(prefix, function(k, v){ 
       inputName += '['+ v +']'; 
      }); 
     } else { 
      inputName = name; 
     } 

     var $input = $(':input[name="'+ inputName +'"]').eq(0); 
     if ($input.size()) { 
      console.log(inputName + ': Found'); 
     } else { 
      console.log(inputName + ': Not found'); 
     } 
     if ($input.size() > 0) { 
      // Move up a level 
      if (prefix.length > 0) { 
       prefix.pop(); 
      } 
      // Error message: 
      // { isEmpty : "Value is required and can't be empty"} 
      // Messages to string 
      var messages = []; 
      if (typeof value == 'object') { 
       $.each(value, function(k, v) { 
        messages.push(v); 
       }); 
      } 
      var errorMessage = messages.join(','); 

      // Add to result 
      $input.siblings('span').append(' -> <strong style="color:red">Found</strong>'); 
      result.push({ 
       element : $input, 
       message : errorMessage 
      }); 
     } else { 
      if (!parent) { 
       parent = name; 
      } else { 
       prefix.push(name) 
      } 
      return parseMessages(value, parent, result, prefix); 
     } 
    }); 
    return result; 
} 
console.log(result.messages); 
var result = parseMessages(result.messages); 
console.log(result) 

見的jsfiddle: http://jsfiddle.net/EeYs8/5/

enter image description here

我的劇本有一些問題,無法找到customer[district][districtId]元素, 燙解決它? 非常感謝。

===================更新========================== ======== enter image description here

+0

使用retrive customer [地址] [區] [districtId];所以只有你有一個錯誤的外觀控制檯 – Dineshkani

+0

嘗試'客戶[「區」] [「districtId」](你錯過了提及引號) –

+0

@Dineshkani我知道這個問題,我不知道如何改變'客戶[區]腳本進入'客戶[地址] [地址3]'時[level] []的級別。 – love

回答

0

添加到您的元素

if (name == "district"){ 
    prefix.length = 0; 
    prefix.push(name); 
} 

See Demo

+0

不適合其他形式。 – love

0

改變你這樣的代碼:

// Move up a level 
if (prefix.length > 0) { 
    prefix.length=0; 
} 

迪d爲我解決了這個問題,但是這可能會破壞嵌套更深的表單。

Fixed example

你可能需要一些進一步的測試,或許重構,你的代碼看起來很脆弱。

+0

Un..Big問題對我來說 – love

+0

@love你是否試過這段代碼並進行了測試? – Christoph

+0

是的,非常感謝,但對我不好。 – love