【问题标题】:binding events to ajax loaded content with jquery使用 jquery 将事件绑定到 ajax 加载的内容
【发布时间】:2012-03-24 23:25:43
【问题描述】:

我有一些加载了 ajax 的选项卡。我通过 HTML 获取内容并将其插入到页面中。棘手的部分是当我使用 ajax 加载新内容时,我需要监听新内容的其他事件并对新内容执行其他任务。 这是我的对象:

var Course = {   

    config: {
        page: 'description'
    }

    init: function() {
        $('a.show-details').on('click', this.loadCourse);
    },

    loadCourse: function() {
        var courseId = $(this).parent().data('course_id'),
            item_content = $(this).parents('div.item').children(),
            path = 'main/ajaxjson/load_course_details';

        if ($(this).parents('h1.more').hasClass('current')) {
            $(this).parents('h1.more').removeClass('current');
        } else {
            $(this).parents('h1.more').addClass('current');
        }
        $(item_content[2]).slideToggle();
        Course.doAjax(courseId, path);
    },


    doAjax: function(courseId, path) {
        $.ajax({
            type: 'POST',
            url: ROOT_PATH + path,
            data: {page : Course.config.page, course_id: courseId},
            success: function(result){
                $('#ajax-content-' + courseId).hide();
                $('#ajax-content-' + courseId).empty().append(result);
                $('#ajax-content-' + courseId).show(); 

                // bind events here? call other methods like Couse.methodName()?
            }
        });
    }
}`

我没有提供标记,所以让我解释一下逻辑。我初始化了课程对象,当我点击它时我有一个链接,我触发了一个 ajax 请求来获取课程并滑动切换课程内容。现在我返回加载的 html 内容。在 html 中,我将有按钮和其他项目。我创建了一个新方法 bindEvents 并在那里绑定事件?我需要为每个 ajax 调用重新绑定吗?

【问题讨论】:

标签: jquery


【解决方案1】:

您需要将事件侦听器添加到未动态添加的 DOM 树更上方的元素。可以使用 jQuery 的 live() 将其添加到正文中,但最好使用delegate

因此,例如,如果您的 .show-details 链接位于 #main 元素内,那么 AJAX 请求不会加载该链接,您可以像这样绑定事件:

$('#main').delegate('.show-details', 'click', this.loadCourse);

编辑:如果您使用的是 jQuery 1.7+,您应该使用:

$('#main').on('click', '.show-details', this.loadCourse);

【讨论】:

  • delegate 只是对 on 事件的引用
  • 在 jQuery 1.7+ 中是的。我一定误解了你的问题。按照您描述的方式,我认为您想将事件绑定到当时可能不存在于 DOM 中但稍后会添加的元素。请更清楚地说明您的目标。
  • 我想将事件绑定到不在 DOM 中并在 AJAX 请求后加载的元素
  • 这就是我上面解释过的,如果你使用的是 jQuery 1.7+,你会使用 $('#main').on('click', '.show-details', this .loadCourse);反而。完成此操作后,与选择器匹配的所有未来元素都将获取事件(这依赖于像 #main 这样的静态元素,而不是 DOM 更改的一部分)
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 2018-10-14
  • 2023-04-04
  • 2013-05-11
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多