2009-01-21 69 views
11

如何使用簡單/少量的JavaScript查找HTML元素包含在哪個FORM中?在下面的例子中,如果我已經掌握了稱爲'message'的SPAN,我怎樣才能輕鬆地到達FORM元素?在JavaScript中查找元素所屬的表格

<form name="whatever"> 
    <div> 
     <span id="message"></span> 
    </div> 
</form> 

跨度可能被嵌套在其他表或資料覈實中,但似乎太囉嗦遍歷各地.parentElement和工作我的方式樹。有一種更簡單和更短的方法嗎?

如果它不是一個SPAN,但是一個INPUT元素,會更容易嗎?他們是否有財產指向包含FORM的財產? Google說不...

+1

忘了說我正在使用舊的skool JavaScript,而不是JQuery。 – 2010-12-13 22:30:47

+0

相關:http://stackoverflow.com/questions/991367/how-to-get-the-form-parent-of-an-input/ – XP1 2012-07-29 18:35:37

回答

16

表單元素所屬的表單可以通過element.form訪問。

當您用作參考的元素不是表單元素時,您仍然需要遍歷parentElement或使用其他類型的選擇器。

使用原型,您可以通過使用Element.up()簡化這個:

$(element).up('form'); 

Otheranswers對這個問題都指出瞭如何做同樣的jQuery中。

node = document.getElementById("message"); 
while (node.nodeName != "FORM" && node.parentNode) { 
    node = node.parentNode; 
} 
+0

嗯,我認爲應該有一個.form屬性...但我不能確定,所以我谷歌搜索,沒有看到一個。我必須失明。 感謝您指出明顯! – 2009-01-21 14:10:13

7

猜你必須通過所有的元素進行迭代,然後:

3

或小的jQuery(忽略jQuery的本身):

$("#message").parents("form:first") 
0

除了node.parentNode,我不相信有找到給定節點的特定祖先的方法。大多數庫通常按照您所描述的方式進行,並通過parentNode進行迭代。

如果你不使用像原型,jQuery或Ext的庫,它可能是一個好主意。到目前爲止,他們已經解決了DOM中的所有不兼容性和怪癖,使大多數操作成爲一件小事。

6

關於Gumbo的帖子: 儘管原型和jQuery很有用,但有些人並沒有將它們實現到他們的項目中。

請問有人能解釋爲什麼Gumbo的解決方案被降級,除了他重複了OP最初試圖避免的事實嗎?

node = document.getElementById(this.id); 
while (node.nodeName != "FORM" && node.parentNode) { 
    node = node.parentNode; 
} 

 

要回答的任擇議定書的問題: 遍歷DOM是實現這一效果的最快方法 - 感知的速度由1來實現),更好的寫JS代碼,或2)執行時間(如果您在該元素的頁面加載中存儲表單,則仍然會遍歷,但當您需要檢索該信息時,您將更快地調用存儲的變量)。

沒有嵌套在非表單元素中的屬性會將其與表單關聯(span.form不存在)。

如果您正在使用腳本(php/perl)生成頁面,並且您將要對窗體進行大量調用,則可以在該元素的HTML中嵌入窗體標識。儘管如此,還是需要查找。

我希望這有助於

vol7ron

+1

很好的答案。有時你無法負擔js框架。 – HotFudgeSunday 2011-06-15 01:23:04

8

爲什麼不直接使用:

var nodesForm = node.form; 

?我試過自己)