0

Итак, я столкнулся с этой записью Dynamic Breadcrumbs и столкнулся с проблемой, когда, если имя каталога имеет пробел в ней, то% 20 добавляется к фактической видимой паре. Будет ли это удалено с помощью функции decodeURI() или есть лучший способ?Есть ли способ удалить% 20 ​​из динамически созданных панировочных сухарей?

Вот в ЯШ:

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

Если decodeURI) должен был быть использован (где точно бы это пойти? Кроме того, более несвязанный, будет ли вариант, который вы могли бы добавить к приведенному выше коду, который заставил бы фактическую страницу внутри каталога быть включенной в панировочные сундуки в качестве последнего элемента вместо последнего каталога? Не очень важно, но я подумал, что спрошу. Спасибо за любой вклад!

ответ

2

Да, decodeURI будет делать трюк. Вы можете добавить строку displayname = decodeURI(displayname); прямо перед if, который читает if (i < page_ar.length -2):

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

Обратите внимание, что с displayname и currenturl в конечном итоге непосредственно встроены в необработанном HTML строки, любые специальные HTML символы должны быть экранированы первым, иначе вы» откройте для себя XSS attacks (представьте себе, что некоторые злонамеренные пользователи размещают ссылку на ваш сайт, например yoursite.com/valid/page/%3Cscript%3Ealert%28%22Oh%20no%2C%20not%20XSS%21%22%29%3C% 2Fscript% 3E). Один из простейших способов сделать это покрыт this answer, хотя для этого требуется jQuery.

Если вы хотите текущую страницу, включенную в панировке, я считаю, что это достаточно, чтобы изменить цикл, чтобы перейти от 0 до page_ar.length вместо page_ar.length - 1:

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

Спасибо за ваш вклад Cam и для добавлена ​​информация об экранировании html-символов. Хорошая вещь! –

1

Вы должны использовать decodeURIComponent(), не decodeURI() для этого , Это немного трудно понять, что вы пытаетесь сделать, но вот несколько проще код, который даст вам массив «каталогов» в текущем URI, декодируется:

var dirs = location.pathname.split('/'); 
for (var i=0,len=dirs.length;i<len;++i){ 
    dirs[i] = decodeURIComponent(dirs[i]); 
}