25

मैंने फोनगैप का उपयोग कर एंड्रॉइड और आईफोन जैसे मोबाइल डिवाइस के लिए एक पूर्ण कैलकुलेटर एप्लिकेशन बनाया है। मैं jquery fullcalendar प्लगइन के साथ Jquery Touch Punch Plugin का उपयोग कर रहा हूं। पूर्णकेंडर की 'चयन' विधि वेब पर ठीक काम कर रही है। मैं वेब ब्राउज़र पर पूर्ण कैलेंडर के महीने के दृश्य पर एकाधिक सेल का चयन करने में सक्षम हूं। हालांकि, मूल एंड्रॉइड/आईफोन ऐप पर मैं कैलेंडर के कई सेल (तिथियों की सीमा) का चयन करने में सक्षम नहीं हूं। ऐसा होता है जब मैं तारीखों की श्रेणी चुनने के लिए सेल पर क्लिक करता हूं तो डिवाइस पर कई तिथियों का चयन करने से पहले 'चयन' विधि ट्रिगर होती है। क्या इस मुद्दे को दूर करने के लिए वैसे भी है? पहले ही, आपका बहुत धन्यवाद। यहां Jsfiddle है।फुल कैलेंडर एकाधिक सेल का चयन करें?

नमूना कोड:

// FullCalendar v1.5 
// Script modified from the "theme.html" demo file 

$(document).ready(function() {  
var date = new Date(); 
var d = date.getDate(); 
var m = date.getMonth(); 
var y = date.getFullYear(); 

$('#calendar').fullCalendar({ 
    theme: true, 
    header: { 
     left: 'prev,next today', 
     center: 'title', 
     right: 'month' 
    }, 
    editable: true, 
    disableDragging: true, 
    disableResizing: true, 
    droppable: true, 
    drop: function(date, allDay, jsEvent, ui){ 
     console.log(jsEvent); 
     console.log(ui); 
    }, 
    // add event name to title attribute on mouseover 
    eventMouseover: function(event, jsEvent, view) {    
     if (view.name == "month") { 
      $(jsEvent.target).attr('title', event.title); 
     } 
     //alert(event.id); 
    }, 
    // For DEMO only 
    // ************* 
    events: [ 
     { id: 1, 
      title: 'User1', 
      start: '2012-09-01', 
      end: '2012-09-01', 
      color:'#E9B33E', 
      className: 'user-class1'}, 
     { id: 2, 
      title: 'User2', 
      start: '2012-09-06', 
      end: '2012-09-06', 
      color:'#00813E', 
      className: 'user-class2'},  
     { id: 3, 
      title: 'User3', 
      start: '2012-09-06', 
      end: '2012-09-06', 
      color:'#E59238', 
      className: 'user-class3'},  
     { id: 4, 
      title: 'User4', 
      start: '2012-09-06', 
      end: '2012-09-06', 
      color:'#00813E', 
      className: 'user-class4'},    
     { id: 5, 
      title: 'User5', 
      start: '2012-09-08', 
      end: '2012-09-08', 
      color:'#00813E', 
      className: 'user-class5'}, 
     ], 
    eventRender: function(event,element,calEvent) {     
     element.attr('id',this.id); 
     if(this.id!=5){      
      element.find(".fc-event-title").after($("<br/><span class=\"fc-event-icons\"></span>") 
      .html("<img src=\"http://png-5.findicons.com/files//icons/2018/business_icons_for/16/passport.png\" onclick=\"javascript:iconsAlert("+this.id+",'passport')\" class=\"icon\"/>"+ 
       "<img src=\"http://findicons.com/files//icons/1571/chalkwork_payments/16/card_visa.png\" onclick=\"javascript:iconsAlert("+this.id+",'visa')\" class=\"icon\" />"+ 
       "<img src=\"http://findicons.com/files//icons/894/banking_stuff/16/postage_stamp.png\" onclick=\"javascript:iconsAlert("+this.id+",'traveldoc')\" class=\"icon\" />"+ 
       "<img src=\"http://findicons.com/files//icons/756/ginux/16/richtext.png\" onclick=\"javascript:iconsAlert("+this.id+",'entrystamp')\" class=\"icon\" />")); 
     } 
     element.droppable({ 
       accept: '*', 
       tolerance: 'touch', 
       //activeClass: 'ui-state-hover', 
       //hoverClass: 'ui-state-active', 
       drop: function(ev, ui) {     
        //console.log(ev.id); 
        alert(this.id); 
        //for(param in ui){ console.log(ev.id);} 
       } 
       }); 
}, 
selectable: true, 
selectHelper: true, 
select: function(start, end, allDay) { 
    alert("Cell selected from "+$.fullCalendar.formatDate(start, 'yyyy-MM-dd')+" to "+$.fullCalendar.formatDate(end, 'yyyy-MM-dd')); 
}, 
eventClick: function(calEvent, jsEvent, view) { 
    if (!$(jsEvent.target).hasClass("icon")) { 
     alert("UserID:"+calEvent.id); 
    }     
} 

}); 


$('#external-events div.passport-event,.visa-event,.entrystamp-event,.traveldoc-event').each(function() { 

     // create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/) 
     // it doesn't need to have a start or end 
     var eventObject = { 
      title: $.trim($(this).text()), // use the element's text as the event title 
      className: $(this).attr('class') 
     }; 

     // store the Event Object in the DOM element so we can get to it later 
     $(this).data('eventObject', eventObject); 

     // make the event draggable using jQuery UI 
     $(this).draggable({ 
      zIndex: 999, 
      revert: true,  // will cause the event to go back to its 
      revertDuration: 0 // original position after the drag 
     }); 

    }); 
}); 

[संचालक को विनम्र अनुरोध: कृपया इस सवाल का जब तक यह हल हो गई है बंद नहीं करते। धन्यवाद]

+0

वहाँ मोबाइल सफारी से किसी भी उत्पादन सांत्वना है? $ (दस्तावेज़) .ready() एक मुद्दा हो सकता है साथ ही जेक्यूएम $ (दस्तावेज़) का उपयोग करता है। बाइंड ('पेजिनिट') http://jquerymobile.com/demos/1.1.1/docs/api/events.html –

+0

@PhillPafford कंसोल में कुछ भी नहीं देख सका। इसमें देखने के लिए बहुत बहुत धन्यवाद। कृपया http://jsfiddle.net/veer712/KrZJr/17/ के साथ-साथ –

+0

पर एक नज़र डालें, यदि आप क्लिक + ड्रैग करने का प्रयास कर रहे हैं, तो इस तथ्य को ध्यान में रखें कि मुझे क्लिक-क्लिक के साथ भी निपटना पड़ा। :) –

उत्तर

-2

मेरे अनुभव से मैंने कैलेंडर को ऐसे कार्यों के लिए एक अच्छा विकल्प के रूप में कभी नहीं पाया। बजाय datepicker उपयोग करने का प्रयास - http://jquerymobile.com/demos/1.0a4.1/experiments/ui-datepicker/

+3

में आपके द्वारा अनुशंसित समाधान के समान समाधान है जो मैंने पूछा है कि –

0

इस उत्तर एक और StackOverflow पोस्ट में पाया गया था: How can we specify custom date range with fullcalendar?

आप जो समय अवधि से घटनाओं प्राप्त करने के लिए इस समारोह कॉल कर सकते हैं। हालांकि, यह आपको केवल 30 दिन की घटनाएं लाएगा।

function GetAgendaEvents(datefrom, dateTo) { 
    var fromDate = new Date($("#from").val()); 
    var toDate = new Date($("#to").val()); 

    if (fromDate.getTime() <= toDate.getTime()) { 
     $('#fullcal').fullCalendar('removeEvents').fullCalendar('addEventSource', events); 
     $('#fullcal').fullCalendar('refetchEvents'); 

     var filteredEvent = $('#fullcal').fullCalendar('clientEvents', function (event) { 
      return event.start >= fromDate && event.start <= toDate; 
     }); 

     $('#fullcal').fullCalendar('gotoDate', fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate()); 
     $('#fullcal').fullCalendar('changeView', 'agenda'/* or 'basicDay' */); 

     $('#fullcal').fullCalendar('removeEvents').fullCalendar('addEventSource', filteredEvent); 
     $('#fullcal').fullCalendar('refetchEvents'); 
    } 
} 
0

दूसरा समाधान डेटबॉक्स है। मैंने इसे अपने jquery मोबाइल एप्लिकेशन में लागू किया है, इसका उपयोग करना आसान है। और कंप्यूटर, मोबाइल, tblet http://dev.jtsage.com/jQM-DateBox2/

+0

प्रश्न से प्रासंगिक नहीं है पूछा। –

1

पर दोनों के लिए बहुत अच्छा पहले से ही प्रारंभ कैलेंडर की कोशिकाओं को घटना श्रोताओं को जोड़ने और कुछ जादू को लागू करने, इस तरह के बारे में कैसे:

$('#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); 
}); 

मैं जानता हूँ कि यह एक सा है आपके शेष कोड की तुलना में निम्न-स्तर की तुलना में, लेकिन इससे मदद मिल सकती है। ये कार्यक्रम केवल मोबाइल पर काम करेंगे और शायद आप वांछित व्यवहार प्राप्त करने में सक्षम होंगे। क्षमा करें, इस दृष्टिकोण को स्वयं करने का प्रयास करने के लिए कोई समय नहीं है, शायद मैं बाद में jsFiddle पर कोशिश करूंगा।

+0

मैं इसे देखता हूं कि यह काम करता है :) –

+0

मैंने कोशिश की है लेकिन काम नहीं कर रहा है .. कृपया मुझे यह बताएं कि यह कोड या पहेली –

0

बस स्पर्श पंच बिना

एक समाधान इस पुराने सवाल में जोड़ने के लिए ...:

मैं व्यक्तिगत रूप से mobilie के लिए FullCalendar को लागू किया है और एकाधिक चयन करें की touchmove से निपटने के साथ परेशानी हो रही थी तो मैं करने का निर्णय लिया यह सब सिर्फ एचटीएमएल दिवस वस्तुओं पर आधारित है।

मुझे बस पहली बार चुनी गई ऊंचाई की चौड़ाई/चौड़ाई मिलती है और उस ऊंचाई/चौड़ाई के संबंध में दूरी को स्थानांतरित किया जाता है। इसके चयन के लिए जो भी आप करना चाहते हैं उसे संभालने के लिए इसे एक चयन दिनांक (दिनांक 1, दिनांक 2) फ़ंक्शन की आवश्यकता होती है।

यहाँ मेरी कोड है:

 $(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); 
      } 
     }) 

भी .. अपने SelectDates() कोई प्रयास, आप केवल यह हर एक्स राशि आग की पिक्सल ले जाया गया या millisecond के एक्स मात्रा में करना चाह सकते हैं करता है .. या तो या तो मानों को सेव करें या फिर रुकने पर प्रसंस्करण करें। मेरे चयन दिनांक() ने कैलेंडर में सीएसएस जोड़ा, इसलिए मैं टच मूव गति के साथ लगातार आग लगाना चाहता था।

+1

मुझे यकीन है कि आप जेएस विज़ार्ड शायद इस तरह के समाधान को और अधिक लागू कर सकते हैं सुरुचिपूर्ण फैशन, लेकिन मैंने सोचा कि विचार इस मुद्दे वाले किसी के लिए सहायक हो सकता है। – jumpdart

+0

यह –

0

खोजों के बहुत बाद मैं कोई सरल और स्पष्ट जवाब मिल गया है, तो, मैं अपने आप को करके इसे बनाया है, और यहाँ यह है:

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'); 
    } 
}); 
+0

जोड़ने के लिए धन्यवाद, मैं इसे देखूंगा। कोशिश करने के लिए अपने प्रयासों की सराहना करते हैं, धन्यवाद –

संबंधित मुद्दे