我正在继续一个项目。这是我唯一不明白的事情。它是组装用于 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
)。如果它是 0
或 false
,则 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/