2011-10-26 69 views
0

所以我試圖放在一起的導航欄,我一直在使用PHP,因爲我不熟悉Javascript。我想創建一個函數,它將返回當前頁面的文件名,然後適當地應用css類。這個PHP函數的Javascript等效

PHP代碼

function setNav($section) 
{ 
    $curSection = end(explode('/', $_SERVER['SCRIPT_NAME'])); 
    if ($section == $curSection) 
    { 
     echo ' class="active" '; 
    } 
} 

然後,我只想初始化它在html如下

<a href="abc.def" <?php setNav('index.php'); ?> >Home </a> 

出於顯而易見的原因,我寧願做在JavaScript或jQuery的,但我在彙總功能方面有些麻煩。我已經看了幾個教程,但是他們忽略了一些東西。

  1. 如何只拉文件名的最後部分。我見過一對夫婦的想法做這樣的事情:

    <script type="text/javascript"> 
        var url = document.location.href; 
        url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); 
        url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); 
        url = url.substring(url.lastIndexOf("/") + 1, url.length); 
        alert(url); 
    </script> 
    

    但後來我遇到問題2.我也瞭解子的作品,但我不知道他在做什麼瓦特/例如第二個參數「(網址.indexOf(「#」)== -1)? url.length:url.indexOf(「#」)'我搜索谷歌,w3schools和一些地方的解釋,也研究了substring()的高級用法,並沒有出現。任何指導表示讚賞。

  2. 如果說文件是索引,url看起來像localhost/abc_corp /這樣做一個document.URL調用帶來了「本地主機/ abc_corp /」和離開了index.php部分。

任何幫助提前感謝。

+5

*「由於顯而易見的原因,我寧願做在JavaScript或jQuery的」 *其實不是很明顯。如果這是一個靜態特性(即該屬性是在請求頁面時設置的並且不會改變),並且您已經在頁面上使用PHP,則應該將其保留在PHP中。這種方式適用於所有用戶,即使是關閉了JavaScript的用戶,您也不必擔心跨瀏覽器的兼容性(除了CSS)。 –

+0

我對泛化術語表示歉意,我的意思是說,無負載交互通常比沒有的交互更好。 – Brodie

回答

0

如果您有一個可行的PHP解決方案,我不確定爲什麼要將其轉換爲JavaScript。無論如何,PHP是一個更好的地方。

總之,要解釋一下你的JS是幹什麼的,如果你有這樣的URL:

http://www.somedomain.com/somepage.php someparam = 234#123123

會後扔掉任何東西「 ?」和/或「#」,以及最後一個「/」之前的任何內容,從而保持我放入粗體的位​​。

如果您的網址不包含任何「/」字符,例如您只有「www.somedomain.com」,那麼它將返回整個字符串,它不能爲您創建文件名。

工作原理:首先請注意,如果aSring不包含param,則aString.indexOf(param)返回-1,否則返回第一個實例的索引。因此substring的第二個參數被設置爲兩個值之一,具體取決於indexOf的發現。以下內容:

var url = document.location.href; 
url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); 

開始有完整的URL,然後它會檢查是否有「#」字符 - 如果沒有,則substring(通過對url.length 0)主罰整個字符串,否則取串起來但不包括「#」。然後:

url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); 

相同的想法,但與「?」。如果沒有人保留整個字符串,否則保留所有內容,但不包括「?」。然後:

url = url.substring(url.lastIndexOf("/") + 1, url.length); 

從字符「/」(其將是第一個字符(「-1 + 1」),如果是沒有的)通過對字符串的末尾的最後一個之後進行的一切。

+0

我認爲在javascript中執行它的唯一原因是減少我的結構中的代碼量。我想我認爲在js中編寫函數會比編寫文檔中的所有php標籤更好,我認爲如果使用javascript完成,它可能看起來更乾淨。 – Brodie

0

解決問題2只是如果字符串中的最後一個字符是/並且如果是這樣附加僞造文件名。

但我同意約旦 - 這並不明顯,爲什麼你會這樣做。在PHP中做這件事是正確的。

0

2.如果URL中沒有文件名,javascript將不知道任何關於做出響應的文件的名稱。當localhost/abc_corp /將導致對index.php的調用時,這是由服務器設置強制的服務器端重定向,例如, Apache的DirectoryIndex

0
var url = document.location.href; 
url = url.substring(0, (url.indexOf("#") == -1) ? url.length : url.indexOf("#")); 
url = url.substring(0, (url.indexOf("?") == -1) ? url.length : url.indexOf("?")); 
url = url.substring(url.lastIndexOf("/") + 1, url.length); 
alert(url); 

所以第 URL = url.substring(0,(url.indexOf( 「#」)== - 1)url.length:url.indexOf( 「#」)); 正在檢查是否有磅符號,如果存在,它會從0到磅符號的位置的子字符串,如果沒有磅它只是從0到整個長度(即什麼都不做)

第二個與問號做同樣的事情。

問題二我只能通過解析特殊情況來解決問題。

+0

沒有重新發明'document.location.pathname' - 這可以是一個單行:'document.location.pathname.replace(/.*//,'')' – Stoive

0

var scriptName = location.href.substring((location.protocol.length + location.hostname.length + 3))。split('?');

0
var schema = document.location.href.substring(0, document.location.href.lastIndexOf(document.domain + '/')); 
var scriptName = document.location.href.replace(schema + document.domain, ''); 

在Chrome檢查測試針對此同一頁:

// document.location.href = "https://stackoverflow.com/questions/7909686/the-javascript-equivalent-of-this-php-function" 

schema = "https://" 
document.domain = "stackoverflow.com" 
scriptName = "https://stackoverflow.com/questions/7909686/the-javascript-equivalent-of-this-php-function"