Jquery 相对于该高度/宽度移动。它需要一个SelectDates(date1,date2)函数来处理您想要对所选日期范围执行的任何操作

Jquery 相对于该高度/宽度移动。它需要一个SelectDates(date1,date2)函数来处理您想要对所选日期范围执行的任何操作,jquery,jquery-plugins,jquery-mobile,jquery-selectors,fullcalendar,Jquery,Jquery Plugins,Jquery Mobile,Jquery Selectors,Fullcalendar,这是我的密码: $(document).on('touchmove', '.fc-day', function (e) { var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; var $startElement = $(this); var moveStartDate = new Date($startEl

这是我的密码:

        $(document).on('touchmove', '.fc-day', function (e) {
            var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];

            var $startElement = $(this);
            var moveStartDate = new Date($startElement.data('date'));
            var timezoneOffset = moveStartDate.getTimezoneOffset() * 60000;
            moveStartDate.setTime(moveStartDate.getTime() + timezoneOffset);

            var rect = $startElement[0].getBoundingClientRect();

            var DayHeight = $startElement[0].clientHeight;
            var DayWidth = $startElement[0].clientWidth;

            var xdif = 0;
            if (touch.pageX < rect.left) {
                xdif = touch.pageX - rect.left;
            }
            if (touch.pageX > rect.right) {
                xdif = touch.pageX - rect.right;
            }
            var xDaysAwayDecimal = xdif == 0 ? 0 : (xdif / DayWidth);
            var xDaysAway = xdif >= 0 ? Math.ceil(xDaysAwayDecimal) : Math.floor(xDaysAwayDecimal);

            var ydif = 0;
            if (touch.pageY < rect.top) {
                ydif = touch.pageY - rect.top;
            }
            if (touch.pageY > rect.bottom) {
                ydif = touch.pageY - rect.bottom;
            }
            var yDaysAwayDecimal = ydif == 0 ? 0 : (ydif / DayHeight);
            var yDaysAway = ydif >= 0 ? Math.ceil(yDaysAwayDecimal) : Math.floor(yDaysAwayDecimal);

            var dayModifier = (yDaysAway * 7) + xDaysAway;

            var moveEndDate = new Date(moveStartDate);
            moveEndDate.setDate(moveEndDate.getDate() + dayModifier);
            if (moveStartDate > moveEndDate) {
                SelectDates(moveEndDate, moveStartDate);
            }
            else {
                SelectDates(moveStartDate, moveEndDate);
            }
        })
$(document).on('touchmove','.fc day',函数(e){
var touch=e.originalEvent.touch[0]| | e.originalEvent.changedtouchs[0];
var$startElement=$(本);
var moveStartDate=新日期($startElement.data('Date');
var timezoneOffset=moveStartDate.getTimezoneOffset()*60000;
moveStartDate.setTime(moveStartDate.getTime()+时区偏移);
var rect=$startElement[0]。getBoundingClientRect();
var DayHeight=$startElement[0].clientHeight;
var DayWidth=$startElement[0].clientWidth;
var xdif=0;
如果(touch.pageXrect.right){
xdif=touch.pageX-rect.right;
}
变量xDaysAwayDecimal=xdif==0?0:(xdif/DayWidth);
var xDaysAway=xdif>=0?Math.ceil(xDaysAwayDecimal):Math.floor(xDaysAwayDecimal);
var-ydif=0;
如果(touch.pageYrect.bottom){
ydif=touch.pageY-rect.bottom;
}
变量yDaysAwayDecimal=ydif==0?0:(ydif/日高);
var yDaysAway=ydif>=0?Math.ceil(yDaysAwayDecimal):Math.floor(yDaysAwayDecimal);
var dayModifier=(yDaysAway*7)+xDaysAway;
var moveEndDate=新日期(moveStartDate);
moveEndDate.setDate(moveEndDate.getDate()+dayModifier);
如果(moveStartDate>moveEndDate){
选择日期(moveEndDate、moveStartDate);
}
否则{
选择日期(moveStartDate、moveEndDate);
}
})

还有。。如果您的SelectDates()执行任何繁重的操作,您可能只想让它每移动x个像素或x毫秒触发一次。。。或者保存这些值,然后在停止时进行处理。My SelectDates()将css添加到日历中,因此我希望它能够随着触摸移动动作不断启动。

经过多次搜索,我没有找到简单明了的答案,因此,我自己制作了它,如下所示:

var calendar = $('#calendar').fullCalendar({
     .. 
    ....
     ..
    dayRender: function( date, cell) {
        $(cell).on("touchend",function(event){
            var startDate = date;
            var x= event.originalEvent.changedTouches[0].clientX;
            var y = event.originalEvent.changedTouches[0].clientY
            var endDate = moment($(document.elementFromPoint(x, y)).attr("data-date"),"YYYY-MM-DD");
            if(endDate>startDate){
                calendar.fullCalendar( 'select', startDate, endDate.add('days', 1));
            }else{
                calendar.fullCalendar( 'select', endDate, startDate.add('days', 1));
            }
        });
    },
    select: function(start, end, allDay, jsEvent, view) {
         .. 
        ....
         .. 
        calendar.fullCalendar('unselect');
    }
});

Mobile Safari是否有任何控制台输出$(document).ready()可能是个问题,因为jQM使用$(document).bind('pageinit')@PhillPafford在控制台中看不到任何内容。非常感谢您关注这一点。如果你正在尝试单击+拖动,请也仔细考虑一下,然后振作起来,因为我也必须用单击来解决问题。:)我对jquerymobile不太熟悉,但我认为touch+drag与click+drag的工作方式不同。也许你应该在这里考虑其他选择——比如在每个插槽上都有复选框供选择。另外,可能是FullCalendar没有针对移动设备进行优化,无法处理触摸+拖动。@MahavirMunot,你能看看这两者的组合吗-1)不要使用
选择
回调,2)将
滑动
移动事件绑定到
.fc day内容
(或你想要从渲染的日历中获得的任何更好的元素),3)基于传递给此事件处理程序的
event.pageX
event.pageY
,使用
.elementFromPoint(x,y)
获取所选天数,4)使用此调用
选择
方法以编程方式选择刷卡的天数。这是一个最好的黑客-让我知道,如果这有帮助!祝你一切顺利!这与我提出的问题完全不同。我相信你的js向导可能可以以更优雅的方式实现同样的解决方案,但我认为这个想法可能对任何有这个问题的人都有帮助。谢谢你添加这个我会检查它。3.感谢你的努力,谢谢你我试过了,但没有成功。。请问你能告诉我什么时候把这个密码或小提琴放进去吗
$('#calendar table.fc-border-separate td.ui-widget-content').on('touchstart', function (event) {
    /* touch start processing, probably cancelling like*/ 
    event.preventDefault();
    event.stopImmediatePropagation();

    function mouseMoveHandler (event) {
         /* processing actual drag */
         /* possible also cancelling default behavior and instead calling Calendar API */
    }

    function mouseUpHandler (event) {
        /* processing mouse up */

        /* some clean up */         
        $(document).off('touchmove', mouseMoveHandler)
        .off('touchend touchleave touchcancel', mouseUpHandler);
    }

    $(document).on('touchmove', mouseMoveHandler)
        .on('touchend touchleave touchcancel', mouseUpHandler);
});
        $(document).on('touchmove', '.fc-day', function (e) {
            var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];

            var $startElement = $(this);
            var moveStartDate = new Date($startElement.data('date'));
            var timezoneOffset = moveStartDate.getTimezoneOffset() * 60000;
            moveStartDate.setTime(moveStartDate.getTime() + timezoneOffset);

            var rect = $startElement[0].getBoundingClientRect();

            var DayHeight = $startElement[0].clientHeight;
            var DayWidth = $startElement[0].clientWidth;

            var xdif = 0;
            if (touch.pageX < rect.left) {
                xdif = touch.pageX - rect.left;
            }
            if (touch.pageX > rect.right) {
                xdif = touch.pageX - rect.right;
            }
            var xDaysAwayDecimal = xdif == 0 ? 0 : (xdif / DayWidth);
            var xDaysAway = xdif >= 0 ? Math.ceil(xDaysAwayDecimal) : Math.floor(xDaysAwayDecimal);

            var ydif = 0;
            if (touch.pageY < rect.top) {
                ydif = touch.pageY - rect.top;
            }
            if (touch.pageY > rect.bottom) {
                ydif = touch.pageY - rect.bottom;
            }
            var yDaysAwayDecimal = ydif == 0 ? 0 : (ydif / DayHeight);
            var yDaysAway = ydif >= 0 ? Math.ceil(yDaysAwayDecimal) : Math.floor(yDaysAwayDecimal);

            var dayModifier = (yDaysAway * 7) + xDaysAway;

            var moveEndDate = new Date(moveStartDate);
            moveEndDate.setDate(moveEndDate.getDate() + dayModifier);
            if (moveStartDate > moveEndDate) {
                SelectDates(moveEndDate, moveStartDate);
            }
            else {
                SelectDates(moveStartDate, moveEndDate);
            }
        })
var calendar = $('#calendar').fullCalendar({
     .. 
    ....
     ..
    dayRender: function( date, cell) {
        $(cell).on("touchend",function(event){
            var startDate = date;
            var x= event.originalEvent.changedTouches[0].clientX;
            var y = event.originalEvent.changedTouches[0].clientY
            var endDate = moment($(document.elementFromPoint(x, y)).attr("data-date"),"YYYY-MM-DD");
            if(endDate>startDate){
                calendar.fullCalendar( 'select', startDate, endDate.add('days', 1));
            }else{
                calendar.fullCalendar( 'select', endDate, startDate.add('days', 1));
            }
        });
    },
    select: function(start, end, allDay, jsEvent, view) {
         .. 
        ....
         .. 
        calendar.fullCalendar('unselect');
    }
});