Question

Alors, je déconner avec cette dynamique Breadcrumbs écriture, et est tombé sur un problème où si le nom du répertoire a un espace, puis% 20 est ajouté au fil d'ariane réelle visible. Serait-ce être retiré en utilisant decodeURI () fonction ou est-il une meilleure façon?

Voici les js:

 var crumbsep = " • ";
 var precrumb = "<span class=\"crumb\">";
 var postcrumb = "</span>";
 var sectionsep = "/";
 var rootpath = "/"; // Use "/" for root of domain.
 var rootname = "Home";

 var ucfirst = 1; // if set to 1, makes "directory" default to "Directory"

 var objurl = new Object;

 // Grab the page's url and break it up into directory pieces
 var pageurl = (new String(document.location));
 var protocol = pageurl.substring(0, pageurl.indexOf("//") + 2);
 pageurl = pageurl.replace(protocol, ""); // remove protocol from pageurl
 var rooturl = pageurl.substring(0, pageurl.indexOf(rootpath) + rootpath.length); // find rooturl
 if (rooturl.charAt(rooturl.length - 1) == "/") //remove trailing slash
 { 
 rooturl = rooturl.substring(0, rooturl.length - 1); 
 }
 pageurl = pageurl.replace(rooturl, ""); // remove rooturl from pageurl
 if (pageurl.charAt(0) == '/') // remove beginning slash
 { 
 pageurl = pageurl.substring(1, pageurl.length); 
 }

 var page_ar = pageurl.split(sectionsep);
 var currenturl = protocol + rooturl;
 var allbread = precrumb + "<a href=\"" + currenturl + "\">" + rootname + "</a>" + postcrumb; // start with root

 for (i=0; i < page_ar.length-1; i++)
 { 
 var displayname = "";
   currenturl += "/" + page_ar[i];
   if (objurl[page_ar[i]])
   { 
   displayname = objurl[page_ar[i]]; 
   }
   else
   { 
   if (ucfirst == 1)
  { 
  displayname = page_ar[i].charAt(0).toUpperCase() + page_ar[i].substring(1); 
  }
  else
  { 
  displayname = page_ar[i];
  }
   }
   if ( i < page_ar.length -2 )
  { 
  allbread += precrumb + crumbsep +  "<a href=\"" + currenturl + "\">" + displayname + "</a>" + postcrumb; 
  }
   else
    { 
    allbread += crumbsep +  displayname; 
    }
 }
 document.write(allbread);

Si decodeURI () devait être utilisé, où serait-il exactement aller? En outre, plus aucun rapport, y aurait-il une option que vous pouvez ajouter au code ci-dessus qui rendrait la page réelle à l'intérieur du répertoire inclus dans les miettes de pain que le dernier élément au lieu du dernier répertoire? Pas vraiment important mais je pensais que je demanderais aussi bien. Merci pour toute entrée!

Était-ce utile?

La solution

Oui, decodeURI fera l'affaire. Vous pouvez ajouter la displayname = decodeURI(displayname); ligne droite avant le if qui lit if ( i < page_ar.length -2 ):

...
displayname = decodeURI(displayname);
if ( i < page_ar.length -2 )
...

Notez que depuis displayname et currenturl finissent par être directement intégré dans une chaîne HTML brut, doivent être échappés des caractères spéciaux HTML premier, sinon vous êtes ouvert à certains attaques XSS (imaginez un individu malveillant affichant un lien vers votre site comme yoursite.com/valid/page/%3Cscript%3Ealert%28%22Oh%20no % 2C% 20not% 20XSS% 21% 22% 29% 3C% 2Fscript% 3E). L'une des façons de le faire si simples est couvert par cette réponse , mais il faut jQuery.

Si vous voulez que la page en cours inclus dans les miettes de pain, je crois qu'il suffit de changer la boucle pour passer de 0 à page_ar.length au lieu de page_ar.length - 1:

...
for (i=0; i < page_ar.length; i++)
...

Autres conseils

Vous devez utiliser decodeURIComponent(), non decodeURI() pour cela. Il est un peu difficile de voir ce que vous essayez de faire, mais voici un code simple qui vous donnera un tableau des « répertoires » dans l'URI courant, décodé:

var dirs = location.pathname.split('/');
for (var i=0,len=dirs.length;i<len;++i){
  dirs[i] = decodeURIComponent(dirs[i]);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top