【问题标题】:Ajax rendered button is not firing click eventAjax 呈现的按钮未触发单击事件
【发布时间】:2014-05-29 12:27:52
【问题描述】:

我有一个 Django 模板,其中列出了我们培训部门的预定课程。对于列表中的每个项目,都有一个花名册按钮,单击该按钮可拉出班级的班级花名册并将其放入 div 中。这很好用。在此页面上还有一个 Javascript 日期控件,允许用户选择上课日期并仅查看当天举行的课程。但是,当从 Ajax 生成类列表时,Roster 按钮单击事件不会触发。

classes.html

<h1>Upcoming Classes</h1>
Class Date: <input type='text' id='datepicker' name='date'/>
<div id='class_listing'>
<ul id='class_list'>
{% if classes %}
{% for c in classes %}
<li>
    <div class='class_info'>
        <ul class='class_list_item'>
            <li>
                <h4>
                    <a href="{% url 'training:class_detail' c.id %}">
                        {{ c.course.course_name }}
                    </a>
                </h4>
            </li>
            <li>
                <h6>
                    Start Date: {{ c.get_start_date }}
                </h6>
            </li>
            <li>
                <h5>{{ c.location }}</h5>
            </li>
            <li>
                <button class='list_button' value='{{ c.id }}'>Roster</button>
            </li>
        </ul>
 <div class='roster'></div>
<div class='button_menu'><button>Test</button></div>
</div>
</li>
{% endfor %}
</ul>
{% else %}
<p>No classes available</p>
{% endif %}
</div>

这行得通。但是,当我处理所选日期并为该日期生成课程列表时,名册按钮不起作用。

我的看法:

def getclasslisting(request):
    if request.method == 'GET':
        date = request.GET['date']
        month, day, year = date.split('/')
        formatted_date = year + '-' + month + '-' + day
        schedule = Schedule.objects.filter(class_date=formatted_date)
        if not schedule:
            html = '<h4>No classes scheduled on ' + formatted_date + '</h4>'
        else:
            html = "<ul id='class_list'>"
            for s in schedule: 
                html += "<li><div class='class_info'><ul class='class_list_item'>"

                html += "<li><h4><a href='#'>" + s.scheduled_class.course.course_name + "</a></h4></li>"

                html += "<li><h6>Start Date: " + s.scheduled_class.get_start_date() + "</h6></li>"

                html += "<li><h5>" + s.scheduled_class.location.name + "</h5></li>"

                html += "<li><button class='list_button' value='" + str(s.scheduled_class.id) + "'>Roster</button></li></ul>"

                html += "<div class='roster'></div><div class='button_menu'></div></div></li></ul>"

    else:
        pass
    return HttpResponse(html)

最后是javascript:

$( document ).ready(function() {
$('#toggle').click(buildMenu);
$('.list_button').click(getRoster);
$("#datepicker").datepicker({
    onSelect: function(dateText) {
        var date = $('#datepicker').datepicker({ dateFormat: 'yy-mm-dd' }).val();
        $.get('/training/getclasslisting', {date:date}, function(data){
            $('#class_listing').empty();
            $('#class_listing').append(data);
        });
        //alert("Selected date: " + dateText + "; input's current value: " + date);
    }
});
})

function getRoster() {
var roster = $(this).closest("ul").next();
var id = parseInt(this.value);
$.get('/training/getroster', { id:id}, function(data){
    if (roster.is(':empty')) {
        roster.append(data);
    } else {   
        roster.empty();
    }
    alert("Clicked!");
});
}

我最初认为这是 HTML 页面的 DOM 不同,它可以工作,而 javascript 不能工作,但我已经检查过了。此外,我在 javascript 中添加了 alert 语句,以查看函数是否被调用,而事实并非如此。有任何想法吗?我已经接受了这样一个事实,即这是我的一个愚蠢的疏忽。

【问题讨论】:

  • 在你的 JavaScript 中使用 .on() 而不是 .click()see here
  • 刚试了,没用。我需要使用匿名函数吗?不这么认为,但 javascript/jquery 并不是我真正的东西。它仍然可以在模板中使用,所以我将使用on
  • 可能不相关,但请不要在视图中构建 HTML。您很高兴在其他地方使用模板,是什么让您认为在 Python 中为该视图执行此操作是个好主意?
  • 我不会以这种方式将它投入生产,这只是我构建 Ajax 的一种快速方法。这对某些人来说可能看起来很复杂,但因为我的 javascript 技能有些欠缺,所以我想先把 Ajax 弄好。等好了,放心,我会改变看法的。

标签: javascript python ajax django dom


【解决方案1】:

试试:

$('body').on('click', '.list_button', function(){
....
});

但这是一个客户端问题。

【讨论】:

  • 像冠军一样工作。知道为什么不使用 $('.list_button').on("click", getRoster); 吗?
  • 因为当您使用 ajax 在页面中注入一些 HTML 时,您必须重新绑定事件。您可以在 ajax 函数的回调中执行此操作,或者更好地使用执行此操作的 on()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2013-01-17
  • 2012-03-14
  • 2011-12-02
  • 2013-10-14
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多