javascript - 理解这个 Javascript 函数

标签 javascript

我正在继续一个项目。这是我唯一不明白的事情。它是组装用于 sql 查询的过滤字符串的关键函数。该函数是通过单击按钮来调用的。

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

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

一开始$_REQUEST['FILTER'] 是空的。然后按下提交按钮后,它会组装并返回字符串。但我不明白它是如何组装字符串的。因为函数似乎从这个输入中获取了它的值。但它的值(value)是空的。因此该函数应该从此输入接收到空值。就像绕圈子一样

示例 ""!= 在 javascipt 中到底意味着什么?

组装字符串的示例为 ""DELIVER_STORE_ACCOUNT=ALL^STORES_ACCOUNT=ALL^ACTIVE=1^PART_NUMBER=ALL^NEW_PART_NUMBER=ALL""

我在函数中看到了 join("^") 部分。这条线似乎将它组装起来。但为什么它在 switch 括号内呢?

 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()
}

最佳答案

无论谁编写此代码,都试图混淆它,使其他人很难理解它的作用,也许是因为结果被发送到 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
) {

前两个是微不足道的。在第三个中,他根据 e 的值分配 HDN_EXCEL。添加括号使其更清晰: 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,因此仅当 varID 中的元素具有 selectedIndex 时,第二个 for 循环才会运行。

=== !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;
    }
}
<小时/>

顺便说一句,如果可以的话,我建议您重构此代码,仅将收集到的数据发送到服务器,并在服务器端完成所需的所有转换。

关于javascript - 理解这个 Javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529697/

相关文章:

javascript - 更换按钮不起作用

javascript - Skrollr 淡出文本

javascript - JQUERY Ajax Get方法获取数据属性

javascript - 将导航栏登录下拉菜单更改为注销 ajax

java - 在 Android 中关闭 Webview

javascript - jQuery 在 IE8 中失败

用于 RGB 颜色验证器的 Javascript 正则表达式

javascript - $location 和 window.location 比较

javascript - 谁能告诉我如何使用addClass和removeClass实际上我的代码不起作用

javascript - 如何将不可预测的 JSON 解析成字符串?