为什么anchor href显示片段的完整路径?

时间:2016-12-07 05:51:51

标签: javascript html fragment anchor

我的锚标签href只包含一个片段。我分配了一个点击处理程序。当我点击链接时,处理程序完成后,页面会加载更高级别的页面。

以下是事实:

  1. 页面位于http://domain.com/app/path_component
  2. 该页面定义了<base href="http://domain.com/app/">
  3. 页面包含:<a href="#fragment"> ... </a>
  4. jQuery设置了一个点击处理程序:$('a').on('click', handler)
  5. .htaccess将服务器处理指向服务器上的PHP应用程序... /app
  6. 我没有返回false,也没有调用e.stopPropagation()或e.preventDefault(),所以我理解浏览器会执行默认操作并处理href。我不明白为什么它加载另一页?

    在追踪我的处理程序时,我看到this.href是“http://domain.com/app/#fragment”。这可以解释为什么父页面正在加载,但我不明白为什么它是那个页面而不是http://domain.com/app/path_component#fragment“?

    我能看到原始href的唯一方法是直接检查href属性。我希望允许页面加载,如果它是必要的,但当它只是一个片段时阻止它,所以我写了处理程序返回为:

    return $(this).attr('href')[0] != '#';
    

    为什么这有必要?我认为片段的默认处理不是回到服务器。

1 个答案:

答案 0 :(得分:2)

浏览器通过将短链接与基本标记中指定的链接连接来处理短链接,因此如果您分配了<select name="city" id="cities" class="selectbox"> <?php foreach ($citylist as $city) { echo "<option value='$city'>$city</option>"; } ?> </select> 所有短链接,则相对来源(即<base href="http://something.com/">)将相对于{{1}进行处理}}。 <img src="...">主要用于使您的网页易于移植到其他网站。

因此,作为解决方案,您需要相对于base分配锚路径:

base

另一种方式是基于js的锚:

<base>

其中一个解决方案是在页面开头使用javascript生成基本节点,并将其作为子项附加到<a href="path_component#fragment">

<a href="javascript:;" onclick="document.location.hash='fragment';">fragment</a>

它应该可以工作,但正如我上面提到的,如果您使用图像源的相对路径,则应该使用<head>(即<script> var currPage = window.location.href; if (document.getElementsByTagName("base").length === 0) { var base = document.createElement("base"); base.setAttribute("href", currPage); document.getElementsByTagName('head')[0].appendChild(base); } else { document.getElementsByTagName("base")[0].setAttribute("href", currPage); } </script> )开始链接,以获取基于父页面的绝对路径。