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

Javascript 分配直接值的良好编程实践,javascript,jquery,html,xml,xslt,Javascript,Jquery,Html,Xml,Xslt,编辑: 添加了JSfiddle以更好地演示 因此,我不确定这是否是一个好的编程,但我有一个包含多个单元格的表,其中一些单元格依赖于其他单元格(>,),构建自定义校验和验证实际上非常简单。您可能可以在现有框架的基础上进行构建,如我希望保持所有这些简单 您可以对需要校验和的元素使用数据校验和属性,并使用事件委派来捕获所有输入[type=“text”]具有此属性的元素。在我的示例中,inputA+inputB的校验和意味着该值需要分别等于名为inputA和inputB的字段之和 注意:blur在某些浏

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


因此,我不确定这是否是一个好的编程,但我有一个包含多个单元格的表,其中一些单元格依赖于其他单元格(>,),构建自定义校验和验证实际上非常简单。您可能可以在现有框架的基础上进行构建,如我希望保持所有这些简单

您可以对需要校验和的元素使用
数据校验和
属性,并使用事件委派来捕获所有
输入[type=“text”]
具有此属性的元素。在我的示例中,
inputA+inputB
的校验和意味着该值需要分别等于名为
inputA
inputB
的字段之和

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

例如

HTML

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

编辑:


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


如果没有任何算法可以根据验证元素的唯一知识来确定规则,那么除了指定规则之外就没有其他方法了。除非你是Chuck Norris…

我怀疑很多人会阅读这段文本,而那些阅读过的文本,真的不是很清楚.不过,最后,您似乎在征求意见(“我是否应该设计XML,使其能够引用它所依赖的单个元素?”)这与stackoverflow的主题无关。1000字,0个代码。你可以向我们展示你的代码或其中的一部分,它比解释你的程序结构要好得多。@VuralAcar KevinB我明白你的观点,我添加代码是为了更好地演示。是的,这是我的想法,但我觉得它非常黑客,因为我在某种意义上是“硬编码”事情,比如显式地告诉它inputA和inputB。但是如果这是我猜测的唯一方式。你是指
|124; 0
还是
|0
?照目前的情况,没有任何东西可以阻止
+
操作符进行字符串连接。@JackThor,那么你想如何确定它们?你有一个可以使用的算法吗,比如两个f“当前字段下的ield或类似字段?如果你不这样做,除了指定规则之外没有其他方法。@MikeSamuel这只是一个简单的例子,我假设字段中只能输入数字或数字可以为空。我的意思是
|124; 0
,这样
'
将产生
0
。”。
<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> 
<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>
<input name="inputA" type="text">
<input name="inputB" type="text">
<input name="inputC" type="text" data-checksum="inputA + inputB">
$(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'));
        }
    });
});