所以我使用AJAX从每个页面加载内容并将其注入当前页面。一切都在Chrome,Firefox,Internet Explorer上运行得很好(尽管它可以哈哈),除了两个奇怪的部分外,内容在Safari上运行良好。
我将使用此页面作为参考: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加载时,它不能正确应用高度?
我将使用此页面作为参考:http://insight.insightcreative.info/work
如果你在Safari中打开页面,一切都应该显示得很好,但现在如果你单击工作链接使用AJAX加载重新加载页面,页面上的图像将不会显示为对象适合。
如果您检查页面,您将发现所有相同的CSS设置都应用于图像,包括对象适合属性,但由于某种原因,他们不再尊重其属性。而是图像伸展以填充容器。
如果页面是最初加载的页面(或硬刷新),为什么页面会正确呈现,但是当内容由AJAX加载时,它不再符合对象适应属性?< / p>
这两个问题似乎只在Safari中出现,而且我猜测它与Safari在通过AJAX加载时处理图像属性的方式有关。
有没有办法在通过AJAX加载页面后,我可以尝试强制Safari正确地重新应用这些设置?或者是否有编码神知道如何使用Safari处理这些问题?
我在加载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后,我发现这些图片在Safari上没有任何问题。所以我加载了Barba.js然后重写了我的所有JS,以便它能够正确地运行该PJAX库。所以我以前加载页面的方式导致了这个问题,但仅限于Safari。
下面是我在
之前加载AJAX时使用的代码片段//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;
}
});
答案 0 :(得分:0)
检查你的图像css
您可能假设应用于组件的css规则保持初始加载状态,但是如果您运行了一些javascript来管理这些规则,则可能必须在ajax完成加载后重新应用其中一些规则。有些浏览器可能会应用它们。我需要在网上找到这个帖子但是现在如果你可以查看上面的内容并且它没有解决你的问题,请告诉我这里。要隔离img问题,您可以创建一个包含单个图像的测试页面,并共享一个链接并尽可能多地从该页面中删除其他项目。也许只是基本的页眉和页脚来隔离其他问题。
答案 1 :(得分:0)
所以我设法解决了两个问题中较大的问题,即由于0高度而未显示的图像。出于某种原因,当通过AJAX Safari加载带srcset
的图像时,删除自动高度并使其为0px。
我编写了一个等待所有图像都加载的函数(因为否则naturalHeight
返回0)然后它将高度更改为保持原始图像的相同宽高比的高度。我也做了它,它只针对没有object-fit: cover
应用于它们的图像,因为这些是给我带来问题的图像,否则它会弄乱object-fit
图像。
function safariResize() {
console.log("Running safariResize");
// This variable starts at 1 because the logo (always on the page) is image 0
var loaded = 1;
$('img').on('load',function(){
loaded++;
images = $('img');
if (loaded == $('img').length){
for (var i = 1; i < images.length; i++){
if ($(images[i]).css("object-fit") != 'cover'){
var naturalH = images[i].naturalHeight;
var naturalW = images[i].naturalWidth;
var ratio = naturalH / naturalW;
var newRatio = (images[i].width / naturalW);
var newH = naturalH * newRatio;
$(images[i]).css("height", newH + "px");
}
}
}
});
}
然后我在if语句中加载AJAX之后调用此函数以确保它仅在Safari上触发
if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {
safariResize();
} else if (navigator.userAgent.indexOf('iPad') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {
safariResize();
}
我不相信我能够解决对象问题,这只发生在桌面版Safari上(在iPad上运行正常)。如果您找到一种更简单的方法来解决此问题,请告诉我,因为这是我修复的过程。
答案 2 :(得分:0)
我也遇到了问题1中概述的Safari错误,但我没有在Barba.js上重建我的应用程序,而是选择使用imagesLoaded脚本重写safariResize函数。这是我的功能,以防其他人发现它有用:
var safariResize = function() {
// Targetting collapsed images in pjax loading box (safari bug)
var imgLoad = imagesLoaded( $('.site-container > .site-inner img') );
imgLoad.on( 'progress', function( instance, image ) {
if(image.isLoaded && image.img.height == 0){
var naturalH = image.img.naturalHeight,
naturalW = image.img.naturalWidth;
if( image.img.parentElement.clientWidth < naturalW ){
var ratio = naturalH / naturalW;
naturalW = image.img.parentElement.clientWidth;
naturalH = naturalW * ratio;
}
image.img.setAttribute("style","width: "+naturalW+"px; height: "+naturalH+"px;");
}
});
};