我一直在制作一个网页,该网页会接收特定YouTube频道即将推出的直播活动并将其格式化为日历,您可以在其中点击每个视频的链接以嵌入播放器。在Firefox和Chrome中它运行得很好,但IE甚至无法使用XMLHttpRequest
从YouTube获取XML。它给了我错误SEC7118,并告诉我一些关于要求CORS的事情。
有什么想法吗?
修改
事实证明,MS凭借其辉煌的思维过程,认为XMLHttpRequest()
对于CORS来说不够好,所以他们决定创建XDomainRequest()
,然后使用它直到IE11,他们最终开始支持XMLHttpRequest()
的CORS(意味着他们在响应头中确认了Access-Control-Allow-Origin
)。
不幸的是,就我此时的测试而言,XDomainRequest()
,在我目前的实现中,只适用于IE9和IE10,并且需要一些麻烦来使它成为XML DOM对象的可用状态。我怀疑它在IE8中不起作用,因为我是从file://
(本地测试页)而不是http://
测试的,这是API使用的。
我现在的代码是(简化):
function XMLCorsRequest(url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
// Browsers with standard CORS support in XMLHttpRequest(), e.g. Chrome, Safari, Firefox, IE 11
var xhr = new XMLHttpRequest();
xhr.onload = function(){
populateSchedule(xhr.responseXML);
};
xhr.open("GET",url,true);
}
else if (typeof XDomainRequest != "undefined"){
// IE v <= 10
xhr = new XDomainRequest();
xhr.onload = function(){
XDRParse(xhr.responseText);
};
xhr.open("GET",url);
} else {
// No CORS support at all
return null;
}
xhr.send();
}
function XDRParse(rawXmlAsText) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(rawXmlAsText);
populateSchedule(xmlDoc);
}
加载请求后调用函数populateSchedule()
,并创建XML DOM对象。它所做的只是获取即将发布的直播活动条目标签,然后对它们进行排序,创建一个包含视频ID(YouTube视频的v
参数),开始时间,描述和状态的多维数组,以便它可以创建一个显示所有细节的表格。
我还注意到IE有几个问题:
它无法获取XML DOM对象节点的innerText
值,因此它需要textContent
才能在所有浏览器中工作(我已经测试过)。
正则表达式至少在时间上不起作用。将YouTube事件的开始日期(以UTC表示为日期和时间)转换为普通的Date对象后,我使用它来调用它toLocaleString()
。然后我试图切掉表示秒数的最后:00
(我不需要它们)。通常,匹配它的表达式应该只是/:\d\d(?=\s)/
(没有替换);但因为IE是IE,它以某种方式使用“零”而不是0但是以某种方式“数字”,在每个实际字符之间创建未知字符,我无法检查后续字符,因此表达式变为{{1 (我只是用空格替换了它。)
Firefox也做了一些奇怪的事情。使用/:[^\d]*\d[^\d]*\d[^\s\d:]*\s/
时,不是以toLocaleString()
方式声明日期,而是返回一周中的整天,月份,月份后面的逗号,然后是年份,然后是时间好像是正常的(例如2014年3月27日星期四上午10点)。
这些不是我需要帮助的东西,但我认为有人在这可能会使用我的发现。