2011-10-26 136 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"