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

时间:2014-08-14 20:17:02

标签: javascript html url if-statement hash

我正在寻找一种搜索网页网址的方法,在该网页中查找特定关键字。

例如,如果哈希" /三"存在,我想运行一个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>

因为网址最终可能是&#34; example.com/index.html#hide/one/five/three/etc ..&#34;。它现在的配置方式是,它专门搜索&#34;#hide / one&#34;,&#34; #elay / two&#34;等等。

但&#34;#hide&#34;没有插入每个哈希值,只有第一个哈希值。所以永远不会有##;; hide / one /#hide / two等等#34;。

我需要弄清楚如何在URL中搜索&#34; one&#34;,&#34; two&#34;,&#34; three&#34;等等,并相应地执行功能。

提前致谢,期待在此了解更多!

编辑 - 只需阅读我的帖子,我觉得我应该澄清一些事情。你知道JavaScript函数&#34; hash.length&#34;?类似&#34; hash.length&#34;但对于内容,例如&#34; hash.content&#34;或者什么会很棒。我不认为存在。

-Mitchyl

3 个答案:

答案 0 :(得分:0)

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");
    } ...
}

顺便说一句,在致电javascript:之前,您不需要标签alert()。您需要javascript:的唯一时间是将脚本放入通常包含网址的HTML属性中,例如hrefsrc属性 - 它取代http:之类的内容来告诉它运行代码而不是下载文档。

它适用于此DEMO。点击该链接后,修改网址并将one更改为two,即可获得提醒。

答案 1 :(得分:0)

这个更有活力。

你只需要更改第一个var“aHash”,其余的将是autobuilt。 顺便说一句,这只是为了防止脚本对用户自己的哈希操作做出反应。 否则你可以只迭代拆分的哈希字符串,但这很容易出错。

// 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 ) + '!' );
  }
}

答案 2 :(得分:-1)

如果你想测试哈希以#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;
        }
    });
}

请注意won't work in IE7 or IE8