使用JavaScript搜索URL中的哈希,而不是特定的字符串

使用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

我正在寻找一种方法来搜索网页的URL,在has中查找特定的关键字

例如,如果哈希“/three”存在,我想运行一个JavaScript函数。但问题是,我有八个散列,它们可以按任何特定顺序触发

这意味着我不能就这样做-

<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逻辑。啊,我知道这是基本逻辑。通过做这样的小项目,我学到了很多东西,说实话,这真的很有趣。最后一个问题,因为我觉得