2011-04-08 82 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