使用新网址

时间:2015-08-31 07:53:42

标签: html ajax pyramid chameleon

起初我想说,我是网络开发的新手,缺少一些具体的科学术语。

我在后端使用金字塔,在前端使用变色龙。现在我有一个主页面,我发送了一些ajax请求。收到响应后,我有一个DOM操作回调。 浏览器不保存AFAIK dom操作,因此用户无法点击后退按钮。但是这个机制是如何调用的 - 或者我如何获得ajax响应和一个独特的URL?网址可以是当前的一个+ params或paras的sha1。

我是否需要在服务器端实现特定的处理程序,或者这可以由客户端完成吗?

在google的帮助下我才能发现,我无法在浏览器中保留dom操作的状态。因此,每个请求都需要一个唯一的网址 - >因此我认为这必须在服务器端完成,但正如所说,我是新的。

谢谢:)

编辑: 该网站 - 我正在编程 - 可以想象为'谁想成为百万富翁'。我们有几轮,在每一轮中,用户可以在几个答案之间进行选择,其中每一轮都取决于最后一轮。 很难为此添加代码,因为它是我博士学位的一部分而且非常庞大:\

1 个答案:

答案 0 :(得分:2)

(首先,Chameleon没有运行&#34;在前端&#34; - 它是一个Python模板库,它接受一个字符串(您的模板)和一个python dict(模板参数)作为输入并返回另一个字符串作为其输出。当发送到客户端时,浏览器将该输出解释为HTML页面,可能带有嵌入的<script>标签。然后,这些标签中的JavaScript由浏览器执行 - &#39;什么在客户端上运行。)

现在,关于你的问题:)你可以从JavaScript更改浏览器地址字符串中显示的URL,这将在浏览器的历史记录中插入一个新条目。您还需要以某种方式确保您的应用程序可以根据新URL中的信息恢复其状态,否则如果有人为URL添加书签,在新选项卡中打开它或只是重新加载应用程序,则会中断。

一种历史较早的操纵浏览器历史记录的方法是通过window.location.hash修改网址的哈希部分。这是一个最小的例子:

<html>

<body>
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>

    <input id="name-input" type="text" />

    <script>
        // restore the "application state" on page load -
        // if there's a hash in the url we set the text in the input
        if (window.location.hash) {
            $('#name-input').val(window.location.hash.substring(1));
        }

        // whenever the hash changes (user clicked the Back button)
        // we also need to modify the application state
        $(window).on('hashchange', function () {
            $('#name-input').val(window.location.hash.substring(1));
        });             

        // type some text in the input and press Enter. 
        // Observe the URL changing. Try using the Back button.
        $('#name-input').on('change', function () {
            window.location.hash = $(this).val();
        });
    </script>
</body>

</html>

修改历史记录的另一种更现代的方法是通过history.pushState(),它更强大,但可能需要一些服务器端支持(您的服务器需要能够从新URL提供正确的页面)您的应用已转换为 - 如果您的网址看起来像mysite.com/page1mysite.com/page2,并且您使用pushState/page1过渡到/page2 - 服务器需要能够处理这两个网址。)

您还需要注意,有一整套客户端框架专门用于处理这种情况(检索JSON数据,呈现页面,修改URL),所以也许你&#39 ;发现使用客户端框架而不是手动操作简化了事情。我首先要看Backbone.js,因为它非常小,并且不要求你用'而且只有真正的方式'来做事情。像其他一些框架一样。