【问题标题】:Get form parent from a widget从小部件获取表单父级
【发布时间】:2011-10-24 21:07:59
【问题描述】:

给定一个dojo 输入小部件(任何表单小部件),获取小部件的表单元素的最佳方式是什么?即父元素。

即我正在寻找完成这样的功能:

function getForm(widget) {

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

谢谢

【问题讨论】:

    标签: javascript forms dojo dijit.form


    【解决方案1】:

    如果您只是在寻找表单元素,您最好找到输入(或其他表单内容元素)并使用其表单属性。类似于以下内容

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

    适用于我查看的小部件。可能会错过一些小部件,但不要认为你会得到误报。

    【讨论】:

      【解决方案2】:

      由于表单小部件也可以在表单之外使用,我能想到的唯一方法与没有小部件的情况相同:获取一个起始 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)并且输入小部件不需要知道任何有关它的信息。

      【讨论】:

      • 感谢您的帮助。我知道你说你没有测试它,但这在 Dojo 中不起作用。首先,您不能使用 .tagName ,因为它会返回类似“div”的内容(考虑到大多数小部件的构成方式,包括表单)。另外,您说小部件可以在表单之外使用,我同意这一点,但鉴于它正在查看祖先标签,我看不出您的解决方案将如何工作,这意味着小部件被深度包装在表单中:) ...无论如何,我会发布对我有用的问题的答案,无论如何我都会接受你的解决方案。
      【解决方案3】:

      如果表单是 dijit/form/Form,您可以使用 dijit/registry 获取表单(小部件不仅仅是 DOM 节点)。

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

      【讨论】:

        【解决方案4】:

        对于那些好奇的人,这对我有用:

        function getForm(widget) {
        
            return (widget.domNode.parentNode);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-03
          • 1970-01-01
          • 1970-01-01
          • 2019-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多