【问题标题】:How to make links in ajax loaded page load other pages?如何使ajax加载页面中的链接加载其他页面?
【发布时间】:2012-07-05 22:49:46
【问题描述】:

问题:动态加载页面中的链接没有动态加载其他页面。

在我的索引页面上,我有如下链接:

<li><a class="page_one" title="page_one" href="page_one.html">Page One</a></li>
<li><a class="page_two" title="page_two" href="page_two.html">Page Two</a></li>

这些使用脚本dynamicpage.js(如下)将&lt;div id="guts"&gt;中的内容从外部页面动态加载到索引页面上具有相同ID的div中,除非javascript关闭,否则它将简单地加载外部页面一般。

这里是javascript:

    $(function() {

    var newHash      = "",
        $mainContent = $("#main-content"),
        $pageWrap    = $("#page-wrap"),
        $el;



    $(".dyn").delegate("a", "click", function() {
        window.location.hash = $(this).attr("href");
        return false;
    });

    $(window).bind('hashchange', function(){

        newHash = window.location.hash.substring(1);

        if (newHash) {
            $mainContent
                .find("#guts")
                .fadeOut(200, function() {
                    $mainContent.hide().load(newHash + " #guts", function() {
                        $mainContent.fadeIn(200, function() {
                            $pageWrap.animate({

                            });
                        });
                        $(".dyn a").removeClass("current");
                        $(".dyn a[href="+newHash+"]").addClass("current");
                    });
                });
        };

    });

    $(window).trigger('hashchange');

});

索引页面上的链接运行良好,但例如,如果我想从动态加载的 page_1.html 链接到 page_2.html,page_2 正在正常加载,而不是将 url 更新为 /#page_2.html

我尝试将 .delegate 更改为 .live,但这完全停止了它的工作。

谁能把我推向正确的方向?

提前致谢!

【问题讨论】:

  • 试过$(document).delegate(".dyn a").... ?
  • $(document).delegate(".dyn a", "click", function() { 似乎成功了!谢谢楼主!

标签: javascript jquery ajax dynamic


【解决方案1】:

试试这个:

$("#main-content").delegate(".dyn a", "click", function() {
    window.location.hash = $(this).attr("href");
    return false;
});

原因如下:你的功能

$(".dyn").delegate("a", "click", function() {
    window.location.hash = $(this).attr("href");
    return false;
});

在匹配的.dyn 元素中正确绑定click 处理程序退出和新&lt;a&gt; 元素。因此,如果您要向.dyn 元素添加新的&lt;a&gt; 标记,脚本将按预期工作。

但是,$mainContent.hide().load(... 方法将 $("#mai-content") 的内容替换为新加载的内容,这意味着您已经替换了原始的 $(".dyn"),因此委托函数现在正在监视已删除的 .dyn

将您的委托匹配移动到$("#main-content"),您将保持一个活动的“实时”或“委托”观察程序,它将正确地将您定义的点击处理程序绑定到新的.dyn a 元素。

【讨论】:

  • 感谢@potench 的解释,您所说的确实有道理,但我已经尝试实施它,它实际上停止了它的工作。您在上面的评论中的建议效果很好,但这不是好的做法吗?
  • 哦,嗯。我想我根据上面的 javascript 推断了很多关于你的 HTML 结构的信息。抱歉,如果那不起作用。 $(document).delegate 比隔离到较小的选择更昂贵的性能。但是,它很可能不会引起注意。
  • 嘿,非常感谢您的帮助,potench。如果您有兴趣查看 html 代码并可能建议一种更有效的方法 - 我已经上传了一个演示 here:
  • 嘿@AshBestos,我访问了您的网站并使用控制台添加了$("#main-content").delegate(".dyn a", "click", function (e) { console.log("1"); e.preventDefault(); });,并通过单击不同的选项卡进行了测试,因此$("#main-content").delegate.... 应该适合您并且效率会稍微提高一点
  • 很抱歉利用你的专业知识@potench(你是我的新英雄),但我认为我需要做类似的事情来使用 ajax 加载页面上的播放按钮来动态更新播放器在索引页面上,但我很难确定它,我觉得你可能知道答案!见this帖子...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多