开发者问题收集

Javascript 与拆分数组

2010-07-12
1059

我想要实现的目标很简单。我希望按钮的文本根据您所在的页面而变化。

我使用以下内容开始:

var loc_array = document.location.href.split('/');

现在我有了 URL 并将其拆分为数组,我可以根据位置抓取某些目录,如下所示:

if (loc_array[loc_array.length-1] == 'stations'){
  var newT = document.createTextNode("Stations & Maps");
}

如果目录是 /test/stations/,则此方法有效,但是如果有人输入 /test/stations/index.html,则此方法无效。如何在不引入另一个 if 语句或使用类似条件的情况下对此进行测试。

3个回答

实际上,您的两个示例的作用相同。 /stations//stations/index.html 都被拆分为两个字符串; /stations/ 末尾有一个空字符串。因此 length-2 可以正常工作。 /stations 不起作用,因为它比 /stations 高一级。但这通常不是问题,因为如果 stations 是静态目录,Web 服务器会将浏览器重定向到带有斜线的 /stations/

如果您自己进行路由,就不会发生这种情况。如果您正在进行路由,最好不要从路径部分列表的末尾进行索引,因为那里可能会有任何旧的垃圾作为路径参数传递,例如 /stations/region1/stationname2 。在这种情况下,您应该从一开始就进行索引。

如果应用程序可以安装在根目录以外的路径上,您将需要告诉 JavaScript 该根目录的路径,这样它就可以计算出要跳过多少个斜杠。您可能还需要出于其他目的告诉它,例如,如果它动态创建任何图像,它需要知道根目录才能找出从中获取图像的目录。

var BASE= '/path-to/mysite';
var BASELEVEL= BASE.split('/').length;
...

var pagename= location.pathname.split('/')[BASELEVEL];
// '/path-to/mysite/stations/something' -> 'stations'

我正在使用 location.pathname 仅提取 URL 的路径部分,而不是尝试使用字符串或正则表达式方法分开 href ,这对于查询字符串和带有 / 的片段标识符会失败。

(另请参阅 protocolhostportsearchhash 了解 URL 的其他部分。)

bobince
2010-07-12

我不认为字符串拆分是这里的最佳方法。我会使用 RegEx 来实现。

var reStations = /\/stations(\/)?/i;
if (reStations.test(document.location.href))
    //Do whatever
Michal
2010-07-12

不确定您正在寻找什么,看看这个是否合适:

var loc_array = document.location.href.split('/');

// this will loop through all parts
foreach (var i in loc_array) {
   switch (loc_array[i]) {
      case "stations":
         // do something
      break;

       // other cases
   }
}

   // or if you want to check each specific element
   switch (loc_array[0]) {
      case "stations": // assuming /stations/[something/]
         if (typeof loc_array[1] != 'undefined' && loc_array[1] == "something") {
            // do things
         }
      break;
    }
Rod
2010-07-12