即32kb的数据uri限制
ie 32kb limit to data uri
长话短说,我有一个图像作为字符串存储在数据库中。然后我在jcarousellite旋转木马中显示图像。当用户点击图像时,它会弹出在灯箱中。当图像显示在转盘中时,它会完美地渲染整个图像(图像在转盘中的大小要小得多)。当点击图像时,它只在IE中渲染图像的前10个像素。我知道IE和数据URI有32kb的限制。有没有办法绕过这一点,并能够正确显示图像?
如果您需要任何源代码,我非常乐意提供一些。
谢谢,ZS-
编辑
var oDataQuery = /*Query*/
var carouselul = $("#carousel-ul");
var parentBody = window.parent.document.getElementsByTagName("body")[0];
var outterDiv = document.createElement("div");
// Execute the OData query for the images
$.getJSON(oDataQuery, function (data) {
var results = data.d.results;
// Add the results to the carousel ul
for (var i = 0; i < results.length; i++) {
var noteId = results[i].AnnotationId;
var noteSubject = results[i].Subject;
var src = "data:" + results[i].MimeType + ";base64," + results[i].DocumentBody;
var li = document.createElement('li');
var ahref = document.createElement('a');
ahref.href = '#';
ahref.addEventListener('click', function () { return false; });
var img = document.createElement('img');
img.src = src;
img.width = '100';
img.height = '100';
img.style.border = '1px solid';
img.style.margin = '1px';
img.addEventListener('click', function() { $("#img" + noteId, window.parent.document).trigger('click'); });
ahref.appendChild(img);
li.appendChild(ahref);
carouselul.append(li);
var innerDiv = document.createElement("div");
innerDiv.id = "div" + noteId;
var img2 = "<a href='" + src + "' data-title='" + noteSubject + "' id='" + noteId + "' data-lightbox='images'><img id='img" + noteId + "' src='";
img2 += src;
img2 += "' width='100' height='100' style='border: 1px solid; margin: 1px; visibility: hidden' alt='";
img2 += noteSubject + "' /></a>";
innerDiv.innerHTML = img2;
outterDiv.appendChild(innerDiv);
tempID = "img" + noteId;
}
var oHead = window.parent.document.getElementsByTagName('head')[0];
var cssNode = document.createElement('link');
cssNode.type = 'text/css';
cssNode.rel = 'stylesheet';
cssNode.href = '/{635457923130000051}/WebResources/ta_lightbox';
oHead.appendChild(cssNode);
parentBody.appendChild(outterDiv);
// Wire-up jCarouselLite to the carousel div
$("#carousel").jCarouselLite({
btnNext: "#next",
btnPrev: "#prev",
circular: false
});
我知道代码看起来有点疯狂,但我正在iframe中渲染图像,然后它需要在iframe之外显示灯箱。(它都在同一台服务器上,所以我知道这一切都很好,只是图像只渲染前10个像素。
您可以将base64转换为字节并使用它们创建Blob,从中您可以生成对象URL(与数据URLRL的大小限制
(我重新考虑了你的一些代码,这是为了取代你的for
循环,我忽略了其余部分)
function makeDivTemplate() { // helper to simplify loop
var div = document.createElementById('div');
div.innerHTML = '<a href="" data-title="" data-lightbox="images"><img src="" width="100" height="100" style="border: 1px solid; margin: 1px; visibility: hidden" alt="">';
return div;
}
function makeLiTemplate() { // helper to simplify loop
var li = document.createElement('li'),
a = document.createElement('a'),
img = document.createElement('img');
a.href = '#';
img.width = '100';
img.height = '100';
img.style.border = '1px solid';
img.style.margin = '1px';
a.appendChild(img);
li.appendChild(a);
return li;
}
var results = data.d.results;
var innerDivTemplate = makeDivTemplate(); // cloneNode will be faster than fn
var liTemplate = makeLiTemplate();
// Add the results to the carousel ul
var i, div, e, li, id, subject, blob, src; // var in a loop gets hoisted anyway
for (i = 0; i < results.length; i++) {
id = results[i].AnnotationId;
subject = results[i].Subject;
blob = new Blob( // create Blob
[base64DecToArr(results[i].DocumentBody)], // base64 to bytes
{type: results[i].MimeType}
);
src = URL.createObjectURL(blob);
// <li> tree
li = liTemplate.cloneNode(true);
e = li; // <li>
e = e.firstChild; // <a>
e.addEventListener('click', function () { return false; });
e = e.firstChild; // <img>
e.setAttribute('src', src);
e.addEventListener('click', function() { $("#img" + id, window.parent.document).trigger('click'); });
carouselul.append(li);
// <div> tree
div = innerDivTemplate.cloneNode(true);
e = div; // <div>
e.setAttribute('id', 'div' + id);
e = e.firstChild; // <a>
e.setAttribute('src', src);
e.setAttribute('data-title', subject);
e.setAttribute('id', id);
e = e.firstChild; // <img>
e.setAttribute('src', src);
e.setAttribute('alt', subject);
e.setAttribute('id', 'img' + id);
outterDiv.appendChild(div);
}
blob = null;
还包括Base64上MDN页面的以下两个功能
function b64ToUint6 (nChr) {
return nChr > 64 && nChr < 91 ?
nChr - 65
: nChr > 96 && nChr < 123 ?
nChr - 71
: nChr > 47 && nChr < 58 ?
nChr + 4
: nChr === 43 ?
62
: nChr === 47 ?
63
:
0;
}
function base64DecToArr (sBase64, nBlocksSize) {
var
sB64Enc = sBase64.replace(/[^A-Za-z0-9'+'/]/g, ""), nInLen = sB64Enc.length,
nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen);
for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
nMod4 = nInIdx & 3;
nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
if (nMod4 === 3 || nInLen - nInIdx === 1) {
for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
}
nUint24 = 0;
}
}
return taBytes;
}
相关文章:
- FabricJs-限制主对象内添加对象的移动区域
- 限制javascript变量的最小/最大整数
- 如何在Edge中下载图像/png数据URI
- Jquery限制输入框中的文本
- 将鼠标旋转限制为特定的度数
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- d3.js:限制画笔的大小
- 基于数据元素限制动态表单字段
- WAMP响应内容长度限制
- 什么's导致了512字节的限制-openkeyval或其他什么
- 有没有办法限制Meteor-alded表格包中已发布的字段
- 将直流图表库中的折线图缩放限制为小时
- 如何在d3力有向图中最初限制节点数
- 在MSCRM 2015中使用javascript限制多实体查找
- IE8 中 data:uri 的 32KB 限制的任何解决方法
- 即32kb的数据uri限制
- 用于导出到CSV/Excel的数据URI(无服务器端请求):浏览器支持/限制
- 如何处理“访问受限制的URI被拒绝”;JavaScript在使用XMLHttpRequest时出现错误
- 拒绝访问受限制的URI.萤火虫
- 请求的uri太大请求的url长度超过了该服务器的容量限制