Настройка класса CSS по URL-адресу с помощью ColdFusion

В приведенном ниже коде я пытаюсь программно установить класс li как «активный» с помощью ColdFusion на основе URL-адреса, по которому я сейчас нахожусь. Итак, в этом примере я приземлился на main.cfm и мне нужно активировать этот конкретный класс li. Если я на www.mysite.com/review.cfm, я бы хотел установить этот класс как «активный».

<div id="menu">
    <ul>
        <li class="active"><a href="main.cfm">Main</a></li>
        <li class=""><a href="review.cfm" title="">Review</a></li>
        <li class=""><a href="https://www.mysite.com">My Site</a></li>
        <li class=""><a href="reporting">Reporting</a></li>
        <li class=""><a href="#">Logout</a></li>
    </ul>
</div>

person Macness    schedule 06.03.2013    source источник


Ответы (1)


КолдФьюжн 9:

<cfset class = ListLast(cgi.Script_Name, '/') EQ "main.cfm" ? "active" : "">
<li class="#class#"><a href="main.cfm">Main</a></li>

ColdFusion 8 или ниже, используйте старый добрый <cfif>

<cfset class = "">
<cfif ListLast(cgi.Script_Name, '/') EQ "main.cfm">
   <cfset class = "active">
</cfif>
<li class="#class#"><a href="main.cfm">Main</a></li>

ОБНОВЛЕНИЕ: ИЛИ, как предложил KRC ​​в комментарии (ColdFusion 8 или ниже):

<li IIF(ListLast(cgi.Script_Name, '/') EQ "main.cfm", DE('class="active"'), '')>
  <a href="main.cfm">Main</a>
</li>
person Henry    schedule 06.03.2013
comment
Вместо того, чтобы жестко кодировать Right( cgi.Script_Name, 8 ), вам лучше использовать ListLast( cgi.Script_Name, '/' ) - person Busches; 07.03.2013
comment
О, GetFileFromPath() тоже работает. Это примерно то же самое с точки зрения читабельности. - person Henry; 07.03.2013
comment
iif работает и здесь. ‹li#iif(ListLast(cgi.Script_Name, '/') EQ main.cfm,DE('class=active'),DE(''))#›Main‹/li› - person K_Cruz; 07.03.2013
comment
@KRC да, это так же хорошо, как вы можете написать это перед тернарным оператором CF9. Однако я бы настоятельно рекомендовал не использовать его, потому что все, что находится в DE(), будет оцениваться Evaluate(). - person Henry; 08.03.2013
comment
@ Генри, я не согласен с твоим предложением не использовать его здесь. Тег называется встроенным, если; Я чувствую, что такого рода проблемы являются отличным примером того, где именно их следует использовать. Я бы использовал троицу, если бы мне нужно было несколько раз контролировать вывод одного и того же значения на одной и той же странице. Если у него есть причина установить этот класс CSS более одного раза на странице, я бы предпочел ваше решение больше. Влияние на производительность использования Evaluate по сравнению с троичным здесь, IMO, не стоит усилий для дополнительной строки кода. В любом случае, любой ответ решает проблему. :) - person K_Cruz; 08.03.2013
comment
@KRC class="#ListLast(cgi.Script_Name, '/') EQ 'main.cfm' ? 'active' : ''#" оператор тернарного оператора может быть однострочным, и, по-моему, он превосходит iff() и de() по удобочитаемости и производительности. :) - person Henry; 08.03.2013
comment
@KRC добавил ваше предложение к ответу, если вы не возражаете. :) - person Henry; 08.03.2013
comment
@ Генри - Вовсе нет. Я даже не думал об использовании троичного встроенного кода, хотя это должно было быть очевидным, и это определенно более читабельно, чем iif. - person K_Cruz; 09.03.2013