如何使用新的URL刷新部分内容?

5
我希望页面中某些部分保持不变(如页头、页脚),只有主要内容改变。同时,根据新内容,URL 也应更改。
我知道 AJAX/iframes 的所有内容,但我不想使用它们,因为 URL 保持不变。
请查看 123contactform.com。尝试玩弄左侧菜单,注意主要内容的更改以及 URL 的更改(页头、菜单、页脚保持不变)。
如何实现这一点?
谢谢。

Tom Dale 刚在 CaskadiaJS 上做了一个关于 URL 的精彩演讲。我相信你可以使用 route-recognizer 和他帮助开发的对应的 router.js 来实现你想要的功能。 - Zach Saucier
这个答案对你有帮助吗?此外,你可能会对使用Backbone框架感兴趣,因为它可以轻松处理这种情况。 - Paul Richter
1
正如许多人在下面指出的那样,你所提到的网站并不仅仅是更新其内容,它只是看起来像这样。使用部分加载更改URL仅限于此答案。从安全角度考虑您正在请求什么:如果我可以在浏览器的地址栏中显示任何我喜欢的URL而实际上并不在该资源上,我可以利用这一点使人们相信他们正在某个地方,而实际上并非如此,从而滥用这一点。 - IvanL
这是一个合理的问题。提供的示例与请求不同。Facebook做得最好。 - Eric
11个回答

7
实际上,你提供的网页并不仅仅是刷新其内容。看起来可能是那样的,但你可以看到头部仍然在闪烁、刷新(当你点击链接时它也会改变)。
实际上有一个全新的页面,但他们使用模板来创建内容。
一个页面是一个调用网页的不同部分(如页脚、页眉和内容)的模板网站。其中内容可以根据给定的输入仅有其他内容。
这只需要使用 PHP 就可以完成。 Template.php
include "header.php";

include $contentpage;

include "footer.php";

您需要提供不同的内容文件名以便加载。

Header.php

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Page title</title>
</head>
<body>
BLALBLA CONTENT

content.php

echo $content;

footer.php

</body>
</html>

这将创建一个包含动态内容和静态页眉和页脚的页面(您还可以添加静态脚本)。
这只是关于如何实现此目标的基本想法。
静态内容(页眉和页脚)也可以被缓存以加快加载速度。
另外,当您在选项卡中打开链接时,您会看到每个链接都包含页眉。例如,与 iFrame 一样,链接中仅显示动态内容。

嗨,我一直在使用相同的技术来创建CMS,并一直在思考用户提出的同样的问题,即电子商务网站的标题和筛选器固定,尽管页面重新加载。现在我感觉你是对的,我使用过期头用于缓存机制,但有时需要刷新页面才能更新。我该如何改变这种行为并在更新后更新内容(我认为重置缓存之类的东西)? - NaveenThally
@NaveenThally 当你添加了静态内容后,你可以直接删除缓存。让服务器生成新的缓存,这样就没问题了。这个方法只需要执行一次,之后所有用户都会加载缓存文件。希望这能帮到你! - nkmol

3
你可以使用pushState和ajax来实现这一点。看一下pjax

1
有很多方法可以做到这一点。 使用jQuery,您可以使用$.load。
$( "#result" ).load( "ajax/test.html", function() {
    alert( "Load was performed." );
});

如果您的数据更加复杂,您可以使用$.ajax
    $.ajax({
        type: 'GET',
        url: "http://www.somewhere.com/json",
        data:bcData,
        error: function(jqXHR, textStatus, errorThrown){
            console.log(jqXHR);
            console.log(textStatus);
            console.log(errorThrown);
        },
        success: function(data){
            var ul = $("<ul/>:);
            for (var i=0;i < data.items.length;i++){
                var li = $("<li/>",{"html":data[i].html});
                ul.append(li);
            }
            $("#someConainer").append(ul);

        }
    });

如果您的应用程序很复杂,我建议使用框架。
我喜欢 http://angularjs.org/ ,但还有许多其他选择。

1
你可以使用jQuery load函数来实现这一点。

2
但这不会改变URL - 到新地址。 - CristiC

1
我使用 Firefox 和 Firebug 测试了指定的网站。在 Firebug 中,我们可以通过 Net -> Images 查看特定网页中所有已下载的图片。
每当我点击左侧菜单时,它都没有从服务器下载所有图片。例如,在浏览不同的网页时,顶部左侧的“123 Contact Form image”和可爱的“Sign Up Goat image”都没有从服务器下载。
但是,当我按下 Ctrl + F5 时,所有图片都会从服务器上下载。我认为他们使用了缓存机制来实现这个功能。
当我谷歌搜索时,我发现 Zend 框架提供了专门用于缓存网页数据的 API,您可以在以下链接中找到更多信息: http://framework.zend.com/manual/1.12/en/zend.cache.html Cache only part of a page in PHP 根据我的测试,我可以得出结论,这个功能是通过使用缓存机制来实现的。

0
在你指出的网站中,他们实际上刷新了整个页面(你可以通过Fiddler或其他网络流量监控工具验证这一点)。
至于你的问题,你可以简单地使用ajax,并在回调函数中包含你想要设置的URL,然后你可以像这样手动设置它:javascript
window.history.replaceState(null, <name to appear in history>, <url>);

了解有关操作历史记录的更多信息在此处


0

尝试像这样做

头部、页脚和导航栏是固定的,只有内容会像这样不断变化。

header.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">

        //css goes here

        <script  src="jquery.js"></script>
        ...
    </head>
    <body>
        <div style="float:left;width:40%;">
            <?php include 'left_nav.php';?>
        </div>
        <div style="float:right;width:60%;">

footer.php

        </div>
    </body>
</html>

left_nav.php

  <ul>
    <li><a href="sample1.php">A</a></li>
    <li><a href="sample2.php">B</a></li>
  </ul>

sample1.php

<?php include 'header.php';?>
    First page  Content A
<?php include 'footer.php';?>

sample2.php

<?php include 'header.php';?>
    Second page  Content B
<?php include 'footer.php';?>

0

你提供的例子很简单:

每个左侧菜单都是一个锚点,指向一个新的htm文件,因此URL会改变。例如:

<div id="left" class="leftmenu">
                    <div class="menuitem"></div>

                    <div id="tour_tab_1" class="menuitem active" onclick="tour_show_tab(1);"><a href="/tour.html"><span class="sprite-left-menu sprite-left-menu-edit"></span>Build web forms</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>  

                    <div id="tour_tab_2" class="menuitem " onclick="tour_show_tab(2);"><a href="/styling-forms.htm"><span class="sprite-left-menu sprite-left-menu-themes"></span>Add branding</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>      

                    <div id="tour_tab_3" class="menuitem " onclick="tour_show_tab(3);"><a href="/mobile-web-forms.htm"><span class="sprite-left-menu sprite-left-menu-code"></span>Publish anywhere</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>

                    <div id="tour_tab_4" class="menuitem " onclick="tour_show_tab(4);"><a href="/form-to-email-submissions.htm"><span class="sprite-left-menu sprite-left-menu-notif"></span>Get notifications</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>

                    <div id="tour_tab_5" class="menuitem " onclick="tour_show_tab(5);"><a href="/online-database-forms.htm"><span class="sprite-left-menu sprite-left-menu-submissions"></span>Manage data</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>  
                    <div class="menuitem separator"></div>

                    <div id="tour_tab_6" class="menuitem " onclick="tour_show_tab(8);"><a href="/apps-integrations.htm"><span class="sprite-left-menu sprite-left-menu-apps"></span>Add 3<sup>rd</sup> party apps</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>                      

                    <div id="tour_tab_7" class="menuitem " onclick="tour_show_tab(7);"><a href="/purchase-order-forms.htm"><span class="sprite-left-menu sprite-left-menu-payments"></span>Accept payments</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>

                    <div id="tour_tab_8" class="menuitem " onclick="tour_show_tab(6);"><a href="/conditional-logic-forms.htm"><span class="sprite-left-menu sprite-left-menu-rules"></span>Branch forms</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>     
                    <div class="menuitem separator"></div>

                    <div id="tour_tab_9" class="menuitem " onclick="tour_show_tab(10);"><a href="/translate-forms.htm"><span class="sprite-left-menu sprite-left-menu-translations"></span>Go multilingual</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>
                    <div class="menuitem separator"></div>                      

                    <div id="tour_tab_10" class="menuitem " onclick="tour_show_tab(9);"><a href="/sub-users.htm"><span class="sprite-left-menu sprite-left-menu-users-pink"></span>Create subusers</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div>  
                    <div class="menuitem separator"></div>

                    <div id="tour_tab_11" class="menuitem " onclick="tour_show_tab(11);"><a href="/captcha-form-validation.htm"><span class="sprite-left-menu sprite-left-menu-security"></span>Stay secure</a><img class="active_menu_arrow" src="http://dflzqrzibliy5.cloudfront.net/images3/left_menu_active_arrow.gif"></img></div> 
                    <div class="menuitem separator"></div>

                </div>

每个链接的页面都会包含共同的文件,如页眉、左侧菜单和页脚。点击的菜单将被激活。
希望这有所帮助! :)

是的,它们都有不同的链接。但是他希望这个链接只改变页面右侧的内容。而不是改变整个页面本身。 - Andrew Ice

0

你提供给我们的网页只是一个普通的网站。正如你所注意到的,左侧栏中的链接会带你到另一个页面。主要内容在包装器中,但头部、页脚和其他所有内容都是相同的(大多数情况下)。这可以通过动态创建内容(使用PHP或其他Web开发语言)来实现。基本上,你有一个包含更多块或页面的大页面。其中之一是主列,它根据你提供的链接创建其内容。此外,你可以使用.htaccess文件创建重定向,以使你的链接格式更好。nkmol的答案基本上回答了你的问题。

尝试研究Web开发框架,因为它们可以更好地解释你的问题。

看看这个: http://en.wikipedia.org/wiki/Web_template_system


0

所以问题是你想加载这个内容,但又不想刷新页面。

你不想使用Ajax(老实说这可能是你应该做的最好方式)。 而且你也不想重新加载页面。

如果你正在使用MVC来构建这个项目,那么建议的方法是按照上面的答案去做。添加PHP包含文件以保留页眉和页脚。

但是如果你真的坚持不使用任何一种方法。

你可以将所有内容都放在同一页上,并从一开始就隐藏它们。然后使用左侧菜单项,在基于你的选择的情况下,使用JavaScript显示或隐藏右侧内容。

这是你在没有MVC、AJAX或页面重新加载的情况下完成任务的唯一方法。
强烈不推荐。但是,可以完成工作...


如果您不想移动所有内容,可以添加包含iframe的div,以显示您拥有的链接内容。然后在菜单选择时隐藏/显示它们。 - Andrew Ice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接