Y at-il un moyen de supprimer 20% de mie de pain dynamiquement créés?
-
25-09-2019 - |
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!
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]);
}