【问题标题】:Jquery Dialog Event repeat triggeringJquery Dialog 事件重复触发
【发布时间】:2013-12-27 11:10:32
【问题描述】:

我正在 jquery 对话框中打开一个日历插件。

我一直面临的问题是,每当我关闭对话框并重新打开时,我的日历事件onDayClick 将触发两次。如果重复会触发3次,以此类推。

<div id="show_calendar">
    <div class="custom-calendar-wrap">
    <div class="custom-header clearfix">
         <nav>
    <span id="custom-prev" class="custom-prev"></span>
    <span id="custom-next" class="custom-next"></span>
         </nav>
    </div>
    <div id="calendar" class="fc cw-calendar-container"></div>
    </div>
    </div>
</div>


<script>
$(function(){
    //OpenCalendar
    $('.open-calendar').on('click', function() {
        var cal = calendar_wall();
        $('#show_calendar').dialog('open');

        return false;
    });
});

$('#show_calendar').dialog({
    width:'75%', 
    height:'800', 
    title:'Select Tour Date', 
    autoOpen:false, 
    modal:true ,
    open: function(event, ui) {
    },      
    buttons: {
    'Submit' : function() {  
        $( this ).dialog( "close" );
    }
} });

function calendar_wall(){
    var cal = $( '#calendar' ).calendarWall( {
                onDayClick : function( $el, dateProperties ) {
                console.log("A");
                });

    //Nav
    $( '#custom-next' ).unbind("click").bind("click", function() { 
        console.log("B");
    } );
    $( '#custom-prev' ).unbind("click").bind("click", function() {
        console.log("C");
    } );

    return cal;
}
</script>

在点击事件之外调用calendar_wall()不会导致重复触发。但是我的网页是 ajax 风格的,所以打开日历按钮会被点击很多时间,最终由于堆叠而变慢。

:::::更新:::::

好的,我刚刚发现重新绑定下一年和上一年按钮可以解决问题。 现在剩下的是 onDayClick 事件仍然会重复触发。我在下面添加插件代码。

$.CalendarWall.defaults = {
            monthNames : shortMonthName,
            dayNames  : DayName,
            onDayClick : function( $el, dateProperties ) { return false; }
};

$.CalendarWall.prototype = {    
...
...

_initEvents : function() {
    var self = this;
        //How do i add unbind and bind here??
    this.$el.on( 'click.calendarWall', 'td', function() {

        var $cell = $( this ),
            idx = $cell.index(),
            dateProp = {
                day : $cell.children('span.date').text(),
                weekdayname : $cell.children('span.weekday').text(),
                month: $cell.closest('table').find('th.cw-month > span.month').text(),
                monthname: $cell.closest('table').find('th.cw-month > span.monthname').text(),
                year : self.year                    
            };

        if( dateProp.day ) {
            self.options.onDayClick( $cell, dateProp );
        }

    } );
},

}

:::: 更新 2 ::::

将此行添加到插件事件不再有问题。

this.$el.off('click.calendarWall').on( 'click.click.calendarWall', 'td', function() {

【问题讨论】:

  • 显示calander_wall() 的代码。听起来它重新启动了压延机
  • 当你改变它的html时,你不能在ajax回调中初始化calander吗?
  • 你能给我举个例子吗?
  • 发布加载到 calander 中的 ajax 示例
  • 通过在事件中添加 off 和 on 解决了问题。

标签: javascript jquery html dialog repeat


【解决方案1】:

这是因为您调用calendar_wall 的次数与单击open-calendar 元素的次数一样多,这将每次都注册一个新的单击处理程序以及现有的处理程序。

检查calendar_wall 是否已为当前#calendar 实例调用的可能解决方案,如果是,则不要执行任何操作。

function calendar_wall() {
    var $calendar = $('#calendar');
    if ($calendar.data('calendar_wall')) {
        return;
    }

    $calendar.data('calendar_wall', true)
    var cal = $calendar.calendarWall({
        onDayClick: function ($el, dateProperties) {
            console.log("A");
        }
    });
    //Nav
    $('#custom-next').on('click', function () {
        console.log("B");
    });
    $('#custom-prev').on('click', function () {
        console.log("C");
    });

    return cal;
}

【讨论】:

  • 我其实想重新初始化日历
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2011-06-23
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多