2009-10-24 55 views
4

對不起,如果這是已經發布我一直在尋找無果..通過嵌套的表單元素jQuery的迭代

我只是想知道如何通過嵌套形式「元素」(元素是循環不僅嚴格的形式元素,如輸入標籤,但其他HTML元素以及)在jQuery中。 目前我有這段代碼做到這一點:

$('#'+arguments[i].formid).children().each(function(){ 
    var child = $(this); 
    alert(child.attr('id')); 
    if(child.is(":input")) { alert(child.attr('id')); 
    if(child.attr('id')!='') eval("p."+child.attr('id')+"='"+child.attr('value')+"'"); 
    } 

     if(child.is(":textarea")) { 
    if(child.attr('id')!='') eval("p."+child.attr('id')+"='"+child.attr('value')+"'"); 
    } 
    }); 

它不工作時,我的形式包含其他元素是這樣的:

<form> 
    <div id='tabs'> 
     <ul>...</ul> 
     <div id='tab-1'> 
       <input type='text' id='fname' /> 
       <textarea id='desc' ></textarea> 
     </div> 
    </div> 
</form> 

請幫助...

+2

首先:從不在JS中使用eval。第二:你究竟想要達到什麼目標?通常有更好的方法來迭代所有元素。 – RaYell 2009-10-24 11:18:26

+0

我使用eval()會導致我的對象屬性是動態的,並且基於表單輸入的id。還是有沒有其他的方法來做到這一點,而不使用eval()? – jan 2009-10-24 12:18:56

+0

感謝您的提示。我只是不知何故需要一種方法來傳遞一個對象從PHP到JavaScript像從PHP我把這個值扔到JavaScript:{lastpage:'main',var:foo,var2:bar}並在javascript:eval(「p =」+ <?= $ thatobject>);這樣我可以記錄最新的會話值在當前的請求頁面上使用..這有道理嗎?我想我不是很擅長這個。 – jan 2009-10-24 12:37:43

回答

3

你可以做,在一個遞歸函數。

function doStuff(child) { 
    if(child.is(":input")) { 
    ... 
    } 

    if(child.is(":textarea")) { 
    ... 
    } 
} 

function walk(children) { 
    if (typeof children == "undefined" || children.size() === 0) { 
    return; 
    } 
    children.each(function(){ 
    var child = $(this); 
    if (child.children().size() > 0) { 
     walk(child.children()); 
    } 
    doStuff(child); 
    } 
} 

walk($('#'+arguments[i].formid).children()); 

編輯:我只是想通了,你正在嘗試做的,你可以打破它這種

var p = {}; 
$('#'+arguments[i].formid + " input[id], #"+arguments[i].formid + " textarea[id]").each(function(){ 
    var child = $(this); 
    p[child.attr("id")] = child.attr("value"); 
}); 

你或許應該閱讀更多關於jQuery的selectors

+0

哇。謝啦!解決了它,甚至刪除了幾行代碼。你是對的我真的需要閱讀更多關於jquery選擇器,但我無法找到一個完整的例子,你可以遇到這麼多的條件,將具體到我自己的要求.. jQuery網站給出的例子,但只是基本的使用$(「# formid> input「)。each(func ...我想我正在尋找一個解釋,你可以在$()的大括號裏做什麼,我從來沒有找到.. – jan 2009-10-24 12:33:26

+0

如果這解決了你的問題,你可以標記這個問題可以通過點擊我答案旁邊的綠色複選標記來解決。 – moxn 2009-10-24 18:29:33

8

你可以使用contents()(並根據需要篩選出文本節點)或find('*')以獲取所有元素,但我不喜歡使用通配符。

$('form').contents() 
      .filter(function() { return this.nodeType == 1; }) 
      .each(...); 

$('form').find('*') 
      .each(...); 
0

說不上來,如果你需要jQuery的,請參見下面domIterator例如...

/* 
    menu.js  : main menu javascript class for ekerner.com 
    Author  : 'Eugene Kerner' <[email protected]> 
    Date  : 14-12-2007 
    Dependencies: menu.css 
       : an unordered list structure as per the below Example. 
       : a javascript call to menu.init(menuId, selectedMenuItemsArray) as per the below Example. 
    Notes  : if your menu link has an onclick that returns false then it needs to call menu.init before returning (see Example). 
    Example  : - 
    <ul id="mainMenu" class="menuItems"> 
     <li> 
     <a href="/">Menu Item</a> 
     <ul> 
      <li><a href="/webpage" onclick="window.open('/webpage'); menu.init('mainMenu', ['Menu Item', 'Sub Menu Item']); return false;">Sub Menu Item</a></li> 
     </ul> 
     </li> 
    </ul> 
    <script type="text/javascript">menu.init('mainMenu', ['Menu Item']);</script> 
*/ 

var menu = { 

    selectedItems : [], 

    init : function(menuId, selectedMenuItems) 
    { 
    this.selectedItems = selectedMenuItems; 
    var menuItem = domIterator.getFirstChild(document.getElementById(menuId)); 
    while (menuItem) { 
     var menuItemLink = domIterator.getFirstChild(menuItem); 
     var subMenu  = domIterator.getNextSibling(menuItemLink); 
     this.applySelectedClass(menuItemLink); 
     if (subMenu) { 
     menuItem.onmouseover = function(){menu.showSubMenu(this)}; 
     menuItem.onmouseout = function(){menu.hideSubMenu(this)}; 
     var subMenuLinks = subMenu.getElementsByTagName('a'); 
     for (var i = 0; i < subMenuLinks.length; i++) 
      this.applySelectedClass(subMenuLinks[i]); 
     } 
     menuItem = domIterator.getNextSibling(menuItem); 
    } 
    }, 

    applySelectedClass : function(menuLink) 
    { 
    for (var i = 0; i < this.selectedItems.length; i++) { 
     if (menuLink.innerHTML == this.selectedItems[i]) { 
     menuLink.className = 'selected'; 
     return; 
     } 
    } 
    menuLink.className = ''; 
    }, 

    showSubMenu : function(menuItem) 
    { 
    domIterator.getFirstChild(menuItem).className  = 'selected'; 
    domIterator.getLastChild (menuItem).style.display = 'block'; 
    }, 

    hideSubMenu : function(menuItem) 
    { 
    domIterator.getLastChild (menuItem).style.display = 'none'; 
    this.applySelectedClass(domIterator.getFirstChild(menuItem)); 
    } 

}; // end menu 

var domIterator = { 

    getFirstChild : function(elem) 
    { 
    if (elem) return domIterator.continueUntilType1(elem.firstChild, 'next'); 
    }, 

    getLastChild : function(elem) 
    { 
    if (elem) return domIterator.continueUntilType1(elem.lastChild, 'previous'); 
    }, 

    getNextSibling : function(elem) 
    { 
    if (elem) return domIterator.continueUntilType1(elem.nextSibling, 'next'); 
    }, 

    continueUntilType1 : function(elem, direction) 
    { 
    while (elem && elem.nodeType != 1) 
     elem = elem[direction + 'Sibling']; 
    return elem; 
    } 

}; // end domIterator 
1

回來後糾正自己:) jQuery的岩石! 這裏速成班後,所以在jQuery的同樣的事情...

/* 
    menu.jq  : main menu jQuery for ekerner.com 
    Author  : 'Eugene Kerner' <[email protected]> 
    Date  : 16-12-2009 
    Dependencies: jQuery javascript lib 
       : menu.css 
       : an unordered list structure as per the below Example. 
       : a javascript call to menu.init(menuId, selectedMenuItemsArray) as per the below Example. 
    Notes  : if your menu link has an onclick that returns false then it needs to call menu.init before returning (see Example). 
    Example  : - 
    <ul id="mainMenu" class="menuItems"> 
     <li> 
     <a href="/">Menu Item</a> 
     <ul> 
      <li><a href="/webpage" onclick="window.open('/webpage'); menu.init('mainMenu', ['Menu Item', 'Sub Menu Item']); return false;">Sub Menu Item</a></li> 
     </ul> 
     </li> 
    </ul> 
    <script type="text/javascript">$(document).ready(function(){menu.init('mainMenu', ['Menu Item'])});</script> 
*/ 

var menu = { 
    selectedClass : 'selected', 
    animateSpeed : 'fast', 
    selectedLinks : [], 
    init : function(menuId, selectedLinks) 
    { 
    $('#' + menuId).children('li').each(function(){ 
     var menuItem  = $(this); 
     var menuLink  = menuItem.children('a:first-child'); 
     var subMenu  = menuItem.children('ul:last-child'); 
     menu.selectedLinks = selectedLinks; 
     menu.applySelectedClass(menuLink); 
     if (subMenu.length == 1) { 
     menuItem.hover(
      function(){menuLink.addClass(menu.selectedClass); subMenu.slideDown(menu.animateSpeed)}, 
      function(){subMenu.slideUp(menu.animateSpeed); menu.applySelectedClass(menuLink)} 
     ); 
     subMenu.find('a').each(function(){menu.applySelectedClass($(this))}); 
     } 
    }); 
    }, 
    applySelectedClass : function(menuLink) 
    { 
    ($.inArray(menuLink.html(), menu.selectedLinks) > -1) ? menuLink.addClass(menu.selectedClass) : menuLink.removeClass(menu.selectedClass); 
    } 
} 

這裏是萬一有人想利用它的CSS ...

/* 
    menu.css - main menu cascading style sheet for ekerner.com all media 
    'Eugene Kerner' <[email protected]> 
    14-12-2007 
*/ 

.menuItems, .menuItems li, .menuItems li ul, .menuItems li ul li { 
    padding: 0; 
    margin: 0; 
} 
.menuItems, .menuItems li ul { 
    list-style: none; 
} 
.menuItems { 
    background: url(/shared/images/menu/menu_button_bg.png) repeat-x; 
    height: 30px; 
} 
.menuItems:after { 
    content: "."; 
    height: 0; 
    clear: both; 
    display: none; 
} 
.menuItems li { 
    width: 80px; 
    float: left; 
} 
.menuItems li a { 
    color: #0d2a86; 
    font-size: 14px; 
    font-weight: bold; 
    text-decoration: none; 
    text-align: center; 
    height: 24px; 
    padding-top: 6px; 
    border-right: 1px solid #f3f3f3; 
    display: block; 
} 
.menuItems li a:hover, .menuItems li .selected { 
    background: url(/shared/images/menu/menu_button_bg_selected.png) repeat-x; 
    color: #518ed3; 
} 
.menuItems li ul { 
    position: absolute; 
    z-index: 100; 
    border: 1px solid #e0e7ef; 
    border-top: 0; 
    display: none; 
} 
.menuItems li ul li { 
    width: 77px; 
    clear: both; 
} 
.menuItems li ul li a { 
    background: #f3f3f3; 
    font-size: 12px; 
    font-weight: normal; 
    height: 18px; 
    padding: 0; 
    padding-top: 2px; 
    border: 0; 
} 
.menuItems li ul li a:hover, .menuItems li ul li .selected { 
    background: #e0e7ef; 
} 
.visible { 
    display: block; 
} 
.hidden { 
    display: none; 
}