Javascript 我可以通过XDomainRequest正确读取二进制数据吗?
编辑: 考虑到dennmat的建议,我使用Javascript 我可以通过XDomainRequest正确读取二进制数据吗?,javascript,cors,internet-explorer-9,xdomainrequest,xdr,Javascript,Cors,Internet Explorer 9,Xdomainrequest,Xdr,编辑: 考虑到dennmat的建议,我使用image(),将图像获取脚本简化为几行: 虽然这适用于Chrome和Firefox,但并不适用于IE9。下面链接中提到的解决方案似乎不适用于这种情况 IE9是否支持Image()中的cors功能 我遇到了一个小问题 上面的图像实际上是一个包含标准png头的文件,后面是255个字节,从255到0(两次)。这个想法是为了了解InternetExplorer9如何通过AJAX请求处理二进制数据的接收 所以,我的问题是:我注意到当我在客户端上收到大于127
image()
,将图像获取脚本简化为几行:
虽然这适用于Chrome和Firefox,但并不适用于IE9。下面链接中提到的解决方案似乎不适用于这种情况
IE9是否支持Image()
中的cors功能
我遇到了一个小问题 上面的图像实际上是一个包含标准png头的文件,后面是255个字节,从255到0(两次)。这个想法是为了了解InternetExplorer9如何通过AJAX请求处理二进制数据的接收 所以,我的问题是:我注意到当我在客户端上收到大于127的字节时,该值默认为253。有没有办法让IE读取具有正确值的扩展字节 需要注意的几件事: 1) 我们不使用任何类型的javascript框架。这是一项要求,我们只需要使用基本的javascript就可以做到这一点 2) 这个实验的目的是为了制作一个干净的方法来获得一个图像,这样我就可以把它放在画布上而不会污染它。有时这些映像来自外部托管的映像服务器,有时则来自我们无法控制的另一个主机 以下是我的测试脚本:
var request;
window.onload = function(){
request = new XMLHttpRequest();
if (window.XDomainRequest) {
request = new XDomainRequest();
}
request.open('GET',
"http://www.shangalulu.com/get_resource_no_64.php?url=
http://www.shangalulu.com/resources/images/sample/sample.png", true);
request.onload = function()
{
var binary, i, response;
response = this.responseText;
binary = "";
if (this.contentType)
{
document.documentElement.appendChild(
document.createTextNode(this.contentType));
document.documentElement.appendChild(document.createElement('br'));
}
for( i=0; i < response.length; i++) {
binary = "Line " + (i) + " --> " + ((response.charCodeAt(i)) & 0xff);
document.documentElement.appendChild(document.createTextNode(binary));
document.documentElement.appendChild(document.createElement('br'));
}
};
request.send();
}
var请求;
window.onload=函数(){
请求=新的XMLHttpRequest();
if(window.XDomainRequest){
请求=新的XDomainRequest();
}
request.open('GET',
"http://www.shangalulu.com/get_resource_no_64.php?url=
http://www.shangalulu.com/resources/images/sample/sample.png“,对);
request.onload=函数()
{
var二进制,i,响应;
response=this.responseText;
二进制=”;
if(this.contentType)
{
document.documentElement.appendChild(
document.createTextNode(this.contentType));
document.documentElement.appendChild(document.createElement('br'));
}
对于(i=0;i”+((response.charCodeAt(i))&0xff);
document.documentElement.appendChild(document.createTextNode(二进制));
document.documentElement.appendChild(document.createElement('br'));
}
};
request.send();
}
不幸的是,使用crossOrigin属性设置为“Anonymous”的Image()对象仍然会导致IE在将图像绘制到画布上时污染画布
为了解决这个问题,我做了以下工作:
input=Base64.\u utf8\u encode(输入)
在encode
函数中,因为数据是二进制的,而不是实际的字符串这是我目前能想到的最好的了。如果其他人有更好的方法完成这项工作,请随时发布您的答案。Image()有什么问题。?请参阅示例:在不使用浏览器内置实用程序的情况下,试图在JS中操作、管理和绘制图像数据,实际上是自讨苦吃。这将非常缓慢,您可能会遇到无数问题,尤其是当您进入透明度和旋转时。上次查看Image()时,我一定错过了交叉原点支持。谢谢你的提示!至于让我大吃一惊,我不完全确定你所说的浏览器内置实用程序是什么意思。这里我只想在画布上渲染一个简单的图像,然后发送到服务器。啊,是的,现在我想起来了。Image()的问题在于,当我第一次开始使用这个脚本时,浏览器中缺少cors支持。当时,唯一有效的解决办法似乎是一种邪恶的黑魔法。这涉及到从ajax请求中的responseText字段获取二进制数据。
var request;
window.onload = function(){
request = new XMLHttpRequest();
if (window.XDomainRequest) {
request = new XDomainRequest();
}
request.open('GET',
"http://www.shangalulu.com/get_resource_no_64.php?url=
http://www.shangalulu.com/resources/images/sample/sample.png", true);
request.onload = function()
{
var binary, i, response;
response = this.responseText;
binary = "";
if (this.contentType)
{
document.documentElement.appendChild(
document.createTextNode(this.contentType));
document.documentElement.appendChild(document.createElement('br'));
}
for( i=0; i < response.length; i++) {
binary = "Line " + (i) + " --> " + ((response.charCodeAt(i)) & 0xff);
document.documentElement.appendChild(document.createTextNode(binary));
document.documentElement.appendChild(document.createElement('br'));
}
};
request.send();
}