www.domain.com/lookbook.html#look0&product1
在页面加载时我想抓住整个哈希即。 #look0&product1
然后将其拆分并在名为0
的变量中保存外观的数量var look
,并在另一个名为1
的变量中保存产品编号var product
。不知道如何实现这一目标。
这也是传递和检索此类参数的最佳方式吗?感谢
答案 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.
});
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;
答案 3 :(得分:0)
你可以试试这个:
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;
我们基本上使用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)
你应该使用:
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;
用作
parseHash(location.hash /* #look=0&product=1 );
/ 返回{look:0,product:1} /