【问题标题】:In fullcalendar event tooltip is not visisble在全日历事件工具提示中不可见
【发布时间】:2019-08-29 07:22:46
【问题描述】:

在我的 laravel 5.8 / Bootstrap v4.1.2 / jquery jQuery v3.3.1 fullcalendar v4.3.1 应用程序中,我想为 fullcalendar 的事件添加工具提示 并查看此示例https://codepen.io/pen/?&editable=true&editors=001

我这样做:

eventRender: function (eventInfo) {
    console.log("eventInfo" )
    console.log( eventInfo )

    console.log("eventInfo.el" )
    console.log( eventInfo.el )

   var tooltip = new Tooltip(eventInfo.el, {        
        title: 'Lorem  ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod  tempor', //eventInfo.event.extendedProps.description,
        placement: 'top',
        trigger: 'hover',
        container: 'body'
    });

    eventInfo.el.querySelector('.fc-title').innerHTML += "<i class='fa fa-external-link pull-right'" +
        " onclick=\"javascript:backendEvent.editCalendarEvent(event," + eventInfo.event.id + "); return" +
        " false;\">Edit</i>";

    return;

我在控制台中没有任何错误,也没有工具提示文本。

在控制台中我看到 eventInfo.el 为:https://imgur.com/a/S9GuW2V 我想它们是有效的元素

在我的 resources/views/admin/event/index.blade.php 我已经包含:

<script src="{{ asset('js/fullcalendar/core/main.js') }}"></script>
<!-- FullCalendar Core Package v4.3.1 -->


<script src="{{ asset('js/fullcalendar/daygrid/main.js') }}"></script>
<!-- FullCalendar Day Grid Plugin v4.3.0 -->


<script src="{{ asset('js/popper.min.js') }}"></script>
<!--   Copyright (C) Federico Zivolo 2019 -->    


<script src="{{ asset('js/tooltip.min.js') }}"></script>
<!-- Copyright (C) Federico Zivolo 2019 -->
In the example I see that tooltip var is created but never used . Is it ok ?

How to fix it ?

修改块:

所有 js 功能都在 public/js/defaultBS41Backend/admin/event.js 文件中,并且在 fullcalendar 文件之后加载: https://imgur.com/a/eMcCQKa

FullCsalendar 在 js 函数中被初始化:

backendEvent.prototype.evenstLoadWithFullCalendar = function () {
    var dataArray = {
        "_token": this_csrf_token,
        "filter_event_name": $("#filter_event_name").val(),
        "filter_start_date": $("#filter_start_date").val(),
        "filter_end_date": $("#filter_end_date").val(),
        "filter_type": $("#filter_type").val(),
        "filter_status": $("#filter_status").val()
    }

    var href = this_backend_home_url + "/admin/get_events_fc_listing";
    $.ajax({
        type: "POST",
        dataType: "json",
        url: href,
        data: dataArray,
        success: function (response) {
            if (response.error_code == 0) {
                initFullCalendar(response.events);
            }
        },
        error: function (error) {
            popupErrorMessage(error.responseJSON.message)
        }
    });

}


function initFullCalendar(eventsList) {
    if (typeof window.calendarEventsObject != "undefined") { // clear existing instance
        window.calendarEventsObject.destroy();
    }

    var calendarEl = document.getElementById('events_calendar');

    var effective_device_width = effectiveDeviceWidth('width') //TODO

    window.calendarEventsObject = new FullCalendar.Calendar(calendarEl, {
        plugins: ['dayGrid'],

        eventRender: function (eventInfo) {
            console.log("eventInfo" )
            console.log( eventInfo )

            console.log("eventInfo.el" )
            console.log( eventInfo.el )

           var tooltip = new Tooltip(eventInfo.el, {        // example : https://fullcalendar.io/docs/event-tooltip-demo
                // title: eventInfo.event.extendedProps.description,
                title: 'Lorem  ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod  tempor', //eventInfo.event.extendedProps.description,
                placement: 'top',
                trigger: 'hover',
                container: 'body'
            });

            eventInfo.el.querySelector('.fc-title').innerHTML += "<i class='fa fa-external-link pull-right'" +
                " onclick=\"javascript:backendEvent.editCalendarEvent(event," + eventInfo.event.id + "); return" +
                " false;\">Edit</i>";

        },

        events: eventsList,
        // events: [],

        header: {
            left: 'LEFT98',
            center: 'title123',
            right: 'Right 444'
        },

        showNonCurrentDates: false,

        editable: true,
        allDaySlot: true,
        selectable: true,
        selectHelper: true,
        selectOverlap: false,
        fixedWeekCount: false,

        aspectRatio: 0.4,
        height: 700,

        select: function (start, end) {
            alert( "select:::"+var_dump(-50) )
            var title = "Available";
            var evid = SaveEvent(start, end, '1');
            $('#events_calendar').fullCalendar('unselect');
        },

        eventClick: function (clickObj) {
            alert( "eventClick clickObj.el::"+var_dump(clickObj.el) )
            if (clickObj.el.href != "") {
                // alert( "::"+var_dump(-4) )
                let el_href = clickObj.el.href
                clickObj.el.href = ""
                window.open(el_href, "_blank");
                // clickObj.event.preventDefault();
                alert( "::"+var_dump(-41) )
                return false;
            }
            return false;
        },
    });

    window.calendarEventsObject.render(
        {
            backgroundColor: 'green',
            textColor: 'yellow',
        }
    );

    jQuery('.eo-fullcalendar').on('click', '.fc-event', function (e) {
        e.preventDefault();
        window.open(jQuery(this).attr('href'), '_blank');
    });

}   // function initFullCalendar() {

我知道当使用 ajax 加载数据时(如我的情况),它可能会引发问题 带有一些 jquery 组件。难道是在我用ajax加载数据后我必须再初始化工具提示1次吗?

【问题讨论】:

  • 您是否还在代码中包含了工具提示的相关 CSS?
  • 我保存了一份 fullCalendar 的演示 CodePen:codepen.io/ADyson82/pen/eYOEYdp?editors=0110。如果您查看主要的 CSS 部分(而不是链接),您会明白我的意思。当然,您可以根据自己的喜好对其进行自定义。
  • P.P.S.您问Can it be that after I loaded data with ajax I have to init tooltip 1 more time? ...否,因为eventRender 在事件下载后运行。因此,在事件元素已经存在之前,您不会添加工具提示 - 实际上您是直接将其附加到元素对象,所以这显然不会成为问题。 ajax 加载的问题发生在元素创建之后 一个函数已在选择器上执行(例如设置一个事件处理程序),该选择器将匹配新元素 - 如果元素不存在时函数运行,它无法定位它
  • 我希望您会使用类似$(eventInfo.el).popover(... 的弹出框,然后根据引导文档添加选项。我给你链接的那个页面有例子。或者您可以使用工具提示变体:getbootstrap.com/docs/4.0/components/tooltips,它更接近 tooltip.js 的功能。但是设置再次非常相似(具体参见getbootstrap.com/docs/4.0/components/tooltips/#usage)。
  • 顺便说一句,您的工具提示 CSS 很可能无法正常工作,因为可能与 Bootstrap 中与工具提示和弹出框相关的某些规则发生冲突(因为它也依赖于 popper.js)。我隐约记得不久前有人在这个网站上遇到过类似问题。更有理由只使用引导版本...

标签: javascript css fullcalendar tooltip fullcalendar-4


【解决方案1】:

就我而言,有效的决定是:

eventRender: function (eventInfo) {

    $(eventInfo.el).tooltip({                
        title: "<i class=\"fa fa-users\"></i>&nbsp;<b>"+eventInfo.event.extendedProps.attendees_count+"&nbsp;attendee(s)</b>" +
            " <br><smalUUl>"+eventInfo.event.extendedProps.description+"</smalUUl>",
        html: true,
    });

},

其中描述和参加者计数我的自定义字段发送到事件。 没有任何附加库

【讨论】:

  • 好吧,它仍然需要 bootstrap 和 jQuery,而 fullCalendar 通常不需要这些,所以我认为你不能说它不需要额外的库。仅仅因为它们之前在您的特定页面上存在并不意味着对于阅读此答案的其他人来说它们可能不是“额外的”。最好只说要求是什么。尽管我想你确实在问题中提到了它们
【解决方案2】:
eventAfterAllRender: function(view){
   $('.has-tooltip').tooltip({container:'#calendar',placement:'top'});
},

你可以把 eventAfterAllRender 显示工具提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多