我正在继续一个项目。这是我唯一不理解的事情。它是组装用于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()
}
答案 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
)。如果是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
,所以第二个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;
}
}
作为旁注,如果可以的话,我建议您重构此代码,仅将收集的数据发送到服务器并执行服务器端所需的所有转换。