Frage

Also, ich war Herumspielen mit diesem Dynamische Paniermehl Zuschreibung, und kam ein Problem auf, wo, wenn der Verzeichnisname ein Leerzeichen drin, dann% 20 wird hinzugefügt, um die tatsächlichen sichtbar Brotkrümel hat. Würde dieser entfernt wird mit der decodeURI () Funktion oder gibt es einen besseren Weg?

Hier ist die 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);

Wenn decodeURI () verwendet werden sollte, wo genau es gehen würde? Auch mehr in keinem Zusammenhang wäre es eine Option geben Sie den angezeigten Code hinzufügen, dass könnte, würde die aktuelle Seite innerhalb des Verzeichnisses machen in den Brotkrumen als letzter Punkt aufgenommen werden, anstatt des letzten Verzeichnis? Nicht wirklich wichtig, aber dachte, ich würde auch fragen. Vielen Dank für jede Eingabe!

War es hilfreich?

Lösung

Ja, decodeURI den Trick. Sie können die Linie displayname = decodeURI(displayname); direkt vor dem if hinzufügen, die if ( i < page_ar.length -2 ) lautet:

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

Beachten Sie, dass seit displayname und currenturl Ende oben in einem rohen HTML-String direkt eingebettet werden, spezielle HTML-Zeichen zunächst entgangen sein sollte, sonst Sie sind offen für einige XSS-Angriffe (man stelle sich einige bösartige einzelne Posting einen Link zu Ihrer Website wie yoursite.com/valid/page/%3Cscript%3Ealert%28%22Oh%20no Quer site_scripting 2C%%% 20nicht 20XSS% 21% 22% 29% 3C% 2Fscript% 3E). Eine der einfachsten Möglichkeiten, dies zu tun, ist von diese Antwort bedeckt, obwohl es erfordert jQuery.

Wenn Sie die aktuelle Seite in den Brotkrumen enthalten sein sollen, ich glaube, es ausreichend ist, um die Schleife zu ändern 0 zu gehen, anstatt page_ar.length page_ar.length - 1:

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

Andere Tipps

Sie decodeURIComponent() verwenden sollten, nicht für diese decodeURI(). Es ist ein wenig schwer zu sehen, was Sie zu tun versuchen, aber hier ist etwas einfacher Code, den Sie ein Array der ‚Verzeichnisse‘ in der aktuellen URI geben, decodiert:

var dirs = location.pathname.split('/');
for (var i=0,len=dirs.length;i<len;++i){
  dirs[i] = decodeURIComponent(dirs[i]);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top