Javascript & Split Arrays - PullRequest
       4

Javascript & Split Arrays

0 голосов
/ 13 июля 2010

То, чего я хочу достичь, просто. Я хочу, чтобы текст кнопки менялся в зависимости от того, на какой странице вы находитесь.

Я начинаю это с использования следующего:

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

Теперь, когда у меня есть URL-адрес и я разделил его на массив, я могу получить определенные каталоги в зависимости от позиции, например, так:

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

Теперь это работает, если каталогом является / test / Station /, однако, если кто-то введет /test/stations/index.html, он не будет работать. Как вы можете проверить это, не добавляя другой оператор if или не используя аналогичные условные выражения.

Ответы [ 8 ]

2 голосов
/ 13 июля 2010

На самом деле оба ваших примера работают одинаково./stations/ и /stations/index.html оба разделяются на две строки;/stations/ имеет пустую строку в конце.Так что length-2 сработало бы.Где бы это не сработало, было бы /stations, что выше уровня.Но обычно это не проблема, потому что если stations является статическим каталогом, веб-сервер перенаправит браузер на /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 с помощью строковых или регулярных выражений, что приведет к ошибке для строк запроса и идентификаторов фрагментов с / в них.*

(См. Также protocol, host, port, search, hash для других частей URL.)

1 голос
/ 13 июля 2010

Я не думаю, что разделение строк - лучший подход.Я бы сделал это с помощью RegEx.

var reStations = /\/stations(\/)?/i;
if (reStations.test(document.location.href))
    //Do whatever
0 голосов
/ 13 июля 2010

Для простоты предположим, что существует массив ключевых слов (например, "станция"), которые идентифицируют страницы, используют карту и пытаются сопоставить ее ключи со строкой href, используя indexOf,

var href = document.location.href ;
var identifiers = {
    "station": "Stations & Maps" , //!! map keys to result strings
    /* ... */
} ;

identifier_loop: //!! label to identify the current loop

    for(var n in identifiers) { //!! iterate map keys

        if( href.indexOf(n) !== -1 ) { //!! true if the key n in identifiers is in the href string

             var newT = document.createTextNode( identifiers[n] ) ; //!! create new text node with the mapped result string
             break identifier_loop ; //!! end iteration to stop spending ressources on the loop

        }

    }
0 голосов
/ 13 июля 2010

Ваш пример покажет пустую строку, потому что последний элемент пуст;так что вы можете просто сделать:

if (loc_array[loc_array.length-2] == 'stations')
{
    var newT = document.createTextNode("Stations & Maps");
}
0 голосов
/ 13 июля 2010

Я думаю, я вижу, куда вы идете с этим ... Как кто-то из вышеупомянутых, использование RegExp (регулярное выражение) может быть полезным ... но ТОЛЬКО если у вас было более одного типа страниц для фильтрации (html) / js / php / ...), но, похоже, вы хотите это сделать. Попробуйте что-то вроде этого:

var loc_array = document.location.href.split('/');
var i = loc_array.length-1;
var button_label = "default";

while(i>1)
{
    //checks to see if the current element at index [i] is html
    if(loc_array[i].indexOf(".html")>-1)
    {
        if(i>0)
        {
            var button_label = loc_array[i-1];
            break;
        }
    }
    i--;
}

alert(button_label);

Что он делает:

  1. захватить текущий URL (URI)
  2. разбить его на массив
  3. начиная с КОНЦА массива и работая НАЗАД, найдите первый элемент, который содержит идентификатор файла ".html".
  4. Теперь мы знаем, что элемент ДО нашего текущего элемента содержит метку, которую мы хотим добавить к нашим кнопкам ...
  5. Затем вы можете взять значение и назначить его там, где вам нужно.
  6. Если у вас закончились элементы, у него есть значение по умолчанию, которое вы можете использовать.

Не уверен, поможет ли это .....

Я протестировал приведенный выше код, и он заработал.

0 голосов
/ 13 июля 2010
if( document.location.href.split( "station" ).length > 1 ){ 
    //...
}
0 голосов
/ 13 июля 2010

Не совсем точно, что вы ищете, посмотрите, подходит ли это:

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;
    }
0 голосов
/ 13 июля 2010
if (loc_array[4]=='stations')

, если URL был http://www.example.com/test/stations/index.html,, значения в массиве будут:

  • [0] = "http:"
  • [1]= ""
  • [2] = "www.example.com"
  • [3] = "тест"
  • [4] = "станции"
  • [5] = "index.html"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...