Javascript iCal文件下载在IE中发送错误

Javascript iCal文件下载在IE中发送错误,javascript,jquery,internet-explorer,safari,aem,Javascript,Jquery,Internet Explorer,Safari,Aem,我能够把这个脚本放在一起,通过点击按钮生成ics日历文件,但它在IE或Safari中不起作用。有人能让这些ics文件下载在IE中工作吗?浏览器无法识别该文件 我在网上看到的每一个问题都有关于“添加标题”的不完整答案,不管这意味着什么,所以至少我想我已经推出了一个完整的html/js版本,可以在Chrome/Firefox中使用,包括完整的日期对象、iso8601转换等。这是在一个JSP文件中 <span class="start-date">01/13/2017</span&

我能够把这个脚本放在一起,通过点击按钮生成ics日历文件,但它在IE或Safari中不起作用。有人能让这些ics文件下载在IE中工作吗?浏览器无法识别该文件

我在网上看到的每一个问题都有关于“添加标题”的不完整答案,不管这意味着什么,所以至少我想我已经推出了一个完整的html/js版本,可以在Chrome/Firefox中使用,包括完整的日期对象、iso8601转换等。这是在一个JSP文件中

 <span class="start-date">01/13/2017</span>
 <span class="end-date">01/15/2017</span>
 <span class="start-time">1 PM</span>
 <span class="end-time">3 PM</span>
 <span class="event-title">NYC</span>
 <span class="event-location">NYC</span>

 <button class="createICS"> Add to Calendar </button>



<script>
var currentDateTime = iso8601Format(new Date().toISOString());
var startDateTime = iso8601Format(new Date($('.start-date').text() + " " + $('.start-time').text()).toISOString());
var endDateTime = iso8601Format(new Date($('.end-date').text() + " " + $('.end-time').text()).toISOString());
var eventLocation = $('.event-location').text();
var eventTitle = $('.event-title').text();
var icsMSG = "BEGIN:VCALENDAR\n" +
"VERSION:2.0\n" +
"PRODID:-//Our Company//NONSGML v1.0//EN\n" +
"BEGIN:VEVENT\n" +
"DTSTAMP:" + currentDateTime + "\n" +
"DTSTART:" + startDateTime + "\n" +
"DTEND:" + endDateTime + "\n" +
"LOCATION:" + eventLocation + "\n" +
"SUMMARY:" + eventTitle + "\n" +
"END:VEVENT\n" +
"END:VCALENDAR";
console.log(icsMSG);

$('.createICS').click(function(){
    window.open("data:text/calendar;charset=utf8," + encodeURIComponent(icsMSG));
});

function iso8601Format(dateTime) { // Converts date and time to the format we need: yyyyMMddThhmmssZ
    var dT = dateTime.replace(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{3})Z$/,'$1$2$3T$4$5$6Z');
    return dT;
}
</script>
2017年1月13日
01/15/2017
下午一时
下午三点
纽约市
纽约市
添加到日历
var currentDateTime=ISO8601格式(新日期().toISOString());
var startDateTime=ISO8601格式(新日期($('.start Date').text()+“”+$('.start time').text()).toISOString());
var endDateTime=ISO8601格式(新日期($('.end Date').text()+“”+$('.end time').text()).toISOString());
var eventLocation=$('.event-location').text();
var eventTitle=$('.event title').text();
var icsMSG=“开始:VCALENDAR\n”+
“版本:2.0\n”+
“PRODID:-//我们公司//非GML v1.0//EN\n”+
“开始:VEVENT\n”+
DTSTAMP:“+currentDateTime+”\n+
DTSTART:“+startDateTime+”\n+
DTEND:“+endDateTime+”\n+
位置:“+eventLocation+”\n+
摘要:“+eventTitle+”\n+
“结束:VEVENT\n”+
“结束:VCALENDAR”;
console.log(icsmg);
$('.createICS')。单击(函数(){
打开(“数据:文本/日历;字符集=utf8,”+encodeURIComponent(icsmg));
});
函数iso8601Format(dateTime){//将日期和时间转换为我们需要的格式:yyyymmddthhmmsz
var dT=dateTime.replace(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})。(\d{3})Z$/,“$1$2$3T$4$5$6Z”);
返回dT;
}

查看您的代码,您正在尝试使用Javascript函数生成iCal。这对于Chrome和Firefox等现代和更复杂的浏览器来说是可以的,但对于IE来说是行不通的

IE无法识别iCal文件,因为它不是使用内容格式可以检测到的文件之一

要使IE使用iCal文件,您需要添加以下响应头,这些响应头只能从服务器端完成:

content-type: text/calendar
content-disposition: attachment; filename=file.ics
虽然这是IE特有的,但它也可以与Safari一起使用,因为它的工作原理基本相同

JSP和Javascript

既然您提到了JSP,即使您在JSP中编写Javascript代码,它也不会在服务器端执行,而是在客户端执行。JSP只是呈现Javascript代码

AEM解决方案

您可能可以更改Java代码中的逻辑,并从JSP中呈现iCal文件(如果它正确地连接到响应流中)。或者,您可以编写一个servlet来返回此iCal文件。这是因为您需要添加响应头并完全控制响应体(iCal内容),以便正确呈现响应,这只能从服务器端完成(至少要修复IE和Safari问题)

更多信息


有关详细信息,请参见SO问题。

查看您的代码,您正在尝试使用Javascript函数生成iCal。这对于Chrome和Firefox等现代和更复杂的浏览器来说是可以的,但对于IE来说是行不通的

IE无法识别iCal文件,因为它不是使用内容格式可以检测到的文件之一

要使IE使用iCal文件,您需要添加以下响应头,这些响应头只能从服务器端完成:

content-type: text/calendar
content-disposition: attachment; filename=file.ics
虽然这是IE特有的,但它也可以与Safari一起使用,因为它的工作原理基本相同

JSP和Javascript

既然您提到了JSP,即使您在JSP中编写Javascript代码,它也不会在服务器端执行,而是在客户端执行。JSP只是呈现Javascript代码

AEM解决方案

您可能可以更改Java代码中的逻辑,并从JSP中呈现iCal文件(如果它正确地连接到响应流中)。或者,您可以编写一个servlet来返回此iCal文件。这是因为您需要添加响应头并完全控制响应体(iCal内容),以便正确呈现响应,这只能从服务器端完成(至少要修复IE和Safari问题)

更多信息


有关详细信息,请参见SO问题。

在返回iCal文件的servlet中,这是什么样子?我以前没有见过这些响应头,不知道如何使用它们。我可以找到关于它们的mozilla文档,但在java/JSP中实现时没有太大帮助。在返回iCal文件的servlet中,这看起来像什么?我以前没有见过这些响应头,不知道如何使用它们。我可以找到关于它们的mozilla文档,但它对用java/jsp实现没有太大帮助