2015-07-21 70 views
1

我正在繼續一個項目。這是我唯一不理解的東西。這是組裝用於sql查詢的過濾器字符串的關鍵功能。該功能通過點擊按鈕來調用。瞭解此Javascript功能

我的問題是查詢的值取自$ _REQUEST ['FILTER']。

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

起初$ _REQUEST ['FILTER']是空的。然後按下提交按鈕它將組裝並返回字符串。但我不明白它是如何組裝字符串的。因爲它看起來功能從這個輸入中獲得它的價值。但它的價值是空的。所以函數應該從這個輸入中得到空的。這就像走進圈子

例如什麼「」!=意味着無論如何javascipt?

組裝串的一個例子是「」 DELIVER_STORE_ACCOUNT = ALL^STORES_ACCOUNT = ALL^ACTIVE = 1^PART_NUMBER = ALL^NEW_PART_NUMBER = ALL 「」

我看到加入( 「^」 )部分功能。看起來這條線組合了它。但爲什麼它在切換括號內?

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

'''!='它將某些內容與空字符串進行比較 – zerkms

+3

「但爲什麼它在切換括號內---」,因爲此代碼的作者不知道如何編寫可維護的js。 – zerkms

+0

這個寫得很好的傢伙......無語,無論如何他都沒有在'「中分配任何東西!= document.getElementById(」HDN_SEARCH「)。value &&(aryTemp.SEARCH = document.getElementById(」HDN_SEARCH「)。value )'既不創建也不'if語句,然後他再次創建'array_Filter_Temp = new Array的全局範圍變量; '你可以刪除那些行,並且什麼都不會發生 – ncubica

回答

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 
) { 

前兩個是微不足道的。第三,他根據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,因此第二個for循環將運行於y如果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; 
    } 
} 

作爲一個側面說明,如果可以的話,我建議你重構這個代碼,只有收集到的數據發送到服務器,並完成所有必要的轉變:作爲

這可以被改寫在服務器端。

+0

感謝這個美好的回答。你真的清理了很多。不知道有什麼叫做短路評估。很高興知道。還要感謝for循環中的額外位 – aozora