分配直接值的良好编程实践

Good programming practice to assign direct values

本文关键字:编程 分配      更新时间:2023-09-26

编辑:添加了 JSfiddle 以更好地演示

所以我不确定这是否是好的编程,但我有一个包含多个单元格的表,其中一些依赖于其他单元格(>、<等(我还有一个表格,其中的值也依赖于其他值。>

我正在使用 XSLT 从 XML.So 动态生成这些表/表单,具体取决于 XML,页面看起来会有所不同并且具有不同的数据。问题是我是否应该设计 XML,使其具有对它所依赖的各个元素的引用?这样,当我输入一个值时,我将检查输入的值是否满足依赖项的条件。在此 JsFiddle 中,单元格具有一个 data-valueLimits,该限制明确告知需要检查哪个单元格

<tbody><tr class="tableRow">
<td ><input type="Text" id="1102" style="text-align:center;" data-valuelimits="&   
lt;=:1103"/></td>
<td><input type="Text" id="1103" style="text-align:center;" data-valuelimits="&  
gt;=:1102"/></td>
</tr></tbody>
</table> 

我觉得这有点黑客,因为我明确告诉它需要检查哪个元素。

我希望有一些更动态的东西,如果我可以单击任何元素并查看一个地方。

例如,如果我取消聚焦第 1 列第 1 行中的单元格,我将触发一个事件,该事件查找列标题中的信息,指出此列小于第 2 列。因此,我随后获取第 2 列第 1 行中的单元格,以检查第 1 列第 1 行中单元格中的值是否小于第 2 列第 1 行中的单元格。但是,这样做的问题是它们必须组合在一起,而元素可以在任何地方。在此 JsFiddle 中,data-valueLimits 位于标题中,我必须以编程方式获取信息,以确定基于该信息的哪一列以及单元格取消焦点位于哪一行才能获取要组合的值。这样我就不需要知道它是什么单元格,而是知道位置。

<thead><tr>
<th ><label data-valuelimits="&lt;=:MaxNum" name="MinNum">Min Number</label></th>
<th class="dataTableHeader"><label data-valuelimits="&gt;=:MinNum" name="MaxNum">Max   
Number</label></th>
</tr></thead>

有谁知道将这两种方式结合起来的方法吗?

构建自定义校验和验证实际上非常简单。您可能可以基于现有的框架(例如jQuery Validify(进行构建,但是我想保持所有这些简单。

您可以对需要校验和的元素使用 data-checksum 属性,并使用事件委派捕获具有此属性的所有input[type="text"]元素的每个blur事件。在我的示例中,inputA + inputB 的校验和意味着该值需要分别等于名为 inputAinputB的字段的总和。

注意:模糊在某些浏览器中不会冒泡,因此您可能无法使用事件委派。将事件侦听器添加到所有元素可能更安全。

例如

.HTML

<input name="inputA" type="text">
<input name="inputB" type="text">
<input name="inputC" type="text" data-checksum="inputA + inputB">

.JS

$(function () {
    var spacesRx = /'s/g,
        wordBoundaryRx = /'b/,
        operatorsRx = /[+'-*'']/;
    $(document).on('blur', 'input[type=text][data-checksum]', function (e) {
        var $this = $(e.currentTarget),
            //default operator
            operator = '+',
            //naive parsing of the checksum expression
            parts = $this.data('checksum').replace(spacesRx, '').split(wordBoundaryRx),
            //calculate the result of the checksum expression
            result = parts.reduce(function (res, item) {
                if (operatorsRx.test(item)) {
                    operator = item;
                    return res;
                }
                //evil eval to shorten code example
                return eval('res' + operator + '=' + ($('input[type=text][name="' + item + '"]').val() || 0));
            }, 0);
        if (result !== parseInt($this.val(), 10)) {
            console.warn('error, expecting ' + result + ' for field ' + $this.prop('name'));
        }
    });
});

注意:另请注意,验证配置不必存储在标记中。

编辑:

的,这就是我的想法,但我觉得这很黑客,因为我在某种意义上是"硬编码"的东西,比如明确告诉 它输入 A 和输入 B。但如果这是我猜的唯一方法。

好吧,如果没有任何算法可用于根据正在验证的元素的唯一知识来确定规则,那么除了指定规则之外别无他法。除非你是查克·诺里斯...