gpt4 book ai didi

javascript - 在 iPad 上使用 JS 进行图像缓存

转载 作者:搜寻专家 更新时间:2023-11-01 04:58:06 24 4
gpt4 key购买 nike

我正在开发一个用于 iPad 的纹理选择器。所以基本上只是一堆图像元素。为了避免图像重新加载和滞后,我在 JS 中缓存和重用 Image 对象。这样的

/**
* Asynchronous version of memoize for use with callback functions. Asserts
* that last argument is the callback.
*
* @param {Function} func
* @return {Function}
*/
util.memoize.async = function(func) {
var cache = {};
return function() {
var hash = JSON.stringify(arguments);
var args = Array.prototype.splice.call(arguments, 0);
var callback = args.pop();
if (hash in cache) {
return callback.apply(this, cache[hash]);
}
args.push(function() {
cache[hash] = Array.prototype.splice.call(arguments, 0);
callback.apply(this, cache[hash]);
});
return func.apply(this, args);
};
};

/**
* Creates new Image element and calls back with loaded image.
* @param {string} url
*/
io.GetImage = function(url, callback) {
var img = new Image();
img.onload = function() {
callback(img);
};
img.src = url;
};

picker.image_ = util.memoize.async(io.GetImage);

然后每当我需要图像时,我调用 picker.image_ 并获取缓存的图像。它在桌面、Chrome、Firefox、Safari 上完美运行,但在 iPad 上,我得到空(未加载)图像。这是为什么?我真的很喜欢这种方法,它的性能非常好。

当从 DOM 中删除图像数据时,看起来 Mobile Safari 会丢弃图像数据。可以吗?

更新:需要澄清的是,加载的数据是动态的,因此它不是 AppCache 的最佳用例。 .

更新*:没有完全令人满意的答案,这是我的解决方案。请注意,复制方法非常慢。

/**
* Creates new Image element and calls back with loaded image.
* @param {string} url
*/
var GetImage = function(url, callback) {
var img = new Image();
img.onload = function() {
callback(img);
};
img.src = url;
};

/**
* @param {number} num maximum number of stored images
*/
var ImagePool = function(num) {
this.limit_ = num;
this.canvases_ = {};
this.order_ = [];
};

/**
* Retrieve image from cache.
*
* @param {string} url URL of request image
* @param {function(HTMLCanvasElement)} callback
*/
ImagePool.prototype.get = function(url, callback) {
if (this.canvases_[url] !== undefined) {
callback(this.copy_(url));
} else {
if (this.limit_ && this.order_.length == this.limit_) {
delete this.canvases_[url];
this.order_.pop();
}
GetImage(realUrl, function(img) {
var c = document.createElement('canvas');
c.width = img.width;
c.height = img.height;
var ctx = c.getContext('2d');
ctx.drawImage(img, 0, 0);

this.canvases_[url] = c;
this.order_.unshift(url);
callback(this.copy_(url));
}.bind(this));
}
};

/**
* @param {string} url
* @return {HTMLCanvasElement}
* @private
*/
ImagePool.prototype.copy_ = function(url) {
var c = document.createElement('canvas'),
cached = this.canvases_[url];
c.width = cached.width;
c.height = cached.height;
var ctx = c.getContext('2d');
ctx.drawImage(cached, 0, 0);
return c;
};

最佳答案

我认为使用 HTML 5 离线应用程序缓存可以最好地解决您的问题。您列出您希望缓存的资源,在用户访问请求这些资源的页面后,它们将被缓存以备后用。你仍然需要让你的 UI 等到你的图像被加载,但是一旦它们被加载,你就不必担心它们被丢弃只是因为它们不在 DOM 中(This SO question 建议图像位于 DOM 中,但未显示在屏幕上,也被丢弃)。

显然,Safari Mobile 有 5MB 的缓存限制,可以通过请求用户同意扩展它来增加 (Source)。在 this blog post 中发表评论建议这个扩展提示在 iOS 4 上可用。

有用的链接:

关于javascript - 在 iPad 上使用 JS 进行图像缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10995683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com