1

我正在使用 dojo 构建一个配置对话框,稍后我需要询问用户输入。对话框中有多行,每行具有相同的格式和标签。这是我用来构建每一行的 html。

html = '<div class="cfgtxtrow"> <label>Label:</label>
<input id="mac" type="hidden" name="mac" value="'+mac+'"/>
<input id="label" type="text" maxlength="6" name="label" value="'+labl+'"/>
</div>';

这部分一切正常,我可以在返回时看到 Firebug 中的数据。

我需要解析出这些值并最终使用 xhr 将它们发送到服务器。所以我认为我可以使用 dojo 查询来获取节点列表并遍历每个节点以获取输入值并构建它们的关联数组以发送。我认为这很像以编程方式验证值。

我可以在每个节点上看到 innerhtml(使用 dojo.query(".cfgtxtrow").forEach(function(node)) 但无法弄清楚如何以编程方式(使用 dojo)获取每个节点上的值。我以为我将能够使用 dojo.byId 或在 Nodelist 上查询来获取其内部元素,但我只是得到错误。

我开始怀疑我的概念都是错误的,因为我认为这很简单。

这是我最终得到的..

dojo.query(".cfgtxtrow input").forEach( function(node)
{
    id = dojo.attr(node, "id" );
    console.debug( node );

    if( id == "mac" ) mac = dojo.attr( node, "value" ); // since mac comes first this is safe..
    if( id == "label" )
    {
        labl = dojo.attr( node, "value" );
        console.debug( mac );
        console.debug( labl );
        macLabels[mac] = labl;
    }
});
console.debug(macLabels[mac]);
// send the data via the xhrPut call..

我认为它应该很简单,并且 dojo.attr 调用似乎可以完成这项工作..

有没有更好的方法来做同样的事情?

4

1 回答 1

0

首先,您不应该使用 id 属性来标识多行。一个 html 文档中只能有一个具有特定 id 的 dom 节点。也许这就是你问题的开始?

所以如果你改变你的html如下:

<div class="cfgtxtrow"> <label>Label:</label>
<input class="mac" type="hidden" name="mac" value="macValue"/>
<input class="label" type="text" maxlength="6" name="label" value="labelValue"/>
</div>​

在上面运行这个(快速而肮脏的)代码

​require(['dojo/query'],function(query) {
    var macLabels = {};
    query('.cfgtxtrow').forEach(function(row) {
        var mac = query('.mac', row)[0].value;
        var label = query('.label', row)[0].value;
        macLabels[mac] = label;
    });
    console.log(macLabels);
});​​​​​​​​​

将在控制台日志上输出此对象:{macValue: "labelValue"}

于 2012-11-05T01:38:58.480 回答