更新:我完全重写了这个答案。 旧代码仍在底部,但我不建议这样做。
您可以通过两种主要方法来访问for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}变量:
通过PHP的for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}数组(关联数组)。
通过JavaScript的for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}对象。
使用PHP,您可以制作一个“模板”,其内容如下:
var $_GET = JSON.parse("<?php echo json_encode($_GET); ?>");
但是,我认为这里的语言混合是草率的,应尽可能避免。 无论如何,我真的想不出任何充分的理由在PHP和JavaScript之间混合数据。
真正归结为:
如果可以通过JavaScript获取数据,请使用JavaScript。
如果无法通过JavaScript获取数据,请使用AJAX。
如果您另外需要与服务器通信,请使用AJAX。
因为我们在这里谈论for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}(或者至少我以为是我写原始答案的时候),所以您应该通过JavaScript来获取它。
在原始答案中,我有两种获取查询字符串的方法,但它太乱且容易出错。 这些现在位于此答案的底部。
无论如何,我设计了一个不错的小“类”来获取查询字符串(实际上是一个对象构造函数,请参阅MDN的OOP文章中的相关部分):
function QuerystringTable(_url){
// private
var url = _url,
table = {};
function buildTable(){
getQuerystring().split('&').filter(validatePair).map(parsePair);
}
function parsePair(pair){
var splitPair = pair.split('='),
key = decodeURIComponent(splitPair[0]),
value = decodeURIComponent(splitPair[1]);
table[key] = value;
}
function validatePair(pair){
var splitPair = pair.split('=');
return !!splitPair[0] && !!splitPair[1];
}
function validateUrl(){
if(typeof url !== "string"){
throw "QuerystringTable() :: : expected string, got " + typeof url;
}
if(url == ""){
throw "QuerystringTable() :: Empty string given for argument ";
}
}
// public
function getKeys(){
return Object.keys(table);
}
function getQuerystring(){
var string;
validateUrl();
string = url.split('?')[1];
if(!string){
string = url;
}
return string;
}
function getValue(key){
var match = table[key] || null;
if(!match){
return "undefined";
}
return match;
}
buildTable();
this.getKeys = getKeys;
this.getQuerystring = getQuerystring;
this.getValue = getValue;
}
JS领域
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
它更加健壮,不依赖于正则表达式,结合了前面两种方法的最佳部分,并将验证您的输入。 您可以给它查询URL以外的查询字符串,如果输入不正确,它将大声失败。 而且,就像一个好的对象/模块一样,它不知道也不关心类定义之外的任何东西,因此它可以与任何东西一起使用。
构造函数自动填充其内部表并解码每个字符串,例如for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}在内部将变为:
{
"foo?" : "bar baz",
"ampersand" : "this thing: &"
}
实例化时,所有工作都为您完成。
使用方法如下:
var qst = new QuerystringTable(location.href);
qst.getKeys() // returns an array of keys
qst.getValue("foo") // returns the value of foo, or "undefined" if none.
qst.getQuerystring() // returns the querystring
那好多了。 并将url部分留给程序员,既可以在非浏览器环境中使用它(在2940256856884516979712和2940256856884516979713中都进行了测试),还允许您比较两个不同的查询字符串的情况。
var qs1 = new QuerystringTable(/* url #1 */),
qs2 = new QuerystringTable(/* url #2 */);
if (qs1.getValue("vid") !== qs2.getValue("vid")){
// Do something
}
正如我上面所说的,此答案引用了两种凌乱的方法。 我将它们保留在此处,因此读者不必遍历修订历史记录即可找到它们。 他们来了:
1)for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}。这只是获取URL并直接用RegEx解析
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
简单,如果查询字符串为for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
},则$_GET(key)应该返回quack,而$_GET('bearsays')应该返回growl
现在,您可能会立即注意到,语法是函数的功能有所不同。 而不是2940256884516916979712,而是$_GET(key)。好吧,我想到了:)
这是第二种方法:
2) for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
看哪! $ _GET现在是一个对象,其中包含url中每个对象的索引,因此现在可以这样做:
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
而且这是可能的
for(i in $_GET){
document.write(i+': '+$_GET[i]+'
')
}
此功能绝对不可能。
同样,我不建议使用此旧代码。 写得不好。