从URL中的哈希获取多个值

时间:2015-09-02 07:45:02

标签: javascript jquery

www.domain.com/lookbook.html#look0&product1

在页面加载时我想抓住整个哈希即。 #look0&product1 然后将其拆分并在名为0的变量中保存外观的数量var look,并在另一个名为1的变量中保存产品编号var product。不知道如何实现这一目标。

这也是传递和检索此类参数的最佳方式吗?感谢

5 个答案:

答案 0 :(得分:2)

使用var myHash = location.hash获取网址的哈希部分。然后执行var params = myHash.split('&'),然后为每个部分执行part.split('=')以获取键值对。

也许最好从PHP端通过GET传递这些参数,而不是在通过PHP处理页面时将它们发布到页面内?

<input type="hidden" name="look" value="<?php echo isset($_GET['look']) ? $_GET['look'] : '';?>"/>

答案 1 :(得分:1)

这是纯粹的Javascript方法:

function parseHash(hash) {
  // Remove the first character (i.e. the prepended "#").
  hash = hash.substring(1, hash.length);

  // This is where we will store our properties and values.
  var hashObj = {};

  // Split on the delimiter "&" and for each key/val pair...
  hash.split('&').forEach(function(q) {
    // Get the property by splitting on all numbers and taking the first entry.
    var prop = q.split(/\d/)[0];
    // Get the numerical value by splitting on all non-numbers and taking the last entry.
    var val_raw = q.split(/[^\d]/);
    var val = val_raw[val_raw.length - 1]

    // If the property and key are defined, add the key/val pair to our final object.
    if (typeof prop !== 'undefined' && typeof val !== 'undefined') {
      hashObj[prop] = +val;
    }
  });

  return hashObj;
}

使用类似:

parseHash(window.location.hash /* #book10&id1483 */)
/* returns: Object {book: 10, id: 1483} */

我建议使用规范通过位置的哈希值传递值:prop=value。例如:#book=10&id=311。然后,您可以轻松地在=上拆分每个属性。

答案 2 :(得分:0)

您可以使用.match(re)方法使用正则表达式从给定字符串中提取数字。

你可以试试这个:

var hashes = location.hash.split('&'); // get the hash and split it to make array
var values = hashes.map(function(hash){ // use .map to iterate and get a new array
    return hash.match(/\d+/)[0]; // returns the numbers from the string.
});

&#13;
&#13;
var loc = "look0345345345&product1";

var hashes = loc.split('&');

var values = hashes.map(function(hash){ return hash.match(/\d+/)[0]; });

document.body.innerHTML = '<pre>'+ JSON.stringify(values) + '</pre>';
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你可以试试这个:

&#13;
&#13;
var url = 'www.domain.com/lookbook.html#look0&product1'
,   result = {}
,   expr = RegExp(/[#&]([a-zA-z]+)(\d+)/g);
var parts = expr.exec(url);
while(parts != null && parts.length == 3) {
  result[parts[1]] = parts[2];
  parts = expr.exec(url);
}
var look = result['look']
,   product = result['product'];
document.getElementById('result').innerHTML = 'look = ' + look + '<br>' + 'product = ' + product;
&#13;
<p id='result'></p>
&#13;
&#13;
&#13;

我们基本上使用regular expression将参数名称和值分成两组,然后我们可以通过调用expr.exec(url)来获取这些组。

每次调用expr.exec(url)时,我们都会获得下一组名称和值组。

我们在result object

中将参数的值设置为其名称

在正则表达式/[#&]([a-zA-z]+)(\d+)/g中,g表示匹配每个时间后的/.../找到两个组。

这两个小组以&#[#&])开头。第一组是字母串([a-zA-z]+),即参数的名称。第二个是数字字符串(\d+),即您要查找的值。

正则表达式返回匹配模式的String作为parts数组中的第一个结果,后跟匹配的组,这意味着每个迭代中的两个组将为parts[1]和{ {1}}。

答案 4 :(得分:0)

你应该使用:

&#13;
&#13;
function parseHash(hash){
	hash = hash.substring(1, hash.length); //remove first character (#)
	var obj ={}; //create the output
	var qa = hash.split('&'); //split all parameters in an array
	for(var i = 0; i < qa.length; i++){
		var fra1 = qa[i].split('='); //split every parameter into [parameter, value]
		var prop = fra1[0]; 
		var value = fra1[1];
		if(/[0-9]/.test(value) && !isNaN(value)){ //check if is a number
			value = parseInt(value);
		}
		obj[prop] = value; //add the parameter to the value
	}
	return obj;
}


document.querySelector("input.hash").onkeyup = function(){
  console.log( parseHash(document.querySelector("input.hash").value));
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="hash"/>
<p class="output"></p>
&#13;
&#13;
&#13;

用作

parseHash(location.hash /* #look=0&product=1 );

/ 返回{look:0,product:1} /