【问题标题】:Need help understanding how to ajaxify a web site需要帮助了解如何对网站进行 ajaxify
【发布时间】:2012-09-18 22:48:13
【问题描述】:

我最近发现了有关如何使用 History.js、jQuery 和 ScrollTo 使用 HTML5 History API 对网站进行 Ajaxify 处理的要点:https://github.com/browserstate/ajaxify

我很难获得这个工作的简单版本,我不确定我是否理解所有内容。首先,我加载了 gist 中提供的所有脚本,然后设置了一个非常简单的导航和内容部分:

 <ul id="nav">
    <li id="home-link"><a href="/" title="Home">Home</a>/</li>
    <li id="work-link"><a href="/work" title="Work">Work</a>/</li>
    <li id="labs-link"><a href="/labs" title="Labs">Labs</a>/</li>
    <li id="blog-link"><a href="/blog" title="Blog">Blog</a>/</li>
    <li id="contact-link"><a href="/contact" title="Contact">Contact</a></li>
</ul>

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

接下来,我更改了选择器变量以匹配 html:

/* Application Specific Variables */
contentSelector = '#content',
$content = $(contentSelector),
contentNode = $content.get(0),
$menu = $('#nav'),
activeClass = 'active',
activeSelector = '.active',
menuChildrenSelector = 'li',

接下来我应该做的是我迷路的地方。我要做的就是加载特定于所选导航链接的 html 内容。因此,如果我单击“工作”,我想将一个 work.html 文件加载到内容部分并将 URL 更改为“mywebsite.com/work”。为了简单起见,让我们说 work.html 和所有其他 ajaxable 内容都位于同一目录中。

非常感谢任何帮助!干杯!

【问题讨论】:

    标签: javascript jquery ajax html


    【解决方案1】:

    所以这是一个真实的简单示例,说明我最终如何对我正在开发的网站进行 ajax 化,从而激发了这个问题。很抱歉耽搁了很长时间。首先是 HTML:

        <ul id="nav">
            <li id="home-link"><a href="home" class="ajaxify" title="Home">Home</a></li>
            <li id="work-link"><a href="work" class="ajaxify" title="Work">Work</a></li>
            <li id="labs-link"><a href="labs" class="ajaxify" title="Labs">Labs</a></li>
            <li id="blog-link"><a href="blog" class="ajaxify" title="Blog">Blog</a></li>
        </ul>
    
        <div id="content">Home Content</div>
    

    接下来是 Javascript:

     <script type="text/javascript">
    
        var directory = 'content/'; //directory of the content we want to ajax in
        var state = History.getState();
    
        //for when they click on an ajax link
        $('.ajaxify').on('click', function(e){
            var $this = $(this);
            var href = $this.attr('href'); // use the href value to determine what content to ajax in
            $.ajax({
                url: directory + href + '.html', // create the necessary path for our ajax request
                dataType: 'html',
                success: function(data) {
                    $('#content').html(data); // place our ajaxed content into our content area
                    History.pushState(null,href, href + '.html'); // change the url and add our ajax request to our history
                }
            });
            e.preventDefault(); // we don't want the anchor tag to perform its native function
        });
    
        //for when they hit the back button
        $(window).on('statechange', function(){
            state = History.getState(); // find out what we previously ajaxed in
            $.ajax({
                url: directory + state.title + '.html', //create our path
                dataType: 'html',
                success: function(data) {
                    $('#content').html(data);
                }
            });
        });
        </script>
    

    基本上我所做的只是拦截锚标记点击,使用“ajaxify”类来指示我想要加载哪些特定内容。一旦我拦截点击并确定要加载哪些内容,然后我使用 history.js pushSate () 来跟踪用户浏览网站的顺序并在不重新加载页面的情况下更改 url。如果他们决定点击后退按钮,statechange 监听器将加载正确的内容。如果他们决定点击刷新按钮,您将需要想出一种方法来使用不同的 url 名称复制索引页面。这在 php 中很容易做到,或者您可以根据需要复制、粘贴和重命名索引页。

    这是我在 Github 上发布的一个示例:https://github.com/eivers88/ajaxify-simple-demo

    提醒一下,在本地使用 ajax 时,最好在 MAMPWAMP 等个人 Web 服务器上运行您的项目。在没有服务器运行的情况下,此演示将在 chrome 中失败。但是,它应该可以在没有服务器的情况下在 Firefox 中运行。

    【讨论】:

    • 你介意评论每一行吗?多年来,我已经多次尝试实现这一点,但从未让它发挥作用——我当前的错误与 404 有关,基本上整个网站格式在单击链接时都会“中断”。我已经引用了jquery-scrollto.jsjquery.history.jsajaxify-html5.js 上的脚本源,如https://github.com/browserstate/ajaxify 所示,并在上面复制并粘贴了您的代码(我的内容区域是#main_content,我的文件在/includes 目录中)和将ajaxify 类添加到链接。我没有安装书签或 chrome 扩展。
    • 我最终得到了会加载空白页面的结果,但如果我查看源代码,我可以看到链接到页面的内容。所以现阶段无法实施。唯一的另一个异常是我使用的是 php,(即索引页上的页眉和页脚等)不确定这是否会影响结果。
    • @user1063287 我在 github 上发布了一个示例(请参阅答案更新),希望这会有所帮助。我建议在实现 php 之前先运行一个简单的静态 html 版本。
    • 我已经下载了 zip 文件并在 chrome(版本 28.0.1500.95 m)中打开了 index.html,单击菜单链接没有任何效果(没有以 ajax 样式或其他方式加载页面)。当我在 Firefox (23.0.1) 中打开 index.html 时,链接和功能确实有效。
    • 抱歉,也许我应该提到这一点,在使用 ajax 时,最好使用 MAMP 或 WAMP 等个人 Web 服务器运行您的项目。在 chrome 中,如果您的网站没有在 Web 服务器上运行,ajax 将根本无法工作。但是,如果您尝试使用 firefox 打开 index.html,它应该可以在没有运行的服务器上运行。
    【解决方案2】:

    鉴于这些要求,您需要做很多事情。这是您可以使用的功能:

    function doAjax(htmlpage){
    $.ajax({
        url:"/"+htmlpage, 
        type: 'GET',
        success: function(data){
            $('#content').html(data)
        }
    });
    }
    

    解决这个问题的最简单方法是将上面的标签调整为:

    <a href="#" onclick="doAjax('work.html');return false;"><img></a>
    

    然而,在顶部的脚本标记中使用 jquery 执行此操作会稍微更“正确”(尽管功能相同):

    $(function () {
        $('#buttonid1').click(function(){doAjax('work.html')});
        $('#buttonid2').click(function(){doAjax('about.html')});
        $('#buttonid3').click(function(){doAjax('contact.html')});
    });
    

    请注意,在这两种情况下,这些“work.html”页面不应该是完整的 html 文档,它们应该只是内容 div 中的内容。

    这个 ajax 不会改变访问者看到的 url。要使其正常工作,您必须使用html5 history api。它比我上面的 ajax 请求要复杂得多。所以如果你没有完全掌握我上面写的内容,它可能合适也可能不合适。

    【讨论】:

    • 谢谢Landon,我已经知道如何单独使用$.ajax。我真的很想使用上面链接的要点,因为它可以处理跨浏览器兼容性问题并优雅地降级。我了解掌握魔术背后的 API 的重要性,但在短期内,我希望建立一个使用此要点的简单网站。
    • 哦,好吧,祝你好运,仅供参考,发布指向您正在处理的页面的链接以显示您尝试过的内容总是有帮助的,这样人们就可以帮助找出问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多