【发布时间】:2018-01-12 14:28:20
【问题描述】:
所以我使用 AJAX 从每个页面加载内容并将其注入当前页面。一切在 Chrome、Firefox、Internet Explorer 上运行良好(尽其所能,哈哈),并且内容在 Safari 上加载良好,除了两个奇怪的部分。
- 通过 AJAX 加载的图像高度为 0
- 通过 AJAX 加载的图像正在失去其适合对象的属性。
问题1:图片高度0
我将使用此页面作为参考:http://insight.insightcreative.info/about
如果您在 Safari 中打开页面,一切都应该显示得很好,但现在如果您单击“关于”链接以使用 AJAX 加载重新加载页面,页面上的图像将会中断。
我发现,当 AJAX 加载图像高度时,图像高度被设置为 0。
这是一个页面上的图像在被 AJAX 加载后损坏的示例
<img data-aos-anchor-placement="bottom-bottom" data-aos-offset="100" src="/img/agency/clients/affinity-medical-group.jpg" alt="Affinity"
srcset="
/img/agency/clients/affinity-medical-group-2400.jpg 2400w,
/img/agency/clients/affinity-medical-group-1800.jpg 1800w,
/img/agency/clients/affinity-medical-group-1200.jpg 1200w,
/img/agency/clients/affinity-medical-group-900.jpg 900w,
/img/agency/clients/affinity-medical-group-600.jpg 600w,
/img/agency/clients/affinity-medical-group-400.jpg 400w" />
如果页面是初始加载的页面(或硬刷新),为什么页面会正确呈现,但是当内容通过 AJAX 加载时,它没有正确应用高度?
问题 2:对象拟合不起作用
我将使用此页面作为参考:http://insight.insightcreative.info/work
如果您在 Safari 中打开页面,一切都应该显示得很好,但现在如果您单击工作链接以使用 AJAX 加载重新加载页面,页面上的图像将不会以对象匹配方式显示。
如果您检查页面,您会发现所有相同的 CSS 设置都应用于图像,包括 object-fit 属性,但由于某种原因,它们不再尊重它们的属性。相反,图像正在拉伸以填充容器。
如果页面是初始加载的页面(或硬刷新),为什么页面会正确呈现,但是当内容由 AJAX 加载时,它不再遵守 object-fit 属性?
这两个问题似乎只发生在 Safari 中,我猜这与 Safari 在通过 AJAX 加载时处理图像属性的方式有关。
在通过 AJAX 加载页面后,我是否可以尝试强制 Safari 正确重新应用这些设置?或者有没有编码大神知道如何用 Safari 处理这些问题?
编辑 1:
我编写了一个函数来在加载 AJAX 后更改我的页面的 CSS,以便它会重写我的图像的属性。我故意将object-fit 更改为fill,然后再改回cover,试图完全重置样式。
function checkImages() {
var images = $('img');
for (var i = 0; i <= images.length; i++){
var result = $(images[i]).css("object-fit");
if (result == 'cover'){
$(images[i]).css("object-fit","fill");
$(images[i]).css("object-fit","cover");
$(images[i]).css("display","block");
$(images[i]).css("position","relative");
$(images[i]).css("max-width","100%");
$(images[i]).css("max-height","100%");
}
}
}
我通过有意更改其中一些设置来确认此代码有效,以便它们会在浏览器中显着反映。我发现即使在页面加载完所有内容后更改设置,我似乎仍然无法解决问题(关于样式)。
但是,这确实使我尝试了其他方法。 通过从我的图像中完全删除 srcset 属性,即使加载 AJAX,它也会正确呈现。所以本质上,出于某种原因,通过使用srcset,它只允许页面在硬加载时正确显示,但如果通过 AJAX 加载则无法正确显示。我不确定这是否与 Safari 也只会加载它在 srcset 中看到的第一个图像并忽略其余图像这一事实相关,但 我认为问题在于 Safari 如何处理 srcset 。
解决方案:Barba.js
在没有深入细节的情况下,我设法解决了这个问题。在我使用自己编写的脚本加载每个页面的内容之前。在测试Barba.js 后,我发现图像在 Safari 上没有任何问题。所以我加载了 Barba.js,然后重写了我所有的 JS,以便它可以与那个 PJAX 库一起正常运行。所以不知何故,我之前加载页面的方式导致了这个问题,但仅限于 Safari。
下面是我之前用来加载 AJAX 的代码的 sn-p
//Function that loads in the new content
var load = function(url) {
//Fadeout leaving page transition
$('#content').velocity("fadeOut", {
visibility: 'visible',
display: 'block',
complete: function() {
//Load new content
$("#content").load(url + " #content");
}
});
};
//Action to perform on link click
$(document).on('click', 'a', function(e) {
//Sets variables to be used for url and page name
var $this = $(this),
url = $this.attr("href"),
title = $this.text();
loading = true;
//Makes entries into browser history
if (url.indexOf(document.domain) > -1 || url.indexOf(':') === -1) {
history.pushState({
url: url + '/',
title: title
}, title, url);
$('#container').mixItUp('destroy');
$('a').on('click.myDisable', function() {
return false;
});
load(url);
if (url === '/') {
document.title = "Insight Creative, Inc.";
} else {
document.title = title + " - Insight Creative, Inc.";
}
return false;
}
});
【问题讨论】:
-
我有这个完全相同的问题,并且一直在通过设置高度来解决它,类似于 Tyler 的回答。老实说,我认为这是一个非常糟糕的错误,应该引起 Safari 的注意。
标签: javascript html css ajax