Handle dblclick in Fullcalendar jQuery plugin

允我心安 提交于 2019-12-18 19:42:50

问题


I know that this question has been asked before, but several new versions have been released since then.

Is it possible to handle a dblclick event for creating a new appointment in the calendar without having to modify the fullcalendar.js file? It would be great to handle this extension in a separate file together with my other tweaks.

Thanks in advance!

/Adam


回答1:


Adam's post at https://code.google.com/p/fullcalendar/issues/detail?id=231 uses this solution.

whenever possible i like to keep things out of the core of fullcalendar, and have people do them through the api. the only reason i have eventClick/eventMouseover/eventMouseout as part of the core is b/c they involve some special cases, such as conflicting with jquery ui dragging & resizing, so i need to do things like check for those classes.

i think the best way to attach event handlers like dblclick would be through eventRender like so:

$('#calendar').fullCalendar({
   eventRender: function(event, element) {
      element.bind('dblclick', function() {
         alert('double click!');
      });
   }
})

please let me know if you feel differently. thanks

I have the newest update and this works great for me.




回答2:


I ran across the same issue and didn't want to fiddle with the core, so I wrote double-click logic into the dayClick callback.

dayClick:function( date, allDay, jsEvent, view ) {
            var singleClick = date.toUTCString();

            if(doubleClick==singleClick){
                console.log('Double-click!');
                doubleClick = null;
            }else{
                doubleClick=date.toUTCString();
                clearInterval(clickTimer);
                clickTimer = setInterval(function(){
                    doubleClick = null;
                    clearInterval(clickTimer);
                }, 500);
            }
        }

clickTimer and doubleClick are declared before the call to initialize the calendar.




回答3:


Just to add to Juan Gonzales's answer:

$("#calendar").fullCalendar({
    dayRender: function(date, element, view){
        element.bind('dblclick', function() {
            alert('double click!');
        });
    }
});

This code will create the dblclick event to the whole "day" event.

Source




回答4:


Below code shows double click events for Event & Day. For day,You need to double click on lower side (lower half) of date cell. I don't know the reason behind this

 $('#fullcalendar').fullCalendar({
        header: {
        left: 'prev,next today',
        center: 'title',
        right: 'month,agendaWeek,agendaDay',
      },
      events: this.EventList,
      defaultView: 'month',
      editable: true,
      //for event double click
      eventRender:function(event,element){
        element.bind('dblclick',function(){
          alert('double click event')
        });
      },
      //for day double click
      dayRender:function(date,cell)
      {
        cell.bind('dblclick',function(){
          alert(date)
        })
      }
    }) 



回答5:


Okay, so this is probably and old thread but I am going to give my five cents to this one. Since the version 2 (currently 2.4.0) it appears there is a bit different piece of code managing the click events. So.. this is how i solved it.

As previous stated, open fullcalendar.js, search for something like "trigger('eventClick'" and you will hit some code that looks like this:

$.each(
{
    mouseenter: function(seg, ev) {
        _this.triggerSegMouseover(seg, ev);
    },
    mouseleave: function(seg, ev) {
        _this.triggerSegMouseout(seg, ev);
    },
    click: function(seg, ev) {
        return view.trigger('eventClick', this, seg.event, ev); // can return `false` to cancel
    },
    mousedown: function(seg, ev) {
        if ($(ev.target).is('.fc-resizer') && view.isEventResizable(seg.event)) {
            _this.segResizeMousedown(seg, ev, $(ev.target).is('.fc-start-resizer'));
        }
        else if (view.isEventDraggable(seg.event)) {
            _this.segDragMousedown(seg, ev);
        }
    }
}, and so on .......

so to get the doubleclick, just get this litte piece of code inbetween click and mousedown (or whatever suits your desire):

dblclick: function(seg, ev) {
        return view.trigger('eventDoubleClick', this, seg.event, ev); // can return `false` to cancel
    },

Now, all you need to do is to specifiy it on the initialization object.

eventDoubleClick: function(calEvent, jsEvent, view) {

    alert('Event: ' + calEvent.title);
    alert('Coordinates: ' + jsEvent.pageX + ',' + jsEvent.pageY);
    alert('View: ' + view.name);

    // change the border color just for fun
    $(this).css('border-color', 'red');
}

Worked in Chrome for me, have not tested this solution anywhere else.




回答6:


Use selector jquery $(info.el).on to bind dblclick in eventRender Note : Solution just for fullcalendar V4)

$('#calendar').fullCalendar({
       eventRender: function(info) {
            $(info.el).on('dblclick', function() {
               alert('double click!');
            });
       }
})

it works for me ! :)




回答7:


I got this working by modifying the fullcalendar.js which didn't seem like a big deal to me. Anyways, here is how you add a double click event:

  • Open fullcalendar.js, search for something like "trigger('eventClick'"
  • You will see this function:

    function eventElementHandlers(event, eventElement) {
        eventElement
        .click(function (ev) {
            if (!eventElement.hasClass('ui-draggable-dragging') &&
                !eventElement.hasClass('ui-resizable-resizing')) {
                return trigger('eventClick', this, event, ev);
            }
        })
                    .hover(
            function (ev) {
                trigger('eventMouseover', this, event, ev);
            },
            function (ev) {
                trigger('eventMouseout', this, event, ev);
            }
        );
        // TODO: don't fire eventMouseover/eventMouseout *while* dragging is occuring (on subject element)
        // TODO: same for resizing
    }
    
  • Add this function to the eventElement's function (next to click / hover)

      .dblclick(function (ev) {
            return trigger('eventDblClick', this, event, ev);
        })
    
  • Now you can write the double click event for the calendar event by eventDblClick. Something like this: (Refer to the documentation's eventClick for the parameters)

    eventDblClick: function (calEvent, jsEvent, view) {
       // Create a new appointment
    }
    

Note: You can add any jquery function to the event this way!




回答8:


        dayClick: function(date, jsEvent, view) {
            prevTime = typeof currentTime === 'undefined' || currentTime === null
                ? new Date().getTime() - 1000000
                : currentTime;
            currentTime = new Date().getTime();

            if (currentTime - prevTime < 500)
            {
                //double click call back
                console.log("this is double click");
            }
        },

get current time for dayClick




回答9:


Updated Nullorado's solution to v3.2.0:

Since version 3 (currently 3.2.0) it appears there is a bit different piece of code managing the click events. A good way to solve it seems as followed:

Open fullcalendar.js, search for something like "bindSegHandlersToEl" and you will hit some code that looks like this:

bindSegHandlersToEl: function(el) {
    this.bindSegHandlerToEl(el, 'touchstart', this.handleSegTouchStart);
    this.bindSegHandlerToEl(el, 'mouseenter', this.handleSegMouseover);
    this.bindSegHandlerToEl(el, 'mouseleave', this.handleSegMouseout);
    this.bindSegHandlerToEl(el, 'mousedown', this.handleSegMousedown);
    this.bindSegHandlerToEl(el, 'click', this.handleSegClick);
},

Within the above shown function, add this line to create a doubleclick handler:

this.bindSegHandlerToEl(el, 'dblclick', this.handleSegDoubleClick);

After this, look for "handleSegClick" a few lines below the function. You'll find this:

    handleSegClick: function(seg, ev) {
    var res = this.view.publiclyTrigger('eventClick', seg.el[0], seg.event, ev); // can return `false` to cancel
    if (res === false) {
        ev.preventDefault();
    }
},

Copy it and rename:

  1. "handleSegClick" to "handleSegDoubleClick"
  2. "eventClick" to "eventDoubleClick"

You end up with the following:

handleSegDoubleClick: function(seg, ev) {
    var res = this.view.publiclyTrigger('eventDoubleClick', seg.el[0], seg.event, ev); // can return `false` to cancel
    if (res === false) {
        ev.preventDefault();
    }
},

Finally, go to your fullcalendar initialisation object and specify:

eventDoubleClick: function(calEvent, jsEvent, view) {
    alert('Event: ' + calEvent.title);
}

Works in Chrome and IE11.




回答10:


I thought I would share how I address adding dblclick this through the API versus code modification with the fullcalendar version 4 that exposed the property through one object reference.

Here is the working example: Codepen

eventRender: function (info) {

  //WON'T ALLOW ALSO WORK WITH single eventClick or single Click Listener
   //info.el.addEventListener('dblclick', function () {
     //  alert('DOUBLE CLICK!'+info.event.title);
   //});

  info.el.addEventListener('click', function() {
        clickCnt++;         
    if (clickCnt === 1) {
        oneClickTimer = setTimeout(function() {
            clickCnt = 0;
            alert('SINGLE CLICK example value grab:' + info.event.title );
        }, 400);
    } else if (clickCnt === 2) {
        clearTimeout(oneClickTimer);
        clickCnt = 0;
        alert('DOUBLE CLICK example value grab:' + info.event.start );

    }          
  });
}


来源:https://stackoverflow.com/questions/8124460/handle-dblclick-in-fullcalendar-jquery-plugin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!