理解这个Javascript函数

时间:2015-07-21 03:07:20

标签: javascript

我正在继续一个项目。这是我唯一不理解的事情。它是组装用于sql查询的过滤器字符串的关键功能。通过单击按钮调用此功能。

我的问题是查询的价值取自$ _REQUEST [' FILTER']。

<input id="HDN_FILTER" name="FILTER" type="hidden" value="<?php echo $_REQUEST['FILTER']; ?>">

首先,$ _REQUEST [&#39; FILTER&#39;]为空。然后在按下提交按钮时,它会组装并返回字符串。但我不明白它是如何组装弦乐的。因为看起来函数从这个输入中得到它的值。但它的价值是空的。因此该函数应该从此输入中为空。这就像进入圈子一样

示例&#34;&#34; != 无论如何都意味着在javascipt?

汇编字符串的示例是&#34;&#34; DELIVER_STORE_ACCOUNT = ALL ^ STORES_ACCOUNT = ALL ^ ACTIVE = 1 ^ PART_NUMBER = ALL ^ NEW_PART_NUMBER = ALL&#34;&#34;

我在函数中看到 join(&#34; ^&#34;)部分。似乎这条线组装起来了。但为什么它在开关括号内呢?

 function SUBMIT(e, t) {
    array_Filter = new Array;

    for (i in array_Dropdown) {
        if (varField = array_Dropdown[i], varID = "SEL_" + varField, aryTemp = new Array, -1 != document.getElementById(varID).selectedIndex)
            for (i = 0; i < document.getElementById(varID).options.length; i++)
                document.getElementById(varID).options[i].selected === !0 && (aryTemp[aryTemp.length] = document.getElementById(varID).options[i].value);
        aryTemp.length > 0 && (array_Filter[varField] = aryTemp)
    }

    "" != document.getElementById("HDN_SEARCH").value && (aryTemp.SEARCH = document.getElementById("HDN_SEARCH").value), array_Filter_Temp = new Array;
    for (i in array_Filter)
        array_Filter_Temp[array_Filter_Temp.length] = i + "=" + array_Filter[i].join("|");
    switch (varFilter = array_Filter_Temp.join("^"), document.getElementById("HDN_FILTER").value = varFilter, document.getElementById("HDN_EXCEL").value = 1 == e ? 1 : 0, !0) {
        case 1 == t:
            document.getElementById("HDN_OVERRIDE").value = 1;
            break;
        case 0 == t:
            document.getElementById("HDN_OVERRIDE").value = 0;
            break;
        case-1 == t:
    }

    varTXTBOX = document.getElementById("TXT_SEARCH").value;
    alert(varTXTBOX);

    document.getElementById("FORM1").submit()
}

1 个答案:

答案 0 :(得分:1)

编写此代码的人试图对其进行模糊处理,这使得其他人很难理解它的作用,可能是因为结果被发送到SQL查询,正如您所说的那样。当然,如果要隐藏用户的任何内容,特别是SQL命令,请在服务器端实现它。

1)"" !=部分:

"" != document.getElementById("HDN_SEARCH").value                // left side
&&                                                               // logical AND
(aryTemp.SEARCH = document.getElementById("HDN_SEARCH").value),  // right side
array_Filter_Temp = new Array;                                   // another statement

他在这里利用short-circuit evaluation,如果表达式的左侧评估为false,则右侧不会被执行。始终执行,之后的下一个语句(了解有关comma operator的更多信息)。所以它和写作一样:

if (document.getElementById("HDN_SEARCH").value != "") {
    aryTemp.SEARCH = document.getElementById("HDN_SEARCH").value
}
array_Filter_Temp = new Array;

2)switch部分:

switch (
    varFilter = array_Filter_Temp.join("^"), 
    document.getElementById("HDN_FILTER").value = varFilter, 
    document.getElementById("HDN_EXCEL").value = 1 == e ? 1 : 0, 
    !0
) {

前两个是微不足道的。在第三个问题上,他根据HDN_EXCEL的值分配e。添加括号使其更清晰:document.getElementById("HDN_EXCEL").value = (1 == e) ? 1 : 0

!0只是为了确保交换机的其余部分被执行(它评估为true)。如果是0false,则永远不会将HDN_OVERRIDE分配给值。

因此整套可以改写为:

varFilter = array_Filter_Temp.join("^");
document.getElementById("HDN_FILTER").value = varFilter;
document.getElementById("HDN_EXCEL").value = (e == 1) ? 1 : 0;
switch (t) {
    case 1:
        document.getElementById("HDN_OVERRIDE").value = 1;
        break;
    case 0:
        document.getElementById("HDN_OVERRIDE").value = 0;
        break;
}

3)第一个for循环:(你还没有问过,但无论如何都要去了)

for (i in array_Dropdown) {
    if (
        varField = array_Dropdown[i], 
        varID = "SEL_" + varField, 
        aryTemp = new Array, 
        -1 != document.getElementById(varID).selectedIndex
    )
        for (i = 0; i < document.getElementById(varID).options.length; i++)
            document.getElementById(varID).options[i].selected === !0 && (aryTemp[aryTemp.length] = document.getElementById(varID).options[i].value);
    aryTemp.length > 0 && (array_Filter[varField] = aryTemp)
}

再次使用,运算符执行所有命令并将最后一个的值返回if-1 != document.getElementById(varID).selectedIndex,所以第二个for仅当varID中的元素具有selectedIndex时才会运行循环。

=== !0=== true相同。

这可以改写为:

for (key in array_Dropdown) {
    varField = array_Dropdown[key];
    varID = "SEL_" + varField;
    aryTemp = new Array;
    if (document.getElementById(varID).selectedIndex != -1) {
        for (i = 0; i < document.getElementById(varID).options.length; i++) {
            if (document.getElementById(varID).options[i].selected) {
                aryTemp[aryTemp.length] = document.getElementById(varID).options[i].value;
            }
        }
    }
    if (aryTemp.length > 0) {
        array_Filter[varField] = aryTemp;
    }
}

作为旁注,如果可以的话,我建议您重构此代码,仅将收集的数据发送到服务器并执行服务器端所需的所有转换。