2010-07-12 8 views
0

Ce que je veux accomplir est simple. Je veux que le texte d'un bouton change en fonction de la page sur laquelle vous êtes.Javascript & Split Arrays

je commence à cela en utilisant les éléments suivants:

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

Maintenant que je l'URL et le diviser dans un tableau que je peux saisir certains répertoires en fonction de la position, comme ceci:

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

Maintenant, cela fonctionne si le répertoire est/test/stations /, mais si quelqu'un tape /test/stations/index.html alors cela ne fonctionne pas. Comment pouvez-vous tester contre cela sans lancer une autre déclaration if ou en utilisant un conditionnel similaire.

+3

Pourquoi ne pas utiliser votre langage côté serveur pour ce faire? – greg0ire

+0

'loc_array [loc_array.length-1]' sera en fait une chaîne vide si votre URL est '/ test/stations /', donc cela ne fonctionnerait pas de toute façon. – casablanca

Répondre

2

En fait vos deux exemples fonctionnent de la même manière. /stations/ et /stations/index.html tous les deux sont divisés en deux chaînes; /stations/ a une chaîne vide à la fin. Donc, length-2 aurait travaillé. Où cela ne fonctionnerait pas serait /stations, qui est en hausse d'un niveau. Mais ce ne serait normalement pas un problème car si stations est un répertoire statique, le serveur web redirigera le navigateur vers /stations/ avec la barre oblique.

Cela n'arrivera pas si vous faites le routage vous-même. Si vous faites du routage, ce n'est pas une bonne idée d'indexer à partir de la fin de la liste des parties de chemin, il y a peut-être de vieilles ordures passées comme paramètres de chemin, par exemple. /stations/region1/stationname2. Dans ce cas, vous devriez indexer à partir du début à la place.

Si l'application peut être montée sur un chemin autre qu'une racine, vous devrez indiquer à JavaScript le chemin de cette racine, afin qu'elle calcule le nombre de barres obliques à ignorer. Vous aurez probablement aussi besoin de le dire à d'autres fins, par exemple s'il crée des images à la volée, il aura besoin de connaître la racine pour travailler sur le répertoire pour obtenir des images.

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

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

J'utilise location.pathname pour extraire uniquement la partie du chemin de l'URL, plutôt que d'essayer de prendre part href avec des méthodes de chaîne ou regex qui échoueraient pour les chaînes de requête et les identificateurs de fragment avec / en eux.

(Voir aussi , host, port, search, hash pour les autres parties de l'URL.)

+0

Le problème que j'ai est que j'ai m/station/rail mais aussi/m/station et c'est à cause de toutes les différences de dossier que ce problème se pose. – balexander

+0

Bien '/ m/station/rail' et'/m/station' devraient tous deux être détectés par 'location.pathname.split ('/') [1] === 'station''. Lors du routage, indexer à partir de l'avant de l'URL, pas l'arrière. – bobince

1

Je ne pense pas que la séparation de ficelle soit la meilleure approche ici. Je le ferais en utilisant RegEx.

var reStations = /\/stations(\/)?/i; 
if (reStations.test(document.location.href)) 
    //Do whatever 
+1

Cela va donner un faux positif dès que ''/ stations' 'apparaît dans la chaîne de requête ou une partie de chemin de fin, cependant. – bobince

0

Je ne sais pas exactement ce que vous cherchez, si cela correspond à:

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
if(document.location.href.split("station").length > 1){ 
    //... 
} 
0

Je pense que je vois où vous êtes aller avec cela ... Comme quelqu'un l'a dit plus haut en utilisant un RegExp (expression régulière) pourrait être utile ... mais SEULEMENT si vous aviez plus d'un seul type de page à filtrer (html/js/php/...), mais pour ce que vous voulez faire. Essayez quelque chose comme ceci:

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); 

Ce qu'il fait est:

  1. capture l'URL actuelle (URI)
  2. diviser en un tableau
  3. à partir de la fin du tableau et de travail BACKWARDS, recherchez le premier élément qui contient l'identificateur de fichier ".html".
  4. Nous savons maintenant que l'élément AVANT que notre élément actuel contient l'étiquette que nous voulons ajouter à nos boutons ...
  5. Vous pouvez ensuite prendre la valeur et l'assigner où vous en avez besoin.
  6. Si vous n'avez plus d'éléments, vous pouvez utiliser une valeur par défaut.

Je ne sais pas si cela aide .....

J'ai testé le code ci-dessus et cela a fonctionné.

0

Votre exemple montrera une chaîne vide, provoque le dernier élément est vide; de sorte que vous pouvez simplement faire:

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

Par souci de simplicité, en supposant qu'il existe un ensemble de mots-clés (comme « station ») qui identifient les pages, utilisez une carte et essayer de faire correspondre ses clés avec la chaîne href en utilisant 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 

     } 

    }