2011-04-08 73 views
0

我有這種形式JavaScript的查詢字符串不工作

<form name="exampleform" id="exampleform" action="example123.html" method="get"> 
    <fieldset> 
     <legend>Creating The Querystring</legend> 
     <label for="name_1">Name:</label> 
     <input type="text" name="name1" id="name_1" tabindex="1" size="40" value="Test1" /> 
     <br /> 
     <br /> 

     <input type="submit" id='view_1' value="Submit" tabindex="2" /> 

    </fieldset> 


    <br /> 
    <br /> 
    <fieldset> 
     <legend>Creating The Querystring</legend> 
     <label for="name_2">Name:</label> 
     <input type="text" name="name2" id="name_2" tabindex="1" size="40" value="Test2" /> 
     <br /> 
     <br /> 

     <input type="submit" id='view_2' value="Submit" tabindex="2" /> 

    </fieldset> 
</form> 

當它提交到下一個頁面我希望能夠得到被點擊的按鈕,查詢字符串,而不是看到這兩個字符串時,該頁面負載。我現在用的是接收頁面上的腳本是:

<script type="text/javascript"> 

     document.write("Name: " + Request.QueryString("name1")); 
     document.write("Name: " + Request.QueryString("name2")); 

    </script> 

/*TITLE: Client-Side Request Object for javascript by Andrew Urquhart (UK) 
HOME: http://andrewu.co.uk/tools/request/ 
COPYRIGHT: You are free to use this script for any use you wish, the only 
thing I ask you do is keep this copyright message intact with the script. 
Please don't pass it off as your own work, but feel free to enhance it and send 
me the updated version. Please don't redistribute - it makes it harder to distribute 
new versions of the script. This script is provided as is, with no warranty of any 
kind. Use it at your own risk. 
VERSION: #1.41 2007-06-28 18:10 UTC*/ 
function RObj(ea) { 
    var LS = ""; 
    var QS = new Object(); 
    var un = "undefined"; 
    var x = null; // On platforms that understand the 'undefined' keyword replace 'null' with 'undefined' for maximum ASP-like behaviour. 
    var f = "function"; 
    var n = "number"; 
    var r = "string"; 
    var e1 = "ERROR: Index out of range in\r\nRequest.QueryString"; 
    var e2 = "ERROR: Wrong number of arguments or invalid property assignment\r\nRequest.QueryString"; 
    var e3 = "ERROR: Object doesn't support this property or method\r\nRequest.QueryString.Key"; 
    var dU = window.decodeURIComponent ? 1 : 0; 

function Err(arg) { 
    if (ea) { 
     alert("Request Object:\r\n" + arg); 
    } 
} 
function URID(t) { 
    var d = ""; 
    if (t) { 
     for (var i = 0; i < t.length; ++i) { 
      var c = t.charAt(i); 
      d += (c == "+" ? " " : c); 
     } 
    } 
    return (dU ? decodeURIComponent(d) : unescape(d)); 
} 
function OL(o) { 
    var l = 0; 
    for (var i in o) { 
     if (typeof o[i] != f) { 
      l++; 
     } 
    } 
    return l; 
} 
function AK(key) { 
    var auk = true; 
    for (var u in QS) { 
     if (typeof QS[u] != f && u.toString().toLowerCase() == key.toLowerCase()) { 
      auk = false; 
      return u; 
     } 
    } 
    if (auk) { 
     QS[key] = new Object(); 
     QS[key].toString = function() { 
      return TS(QS[key]); 
     } 
     QS[key].Count = function() { 
      return OL(QS[key]); 
     } 
     QS[key].Count.toString = function() { 
      return OL(QS[key]).toString(); 
     } 
     QS[key].Item = function(e) { 
      if (typeof e == un) { 
       return QS[key]; 
      } 
      else { 
       if (typeof e == n) { 
        var a = QS[key][Math.ceil(e)]; 
        if (typeof a == un) { 
         Err(e1 + "(\"" + key + "\").Item(" + e + ")"); 
        } 
        return a; 
       } 
       else { 
        Err("ERROR: Expecting numeric input in\r\nRequest.QueryString(\"" + key + "\").Item(\"" + e + "\")"); 
       } 
      } 
     } 
     QS[key].Item.toString = function(e) { 
      if (typeof e == un) { 
       return QS[key].toString(); 
      } 
      else { 
       var a = QS[key][e]; 
       if (typeof a == un) { 
        Err(e1 + "(\"" + key + "\").Item(" + e + ")"); 
       } 
       return a.toString(); 
      } 
     } 
     QS[key].Key = function(e) { 
      var t = typeof e; 
      if (t == r) { 
       var a = QS[key][e]; 
       return (typeof a != un && a && a.toString() ? e : ""); 
      } 
      else { 
       Err(e3 + "(" + (e ? e : "") + ")"); 
      } 
     } 
     QS[key].Key.toString = function() { 
      return x; 
     } 
    } 
    return key; 
} 
function AVTK(key, val) { 
    if (key != "") { 
     var key = AK(key); 
     var l = OL(QS[key]); 
     QS[key][l + 1] = val; 
    } 
} 
function TS(o) { 
    var s = ""; 
    for (var i in o) { 
     var ty = typeof o[i]; 
     if (ty == "object") { 
      s += TS(o[i]); 
     } 
     else if (ty != f) { 
      s += o[i] + ", "; 
     } 
    } 
    var l = s.length; 
    if (l > 1) { 
     return (s.substring(0, l-2)); 
    } 
    return (s == "" ? x : s); 
} 
function KM(k, o) { 
    var k = k.toLowerCase(); 
    for (var u in o) { 
     if (typeof o[u] != f && u.toString().toLowerCase() == k) { 
      return u; 
     } 
    } 
} 
if (window.location && window.location.search) { 
    LS = window.location.search; 
    var l = LS.length; 
    if (l > 0) { 
     LS = LS.substring(1,l); 
     var preAmpAt = 0; 
     var ampAt = -1; 
     var eqAt = -1; 
     var k = 0; 
     var skip = false; 
     for (var i = 0; i < l; ++i) { 
      var c = LS.charAt(i); 
      if (LS.charAt(preAmpAt) == "=" || (preAmpAt == 0 && i == 0 && c == "=")) { 
       skip=true; 
      } 
      if (c == "=" && eqAt == -1 && !skip) { 
       eqAt=i; 
      } 
      if (c == "&" && ampAt == -1) { 
       if (eqAt!=-1) { 
        ampAt=i; 
       } 
       if (skip) { 
        preAmpAt = i + 1; 
       } 
       skip = false; 
      } 
      if (ampAt>eqAt) { 
       AVTK(URID(LS.substring(preAmpAt, eqAt)), URID(LS.substring(eqAt + 1, ampAt))); 
       preAmpAt = ampAt + 1; 
       eqAt = ampAt = -1; 
       ++k; 
      } 
     } 
     if (LS.charAt(preAmpAt) != "=" && (preAmpAt != 0 || i != 0 || c != "=")) { 
      if (preAmpAt != l) { 
       if (eqAt != -1) { 
        AVTK(URID(LS.substring(preAmpAt,eqAt)), URID(LS.substring(eqAt + 1,l))); 
       } 
       else if (preAmpAt != l - 1) { 
        AVTK(URID(LS.substring(preAmpAt, l)), ""); 
       } 
      } 
      if (l == 1) { 
       AVTK(LS.substring(0,1),""); 
      } 
     } 
    } 
} 
var TC = OL(QS); 
if (!TC) { 
    TC=0; 
} 
QS.toString = function() { 
    return LS.toString(); 
} 
QS.Count = function() { 
    return (TC ? TC : 0); 
} 
QS.Count.toString = function() { 
    return (TC ? TC.toString() : "0"); 
} 
QS.Item = function(e) { 
    if (typeof e == un) { 
     return LS; 
    } 
    else { 
     if (typeof e == n) { 
      var e = Math.ceil(e); 
      var c = 0; 
      for (var i in QS) { 
       if (typeof QS[i] != f && ++c == e) { 
        return QS[i]; 
       } 
      } 
      Err(e1 + "().Item(" + e + ")"); 
     } 
     else { 
      return QS[KM(e, QS)]; 
     } 
    } 
    return x; 
} 
QS.Item.toString = function() { 
    return LS.toString(); 
} 
QS.Key = function(e) { 
    var t = typeof e; 
    if (t == n) { 
     var e = Math.ceil(e); 
     var c = 0; 
     for (var i in QS) { 
      if (typeof QS[i] != f && ++c == e) { 
       return i; 
      } 
     } 
    } 
    else if (t == r) { 
     var e = KM(e, QS); 
     var a = QS[e]; 
     return (typeof a != un && a && a.toString() ? e : ""); 
    } 
    else { 
     Err(e2 + "().Key(" + (e ? e : "") + ")"); 
    } 
    Err(e1 + "().Item(" + e + ")"); 
} 
QS.Key.toString = function() { 
    Err(e2 + "().Key"); 
} 
this.QueryString = function(k) { 
    if (typeof k == un) { 
     return QS; 
    } 
    else { 
     if (typeof k == n) { 
      return QS.Item(k); 
     } 
     var k = KM(k, QS); 
     if (typeof QS[k] == un) { 
      t = new Object(); 
      t.Count = function() { 
       return 0; 
      } 
      t.Count.toString = function() { 
       return "0"; 
      } 
      t.toString = function() { 
       return x; 
      } 
      t.Item = function(e) { 
       return x; 
      } 
      t.Item.toString = function() { 
       return x; 
      } 
      t.Key = function(e) { 
       Err(e3 + "(" + (e ? e : "") + ")"); 
      } 
      t.Key.toString = function() { 
       return x; 
      } 
      return t; 
     } 
     else { 
      return QS[k]; 
     } 
    } 
} 
this.QueryString.toString = function() { 
    return LS.toString(); 
} 
this.QueryString.Count = function() { 
    return (TC ? TC : 0); 
} 
this.QueryString.Count.toString = function() { 
    return (TC ? TC.toString() : "0"); 
} 
this.QueryString.Item = function(e) { 
    if (typeof e == un) { 
     return LS.toString(); 
    } 
    else { 
     if (typeof e == n) { 
      var e = Math.ceil(e); 
      var c = 0; 
      for (var i in QS) { 
       if (typeof QS[i] != f && ++c == e) { 
        return QS[i]; 
       } 
      } 
      Err(e1 + ".Item(" + e + ")"); 
     } 
     else { 
      return QS[KM(e, QS)]; 
     } 
    } 
    if (typeof e == n) { 
     Err(e1 + ".Item(" + e + ")"); 
    } 
    return x; 
} 
this.QueryString.Item.toString = function() { 
    return LS.toString(); 
} 
this.QueryString.Key = function(e) { 
    var t = typeof e; 
    if (t == n) { 
     var e = Math.ceil(e); 
     var c = 0; 
     for (var i in QS) { 
      if (typeof QS[i] == "object" && (++c == e)) { 
       return i; 
      } 
     } 
    } 
    else if (t == r) { 
     var e = KM(e, QS); 
     var a = QS[e]; 
     return (typeof a != un && a && a.toString() ? e : ""); 
    } 
    else { 
     Err(e2 + ".Key(" + (e ? e : "") + ")"); 
    } 
    Err(e1 + ".Item(" + e + ")"); 
} 
this.QueryString.Key.toString = function() { 
    Err(e2 + ".Key"); 
} 
this.Version = 1.4; 
this.Author = "Andrew Urquhart (http://andrewu.co.uk)"; 
} 
var Request = new RObj(false); 

我怎麼能只顯示被點擊並沒有看到這兩個字符串,該按鈕的字符串?

+0

這將是有幫助的鏈接到一個測試用例。 – 2011-04-08 21:01:46

+0

這裏是一個測試頁面:http://userpages.umbc.edu/~andrade1/querystring/querystring/example1%20-%20Copy.html當在操作頁面上點擊任一按鈕時,它顯示兩個查詢字符串並且不會只顯示一個 – Jack 2011-04-08 21:05:03

回答

0

爲了識別被點擊的按鈕,你需要有兩種形式。 name1view_1應包含在一個表格中,另一個表格應該有name2view_2。這是識別點擊按鈕的唯一方法。如果存在name1,則點擊view_1,如果存在name2則點擊view_2

更新:增加了代碼示例

<form name="exampleform" id="exampleform" action="example123.html" method="get"> 
    <fieldset> 
     <legend>Creating The Querystring</legend> 
     <label for="name_1">Name:</label> 
     <input type="text" name="name1" id="name_1" tabindex="1" size="40" value="Test1" /> 
     <br /> 
     <br />  
     <input type="submit" id='view_1' value="Submit" tabindex="2" />  
    </fieldset> 
</form> 

    <br /> 
    <br /> 
<form name="exampleform1" id="exampleform1" action="example123.html" method="get"> 
    <fieldset> 
     <legend>Creating The Querystring</legend> 
     <label for="name_2">Name:</label> 
     <input type="text" name="name2" id="name_2" tabindex="1" size="40" value="Test2" /> 
     <br /> 
     <br /> 

     <input type="submit" id='view_2' value="Submit" tabindex="2" /> 

    </fieldset> 
</form> 
+0

它不起作用。它顯示名稱:測試1名稱:空或名稱:空名稱:測試2 – Jack 2011-04-08 21:29:17

0

要放置兩個領域中的一種形式。如果您只想要一個值,請使用兩種形式。

+0

我希望他們在相同的形式我有多個按鈕,顯示錶中的每一行 – Jack 2011-04-08 21:30:48

0

我重寫了您的示例頁面 現在您有2個窗體exampleform和exampleform2。這兩個數據提交到同一頁面example123.html 另請注意,第二種形式我改名一切從NAME_2到NAME_1保持它在你的迴應頁與第一種形式洽現在

<form name="exampleform" id="exampleform" action="example123.html" method="get"> 
    <fieldset> 
    <legend>Creating The Querystring</legend> 
    <label for="name_1">Name:</label> 
    <input name="name1" id="name_1" tabindex="1" size="40" value="Test1" type="text"> 
    <br> 
    <br> 
    <input value="Submit" tabindex="2" type="submit"> 
    <input value="Reset" tabindex="2" type="reset"> 
    </fieldset> 
</form> 
<form name="exampleform2" id="exampleform2" action="example123.html" method="get"> 
    <br> 
    <br> 
    <fieldset> 
    <legend>Creating The Querystring</legend> 
    <label for="name_1">Name:</label> 
    <input name="name1" id="name_1" tabindex="1" size="40" value="Test2" type="text"> 
    <br> 
    <br> 
    <input value="Submit" tabindex="2" type="submit"> 
    <input value="Reset" tabindex="2" type="reset"> 
    </fieldset> 
</form> 

所有你需要看看對於是

document.write("Name: " + Request.QueryString("name1")); 

名2不復存在
[更新] 按照您在下面做了註釋。除非您驗證提交的數據,否則您不能爲每個表單提交不同的數據提交按鈕。

0

有一個嚴重的安全問題與你正在嘗試做什麼,我會在下面解釋。但是如果你遵循,你仍然可以利用你的技術。

使用您當前的代碼,您可以通過確保第二個文件名爲「example123.html」,保存在與其他文件相同的目錄中,並且您的document.write()調用發生在對象被定義爲Request。同時檢查空值,這個返回一個對象而不是一個字符串的類變得特別困難,所以它不容易和null比較。

var name1 = Request.QueryString("name1"), 
    name2 = Request.QueryString("name2"); 
if (name1+'' != 'null') { 
    document.write("Name: " + name1); 
} 

if (name2+'' != 'null') { 
    document.write("Name: " + name2); 
} 

話雖這麼說,你正在使用的代碼如下一些(其他)陋習,同時方便或許對某些人在模仿ASP請求行爲真的好有利於其他更標準的做法,放棄了。

我們做了那些未來不是從PHP背景(見http://phpjs.org/functions/import_request_variables:431)的,如果你使用下面的代碼,將讓你訪問你的變量像這樣類似的功能:

ini_set('phpjs.getVarsObj', $_GET = {}); 
import_request_variables('g'); 

if ($_GET['name1']) { 
    document.write(htmlspecialchars($_GET['name1'])); 
} 
if ($_GET['name2']) { 
    document.write(htmlspecialchars($_GET['name2'])); 
} 

但是!。 ...請注意一個重要的警告,但是如果您使用的功能類似於您找到的(或我們的)功能,您將檢查此信息的URL,因爲1)您的表單是method = get,2)方JavaScript本身不能檢測數據如何發送給它的任何其他方法,因此如果您不小心使用$ _GET變量的內容做什麼,有人可能會鏈接到s omeone到您的網站的方式,以便您的網站的訪問者的cookie存儲的密碼被盜或做其他惡作劇。換句話說,與服務器端代碼一樣,請注意XSS(Cross-site scripting)。

例如,如果某人填寫姓名錶單上使用此代碼:

<script>alert('boo!');</script> 

...在某些瀏覽器,除了對人提交表單,誰點擊鏈接的結果上(例如,如果黑客誘惑某人點擊它)會看到該警報。這可能看起來並不那麼嚴重,但如果JavaScript代替在您的網站上檢測到他們的cookie密碼,他們可以製作它,以便腳本將他們的cookie發送到他們自己的站點。

更安全的解決方案是使用函數(如http://phpjs.org/functions/htmlspecialchars:426)來逃避潛在的不安全字符,如<和&。

document.write(htmlspecialchars($_GET['name1']); 

這個函數是基於PHP中同名函數的,所以它可以在那裏用於相同的purppose。

(如果你真的想允許包含在HTML頁面,這是更具挑戰性和恰好是我剛纔問了一個問題:JavaScript-based X/HTML & CSS sanitization