如何使用 JavaScript 历史记录 API

发布于 2024-11-08 19:00:29 字数 546 浏览 4 评论 0原文

在 github 的关于如何创建新树滑块的博客文章中,他们将其作为所使用的代码给出:

$('#slider a').click(function() {
  history.pushState({ path: this.path }, '', this.href)
  $.get(this.href, function(data) {
    $('#slider').slideTo(data)      
  })
  return false  
})

但是我不明白这是如何工作的?他们 AJAX 请求整个新页面,因此从 包含,然后貌似(使用名为“slideTo”的方法??)将此数据放入滑块元素中?当然,你最终会得到一个页面中的页面(可能有 CSS 故障)。

使用 AJAX 和 History API 时,如何仅获取已更改的特定部分?或者是html代码被替换了(但上面的例子不是这样的)?

github 实际使用的 javascript 在哪里?我是否正确,给出的示例不能是所使用的,因为它无法正常工作?

In github's blog post about how they created the new tree slider, they give this as the code used:

$('#slider a').click(function() {
  history.pushState({ path: this.path }, '', this.href)
  $.get(this.href, function(data) {
    $('#slider').slideTo(data)      
  })
  return false  
})

However I don't see how this works? They AJAX request the whole new page, so from <html> to </html> inclusive, then seemingly (using a method called 'slideTo'??) put this data into the slider element? Surely then you'd end up with a page within a page (likely with CSS glitches).

How when using AJAX and History API, do you get only the specific section that has changed? Or is it that the html code is replaced (but this is not the case in the above example)?

Where is the actual javascript github uses? And am I right that the example given can't be what is used as it won't work properly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你不是我要的菜∠ 2024-11-15 19:00:29

服务器端代码可以检查 X-Requested-With 标头,并确保它是 XMLHttpRequest (jQuery 默认设置此标头),并在请求时仅发送内部视图与XHR。

Firebug 示例

FireBug Example

如您所见,返回的 HTML 与没有请求时的 HTML 非常不同XHR。

PHP 代码示例

借助不言自明的函数。

$xhr = (isset($_SERVER['X-Requested-With')
    AND $_SERVER['X-Requested-With'] === 'XMLHttpRequest');

$view = View::factory('inner/something');

if ( ! $xhr) {
    $view = View::factory('template')
        ->set('innerView', $view);
}

echo $view;

The server side code could check the X-Requested-With header, and make sure it is XMLHttpRequest (jQuery sets this header by default) and send only the inner view if requested with XHR.

Firebug Example

FireBug Example

As you can see, the returned HTML is very different to what it would be had the request not been with XHR.

Example PHP Code

With a helping of self explanatory functions.

$xhr = (isset($_SERVER['X-Requested-With')
    AND $_SERVER['X-Requested-With'] === 'XMLHttpRequest');

$view = View::factory('inner/something');

if ( ! $xhr) {
    $view = View::factory('template')
        ->set('innerView', $view);
}

echo $view;
北方的巷 2024-11-15 19:00:29

首先,我假设您知道如何 pushState ()onpopstate 两者都有效。

您可以使用它来请求整个页面、提取其中的一部分并替换当前显示页面的适当部分。这样您就可以通过 URL 更改实现平滑过渡,但无需重新加载页面。

如何加载页面的部分内容?假设每个页面上都有这样的 HTML 结构:

<div id="contentContainer">
    <div id="content">
    ...
    </div>
</div>

如果您然后使用 eq 发出正确的请求。 jQuery .load(),那么它可能看起来像这样:

$('#contentContainer').load('index.php #content', function(){
    // some fancy animation here
});

它有什么作用?它将 index.php 页面的一部分(实际上是 id="content" 部分)加载到当前加载的页面(实际上是 id="contentContainer"< 部分) /code>),有效地仅更改 #contentContainer 部分,因为它将通过重新加载页面来加载。

如果您另外使用 pushState 更改 URL,则会在页面重新加载时达到效果。使用 onpopstate 事件,您可以允许来回浏览动态生成的页面。

够清楚了吗?

使用该功能,您还可以实现类似 Flash 的行为(平滑过渡)。

First of all, I assume you know how pushState() and onpopstate both work.

You can use it requesting whole page, extracting part of it and replacing proper part of the currently displayed page. That way you can make smooth transition with URL change, but without page reload.

How to load part of the page? Assume on every page there is such HTML structure:

<div id="contentContainer">
    <div id="content">
    ...
    </div>
</div>

If you then make a proper request using eq. jQuery .load(), then it may look like this:

$('#contentContainer').load('index.php #content', function(){
    // some fancy animation here
});

What it does? It loads part of index.php page (actually part with id="content") into currently loaded page (actually into part with id="contentContainer"), effectively changing only #contentContainer part as it would be loaded with reloading the page.

If you additionaly change URL with pushState, you will achieve effect as the page would be reloaded. Using onpopstate event, you can allow for coming back-and-forth through the dynamically generated pages.

Is it clear enough?

Using that feature you can achieve Flash-like behaviour also (smooth transitions).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文