我正在尝试让retina.js 在我有CNAME 的子域的tumblr 上工作。
所以我有 blog.benwhitla.com 使用 CNAME 指向 benwhitla.tumblr.com,正如 tumblr 建议的那样。我想托管普通和@2x 静态内联图像,并使用retina.js 将视网膜图像自动显示在视网膜显示器上。要使retina.js 工作,图像必须与js 文件位于同一域或子域中。
在此处找到关于此的视网膜.js 讨论:https ://github.com/imulus/retinajs/issues/40
所以按照这个想法,我创建了一个子域:i.blog.benwhitla.com。因为看起来retina.js 应该能够在当前域的子域中抓取图像,所以我希望这可以工作。
在这里测试:http: //benwhitla.com/client/retina/
第一个图像在外部托管,并且不起作用 - 这是预期的。第二张图片与 html 和 js 位于相同的位置,并且工作正常。第三张图片托管在 i.blog.benwhitla.com 上,从技术上讲,它是 benwhitla.com 的子域,所以我预计视网膜图像会拉出,但事实并非如此。
也许两个子域对于retina.js 来说太多了,无法支持?
有任何想法吗?这两天我一直在用头撞墙。
我还尝试对所有内容(css、图像和 js)使用相对路径,例如:
//i.blog.benwhitla.com
但这没有任何区别。
谢谢您的帮助。
编辑: 开始使用retina.js的分叉版本,它应该实际上支持上面链接的github问题中的子域(我不能在stackoverflow中添加超过2个链接)。
但它会引发以下错误,即使我将 document.domain 定义为 benwhitla.com。
XMLHttpRequest cannot load http://i.blog.benwhitla.com/img/benwhitla@2x.png. Origin http://blog.benwhitla.com is not allowed by Access-Control-Allow-Origin.
编辑 不允许在这里回答我自己的问题,所以这就是我现在所处的位置,这不是一个好的修复,但它至少会提取图像:
好吧,我确定这是错误的方法,但是使用允许子目录的较新脚本,并将本节中的所有 FALSE 更改为 TRUE,它现在可以工作了。虽然现在可能不安全?
RetinaImagePath.prototype.check_2x_variant = function(callback) {
var http, that = this;
if (this.is_external()) {
return callback(true);
} else if (this.at_2x_path in RetinaImagePath.confirmed_paths) {
return callback(true);
} else {
http = new XMLHttpRequest;
http.open('HEAD', this.at_2x_path);
http.onreadystatechange = function() {
if (http.readyState != 4) {
return callback(true);
}
if (http.status >= 200 && http.status <= 399) {
if (config.check_mime_type) {
var type = http.getResponseHeader('Content-Type');
if (type == null || !type.match(/^image/i)) {
return callback(false);
}
}
RetinaImagePath.confirmed_paths.push(that.at_2x_path);
return callback(true);
} else {
return callback(true);
}
}
http.send();
}
此外,如果没有 @2x 图像,它现在会引发错误。