dhtmlxScheduler 在原生 JS/HTML 中的使用
在使用 dhtmlxScheduler 构建应用时,第一步是将 Scheduler 设置并显示在页面上。
本指南介绍如何使用原生 JS 和 HTML 初始化 dhtmlxScheduler。若需与前端框架集成,请参考以下指南:

Use the ready-made ReactScheduler component with props and events.

Integrate Scheduler into Angular projects using a thin wrapper.

Use Scheduler inside Vue apps with a small wrapper and reactive configuration.

Embed Scheduler in Svelte with a simple component that binds config and events.

Use Scheduler in Salesforce Lightning Web Components and connect it to org data.
在页面上初始化 Scheduler 有两种方式:
通过标记方式初始化 Scheduler
要通过标记(markup)方式在页面上设置一个基础的 Scheduler,请按照以下 3 个步骤操作:
- 在页面中引入 dhtmlxScheduler 代码文件。
- 在页面中添加一个 DIV 容器,并为其元素添加必要的子 DIV。
- 使用 init 方法在创建的容器中初始化 dhtmlxScheduler。该方法接收一个 HTML 容器(或其 id),Scheduler 将在此容器中渲染。
<!DOCTYPE html>
<html>
<head>
<script src="../scheduler/dhtmlxscheduler.js" type="text/javascript"></script>
<link rel="stylesheet" href="../scheduler/dhtmlxscheduler.css"
type="text/css">
</head>
<body>
<!--Scheduler 的容器及标准的 'div' 结构-->
<div id="scheduler_here" class="dhx_cal_container">
<div class="dhx_cal_navline">
<div class="dhx_cal_prev_button"> </div>
<div class="dhx_cal_next_button"> </div>
<div class="dhx_cal_today_button"></div>
<div class="dhx_cal_date"></div>
<div class="dhx_cal_tab" data-tab="day"></div>
<div class="dhx_cal_tab" data-tab="week" ></div>
<div class="dhx_cal_tab" data-tab="month"></div>
</div>
<div class="dhx_cal_header"></div>
<div class="dhx_cal_data"></div>
</div>
<script type="text/javascript">
scheduler.init("scheduler_here"); /*!*/
</script>
</body>
</html>

通过 header 配置初始化 Scheduler
如果你希望让 scheduler 自适应响应式,推荐使用此方法。
要在页面上设置一个基础的 Scheduler,请按照以下步骤操作:
- 在页面中引入 dhtmlxScheduler 代码文件。
- 在页面中添加一个 DIV 容器。
- 在 header 配置对象中定义 scheduler 的结构。
- 使用 init 方法在容器中初始化 dhtmlxScheduler,将容器(或其 id)作为参数传递。
<!DOCTYPE html>
<html>
<head>
<script src="../scheduler/dhtmlxscheduler.js"></script>
<link rel="stylesheet" href="../scheduler/dhtmlxscheduler.css"
type="text/css">
</head>
<body>
<!--Scheduler 的容器-->
<div id="scheduler_here">
</div>
</body>
<script>
//scheduler 的结构
scheduler.config.header = [
"day",
"week",
"month",
"date",
"prev",
"today",
"next"
];
scheduler.init('scheduler_here',new Date(2020,0,1),"week"); /*!*/
</script>
</html>
所需代码文件
需要引入的文件有:
- dhtmlxscheduler.js
- dhtmlxscheduler.css (你也可以在 스킨(Skins) 中查看可用的皮肤)
<script src="../scheduler/dhtmlxscheduler.js"></script>
<link rel="stylesheet" href="../scheduler/dhtmlxscheduler.css" type="text/css">
以下是 dhtmlxScheduler 包结构的简要说明,帮助你找到这些文件:
- sources - 包含库的源代码文件。未压缩,便于阅读,主要用于调试。
请注意,Scheduler 库的 试用版 不包含 sources 文件夹。
- samples - 包含代码示例。
- codebase - 包含库的压缩代码文件。体积更小,适合生产环境使用。在你的项目中应使用该文件夹下的文件。
Scheduler 尺寸设置
Scheduler 会填满其容器元素的整个尺寸(上述示例中的 scheduler_here div),但不会自动扩大容器本身。 这意味着如果你没有为容器设置高度,或者高度为 0,scheduler 也会有 0 高度,从而不可见。
在我们的示例中,通常通过为 document body 和 scheduler 容器都 设置 100% 的宽高,使 scheduler 占满整个屏幕:
<style>
html, body{
margin:0px;
padding:0px;
height:100%;
overflow:hidden;
}
</style>
</head>
<body>
<div id="scheduler_here" class="dhx_cal_container">
如果 scheduler_here 元素被放置在一个默认尺寸设置的 div 内,可能会出现问题:
<style>
html, body{
margin:0px;
padding:0px;
height:100%;
overflow:hidden;
}
</style>
</head>
<body>
<div class="outer_container"> /*!*/
<div id="scheduler_here" class="dhx_cal_container">
在这种情况下,scheduler 无法正确显示,因为 "scheduler_here" 设置为其父元素 的 100%,但父元素没有定义高度。
如果你为 .dhx_cal_container 元素使用相对尺寸(百分比),请确保其父元素也设置了高度。否则计算出的高度可能为 0,scheduler 将无法显示。
另外,你也可以为主 scheduler div 使用不同的单位。以下示例无论外部元素样式如何,都能获得预期尺寸:
<div id="scheduler_here" class="dhx_cal_container">
或:
<div id="scheduler_here" class="dhx_cal_container">
Scheduler 自动调整大小
container_autoresize 扩展改变了 scheduler 默认的尺寸调整行为。通常情况下,dhtmlxScheduler 会根据其容器尺寸调整自身,并在固定容器大小内通过内部滚动条访问所有数据。
启用 container_autoresize 扩展后,Scheduler 会根据内容动态调整自身尺寸。这意味着 它会在高度和/或宽度上扩展,以显示所有事件和数据,无需内部滚动条。
这样可以确保所有内容都可见,无需在 scheduler 内部滚动,适用于需要完整展示 scheduler 内容的场景。
使用方法
要启用 container_autoresize 扩展,在 scheduler 设置中如下添加:
scheduler.plugins({
container_autoresize: true
});
Autoresizing the scheduler container
这个简单的设置即可启用 container_autoresize 功能,使 Scheduler 根据内容自动调整自身尺寸。
使用 container_autoresize 处理表头
当启用 container_autoresize 扩展时,Scheduler 会自动调整大小以适应其所有内容。这有时会导致 Scheduler 超出屏幕范围,从而在页面或外部容器上出现滚动条。
在这种模式下,滚动页面时,导航栏和时间表头也会一起移动,因此在向下滚动时它们不会保持可见。虽然这种行为通常没有问题,但在某些情况下,保持表头固定更加理想。可以通过额外的样式和脚本实现这一点。
要将表头固定,可以结合使用 CSS 的 sticky 定位和一些额外样式,例如:
<style>
.dhx_cal_container{
overflow: visible!important;
}
.dhx_cal_navline,
.dhx_cal_header {
position: sticky;
z-index: 10;
background:var(--dhx-scheduler-container-background);
}
.dhx_cal_navline{
z-index: 11;
top:0;
}
.dhx_cal_header{
/* top 坐标由 JS 分配 */
margin-left: -1px;
box-shadow: 0 1px 0px 0px var(--dhx-scheduler-base-colors-border);
}
</style>
此外,还需要一些 JavaScript 来为 sticky 时间刻度设置正确的 top 值,使其正好位于导航面板下方。
由于导航面板的高度可能因样式和内容不同而变化,因此应动态计算其高度,并将其作为 header 的 top 值应用,如下所示:
scheduler.attachEvent("onViewChange", function(){
const navBar = scheduler.$container.querySelector(".dhx_cal_navline");
const header = scheduler.$container.querySelector(".dhx_cal_header");
if(navBar && header){
header.style.top = `${navBar.offsetHeight}px`;
}
});
你可以在下面的代码片段中查看完整演示:
Related sample Container autoresize and sticky header
使 Scheduler 响应式
当通过 header 配置属性 初始化 Scheduler 时,可以选择适合客户端屏幕尺寸的表头布局。同时还会应用某些样式,使元素和字体能够很好地适配较小的屏幕。
更多信息请参阅专门的文章:Mobile Responsive Scheduler。