2011-10-24 42 views
2

給定一個dojo輸入小部件(任何表單小部件),獲取小部件表單元素的最佳方法是什麼?即父元素。從小部件獲取表單父項

即我期待完成這樣的功能:

function getForm(widget) { 

    return (/**code goes here **/); 
} 

感謝

回答

1

由於表單控件也可以使用外部的形式,我能想到的唯一的辦法是一樣的,你會離不開小工具:得到一個起點DOM節點和移動,直到你得到一個形式節點:

function find_ancestor_of_type(ancestorTag, node){ 
    while(node && node.tagName !== ancestorTag){ 
     node = node.parentNode; 
    } 
} 

function get_form(widget){ 
    return fund_ancestor_of_type("form", widget.domNode); 
} 

(我還沒有尚未雖然測試此)


順便說一句,爲什麼你需要這樣做?大多數情況下,您可以將大部分邏輯放在表單本身中(如果需要,它也可以是dijit.form.Form),並且輸入小部件不需要知道任何關於它的任何信息。

+0

謝謝你試圖提供幫助。我知道你說過你沒有測試它,但這在Dojo中不起作用。首先,你不能使用.tagName,因爲它會返回類似「div」的東西(考慮到大多數小部件是如何構成的,包括表單)。另外,你說widget可以用在表單之外,我同意,但是我沒有看到你的解決方案是如何工作的,或者是因爲它正在查看祖先標籤,這意味着這個小工具被indeep包裹在一個表單中:) ......無論如何,我會爲我的問題發佈一個答案,我會接受你的解決方案。 – Ayyoudy

0

對於那些誰是好奇,這是對我工作:

function getForm(widget) { 

    return (widget.domNode.parentNode); 
} 
5

如果你只是尋找的表單元素,你可能會更好找到輸入(或其他形式的內容元素)和使用其表單屬性。類似以下的東西

function getForm(widget) { 
    var inputNode = widget.valueNode || widget.focusNode; 
    if (inputNode) return inputNode.form; 
    return null; 
} 

將工作的小工具,我看着。可能會錯過一些小部件,但不認爲你會得到誤報。

1

如果表單是dijit/form/Form,則可以使用dijit/registry來獲取表單(小部件不僅僅是DOM節點)。

require(["dijit/registry"], function(registry) 
{ 
    var formWidget = registry.getEnclosingWidget(registry.byId('form_element_id').domNode); 
});