使用JavaScript搜索URL中的哈希,而不是特定的字符串
我正在寻找一种方法来搜索网页的URL,在has中查找特定的关键字 例如,如果哈希“/three”存在,我想运行一个JavaScript函数。但问题是,我有八个散列,它们可以按任何特定顺序触发 这意味着我不能就这样做-使用JavaScript搜索URL中的哈希,而不是特定的字符串,javascript,html,url,if-statement,hash,Javascript,Html,Url,If Statement,Hash,我正在寻找一种方法来搜索网页的URL,在has中查找特定的关键字 例如,如果哈希“/three”存在,我想运行一个JavaScript函数。但问题是,我有八个散列,它们可以按任何特定顺序触发 这意味着我不能就这样做- <script> window.onhashchange = function(){ switch(location.hash) { case '#hide': javascript:alert("Find a valid NFC
<script>
window.onhashchange = function(){
switch(location.hash) {
case '#hide':
javascript:alert("Find a valid NFC tag to continue!")
break;
case '#hide/one':
javascript:alert("You found piece number one!")
break;
case '#hide/two':
javascript:alert("You found piece number two!")
break;
case '#hide/three':
javascript:alert("You found piece number three!")
break;
case '#hide/four':
javascript:alert("You found piece number four!")
break;
case '#hide/five':
javascript:alert("You found piece number five!")
break;
case '#hide/six':
javascript:alert("You found piece number six!")
break;
case '#hide/seven':
javascript:alert("You found piece number seven")
break;
case '#hide/eight':
javascript:alert("You found piece number eight!")
break;
}
}
</script>
window.onhashchange=函数(){
开关(location.hash){
案例“#隐藏”:
javascript:alert(“查找有效的NFC标记以继续!”)
打破
案例“#隐藏/一”:
javascript:alert(“你找到了第一件!”
打破
案例“#隐藏/两个”:
javascript:alert(“您找到了第二件!”)
打破
案例“#隐藏/三个”:
javascript:alert(“您找到了第三件!”)
打破
案例“#隐藏/四个”:
javascript:alert(“您找到了第四件!”)
打破
案例“#隐藏/5”:
javascript:alert(“您找到了第五件!”)
打破
案例“#隐藏/六个”:
javascript:alert(“您找到了第六件!”)
打破
案例“#隐藏/七”:
javascript:alert(“您找到了第七件”)
打破
案例“#隐藏/八个”:
javascript:alert(“您找到了第八件!”)
打破
}
}
因为URL最终可能是“example.com/index.html#hide/one/five/three/etc…”。它现在的配置方式是专门搜索“#hide/one”、“#hide/two”等
但是“#hide”并不是随每个散列一起插入,而是随第一个散列一起插入。因此,永远不会有“隐藏/一/隐藏/二等”
我需要弄清楚如何在URL中搜索“一”、“二”、“三”等,并执行相应的功能
提前感谢,期待了解更多
编辑-只要通读我的文章,我觉得我应该澄清一些事情。你知道JavaScript函数“hash.length”吗?类似于“hash.length”的东西,但对于内容,比如“hash.content”之类的东西就更好了。但我认为这并不存在
-米切尔
var hashArray = location.hash.substr(1).split('/'); // substr(1) skips over the # at the beginning
if (hashArray.indexOf('hide') != -1) {
if (hashArray.indexOf('one') != -1) {
alert("You found piece number one");
} else if (hashArray.indexOf('two') != -1) {
alert("You found piece number two");
} ...
}
顺便说一句,在调用alert()
之前,不需要标签javascript:
。您唯一需要javascript:
的时候是将脚本放入通常包含URL的HTML属性中,例如href
和src
属性——它代替了类似http:
的内容,告诉它运行代码而不是下载文档
它在这种情况下起作用。单击链接后,编辑URL并将
one
更改为two
,您将收到警报。如果您想测试哈希是否以#hash
开头,并且哈希路径中存在数字,则可以尝试此操作
window.onhashchange = function() {
if (location.hash.indexOf('#hash') !== 0) {
return;
}
location.split('/').forEach(function(num) {
switch (num) {
case 'one':
alert("You found piece number one!");
break;
// ...
case 'eight':
alert("You found piece number eight!");
break;
}
});
}
请注意这一点。这一点更具动态性
您只需更改第一个变量“aHash”,其余变量将自动构建。
顺便说一句,这只是为了防止脚本对用户自己的哈希操作产生反应。
否则,您可以只迭代分割的哈希字符串,但这很容易出错
// here goes the configuration
// if you want to change the "keys" here's the right place
// therefor it's better maintainable
var aHash = ['one', 'two', 'three'];
// autobuild an object with values as keys from given array at the top
var oHash = {},
i = aHash.length;
// don't forget that iteration usually starts with [0] but if you get the length will be 1 if one element is available
while( i-- )
{
oHash[ aHash[ i ] ] = null;
}
window.onhashchange = function()
{
// split hash into pieces into an array
aHash = document.location.hash.split('/');
var iL = aHash.length;
// workaround for case: '#hide/'
if (aHash[ iL-1 ] === '')
{
--iL;
}
if (iL == 1 && aHash[0] === '#hide')
{
alert ('Find a valid NFC tag to continue!');
return;
}
// only needed if one wants to collect the result
var sAlert = '';
// iterate from left to right in hash
// if this isn't nessecary one can use the same while structure like at the beginning (without iL)
i = -1;
while( ++i < iL )
{
if (oHash[ aHash[ i ] ] === null )
{
// alert every time
alert( 'You found piece number ' + aHash[ i ] + '!' );
// colect for alert
sAlert += aHash[ i ] + ' and ';
}
}
if (sAlert !== '')
{
alert( 'You found pieces number ' + sAlert.substr( 0, sAlert.length-5 ) + '!' );
}
}
//下面是配置
//如果你想换“钥匙”,这里是正确的地方
//因此,它具有更好的可维护性
var aHash=['1','2','3'];
//自动生成一个对象,该对象的值作为顶部给定数组中的键
var oHash={},
i=aHash.长度;
//不要忘记迭代通常以[0]开始,但是如果您得到了,那么如果有一个元素可用,那么长度将是1
而(我--)
{
oHash[aHash[i]]=null;
}
window.onhashchange=函数()
{
//将散列拆分为一个数组
aHash=document.location.hash.split('/');
var iL=aHash.长度;
//案例的解决方法:“#隐藏/”
如果(aHash[iL-1]='')
{
--白细胞介素;
}
如果(iL==1&&aHash[0]==='#隐藏')
{
警报('查找有效的NFC标记以继续!');
返回;
}
//仅当想要收集结果时才需要
var sAlert=“”;
//在散列中从左到右迭代
//如果这不是nessecary,可以使用与开始时相同的while结构(没有iL)
i=-1;
而(++i
它是一个字符串-使用正则表达式。为什么不在/
上拆分,然后迭代数组元素,并在每次迭代时检查各个值?如果您需要在开始时使用#hash
,只需对字符串进行索引搜索并验证其是否为0
.Regex?事实上,我以前从未真正听到过这个词。我该如何使用正则表达式?你从没听说过正则表达式吗?转到www.regular-expression.info.重载开关以对每种情况进行比较:switch(true){case!!location.hash.match(“#hide”):…看起来非常好,但似乎不起作用。就像中一样,实际上什么都没有发生。控制台中也没有错误。哦,感谢警报()
tip,我不知道!很有趣。我正在尝试这样做,当我添加一个新的时,例如,如果我在“/one”之后添加“/two”,它会说我添加了两个而不是一个。目前,如果“/one”已经添加,而我添加了“/two”,它会说我找到了“one”同样。我的函数使用else if
,因此它只报告找到的第一个。如果要报告所有匹配项,请使用一系列if
语句,而不是else if
。或者,您可以简单地使用for
循环遍历所有元素,报告每个元素。这只是基本的编程l逻辑。啊,我知道这是基本逻辑。通过做这样的小项目,我学到了很多东西,说实话,这真的很有趣。最后一个问题,因为我觉得