هل هناك طريقة لإزالة ٪ 20 من فتات الخبز التي تم إنشاؤها ديناميكيًا؟

StackOverflow https://stackoverflow.com/questions/4200795

سؤال

لذا ، كنت أتعاطى مع هذا فتات الخبز الديناميكية الكتابة ، وصادف مشكلة حيث إذا كان اسم الدليل يحتوي على مساحة فيه ، فسيتم إضافة ٪ 20 إلى الخبز المرئي الفعلي. هل ستتم إزالة هذا باستخدام decodeuri () وظيفة أم أن هناك طريقة أفضل؟

ها هي 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);

لو decodeuri () كان لاستخدامها ، أين ستذهب بالضبط؟ وأيضًا ، أكثر ارتباطًا ، هل سيكون هناك خيار يمكنك إضافته إلى الكود أعلاه والذي من شأنه أن يجعل الصفحة الفعلية داخل الدليل يتم تضمينها في فتات الخبز كعنصر آخر بدلاً من الدليل الأخير؟ ليست مهمة حقيقية ولكن اعتقدت أنني سأطلب كذلك. شكرا على أي مدخلات!

هل كانت مفيدة؟

المحلول

نعم، 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 ) تتم تغطية واحدة من أبسط الطرق للقيام بذلك هذا الجواب, ، على الرغم من أنها تتطلب jQuery.

إذا كنت تريد أن تكون الصفحة الحالية مدرجة في فتات الخبز ، فأعتقد أنه من يكفي تغيير الحلقة من 0 إلى page_ar.length بدلاً من page_ar.length - 1:

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

نصائح أخرى

يجب أن تستخدم decodeURIComponent(), ، ليس decodeURI() لهذا. من الصعب بعض الشيء أن ترى ما تحاول القيام به ، ولكن إليك بعض التعليمات البرمجية الأكثر بساطة التي ستمنحك مجموعة من "الدلائل" في URI الحالية ، فك تشفيرها:

var dirs = location.pathname.split('/');
for (var i=0,len=dirs.length;i<len;++i){
  dirs[i] = decodeURIComponent(dirs[i]);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top