我试图在用户单击按钮时创建一个
.ics
文件。
到目前为止我拥有的代码是
msgData1 = $('.start-time').text();
msgData2 = $('.end-time').text();
msgData3 = $('.Location').text();
var icsMSG = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Our Company//NONSGML v1.0//EN\nBEGIN:VEVENT\nUID:[email protected]\nDTSTAMP:20120315T170000Z\nATTENDEE;CN=My Self ;RSVP=TRUE:MAILTO:[email protected]\nORGANIZER;CN=Me:MAILTO::[email protected]\nDTSTART:" + msgData1 +"\nDTEND:" + msgData2 +"\nLOCATION:" + msgData3 + "\nSUMMARY:Our Meeting Office\nEND:VEVENT\nEND:VCALENDAR";
$('.button').click(function(){
window.open( "data:text/calendar;charset=utf8," + escape(icsMSG));
});
这会下载一个
.ics
文件,但是当我尝试在 iCal 中打开它时,我被告知它无法读取该文件。
我使用了 InsanelyADHD 提到的 ics.js 解决方案。
该解决方案的一个问题是 Chrome 无法正确检测文件类型,并尝试使用编辑器以文本形式打开文件。
我更改了下载功能,只需使用以下命令即可打开文本:
window.open( "data:text/calendar;charset=utf8," + escape(calendar));
我在 Github 上的分支是 icsFormatter.js
关于许可证:我已联系原作者以包含 GPL - 之后我也会包含一个。
有一个开源项目:
它是 100% JavaScript,适用于除 IE 9 及更低版本之外的所有现代浏览器。
如果您对他们如何使文件正常工作感兴趣,您可以检查他们的来源。 他们使用以下库来执行繁重的工作:
组织者地址有两个冒号:“MAILTO::[电子邮件受保护]”
如果这不能解决问题,您必须向我们展示 iCal 收到的完整的 ical 流。
最后,假设 start_time 和 end_time 使用正确的格式,对于位置字段,您可能需要换行(https://www.rfc-editor.org/rfc/rfc5545#section-3.1)和转义某些字符(https://www.rfc-editor.org/rfc/rfc5545#section-3.3.11)。换句话说,您可能想查看 iCalendar 库。
ics.js 对我不起作用,因为我是从数据库异步加载数据的。然后我切换到 ical.js 并结合 ics.js 中的 saveAs 函数,它起作用了。如果这里有人遇到同样的问题,请随时给我发短信,我会提供一个例子
我使用了 smartbart24 提到的 icsFormatter。但我需要支持 IE 版本 7,所以我不得不稍微调整一下。
要使用 icsGen(我的 icsFormatter 分支),您必须在网络服务器上安装 php 4 或 5。
这是 Codepen 上的一个很好的例子。 基本上这个功能:
function convertDate(date) {
var event = new Date(date).toISOString();
event = event.split("T")[0];
event = event.split("-");
event = event.join("");
return event;
}
function makeIcsFile(date, summary, description) {
var test =
"BEGIN:VCALENDAR\n" +
"CALSCALE:GREGORIAN\n" +
"METHOD:PUBLISH\n" +
"PRODID:-//Test Cal//EN\n" +
"VERSION:2.0\n" +
"BEGIN:VEVENT\n" +
"UID:test-1\n" +
"DTSTART;VALUE=DATE:" +
convertDate(date.start) +
"\n" +
"DTEND;VALUE=DATE:" +
convertDate(date.end) +
"\n" +
"SUMMARY:" +
summary +
"\n" +
"DESCRIPTION:" +
description +
"\n" +
"END:VEVENT\n" +
"END:VCALENDAR";
var data = new File([test], { type: "text/plain" });
// If we are replacing a previously generated file we need to
// manually revoke the object URL to avoid memory leaks.
if (icsFile !== null) {
window.URL.revokeObjectURL(icsFile);
}
icsFile = window.URL.createObjectURL(data);
return icsFile;
}