【发布时间】:2017-09-18 12:42:14
【问题描述】:
我正在编写一个 Ember.js Web 应用程序,它被设计为自动化系统的用户界面,它每两秒从 LAN 服务器轮询一次数据,以便始终显示“实时”过程数据。 此应用程序可从无线热点访问,以允许注册用户浏览它,因此任何设备(平板电脑、智能手机、笔记本电脑...)都可能成为实际客户端。
在某些页面上,有一些图标会根据某些条件发生变化,为了实现这种效果,我声明了几个img 标签,并通过 CSS display: none 对其进行样式设置使我不需要的标签不可见。
在 HTML 中:
<img class="icon-active" src="/images/icon1.jpg" />
<img class="icon-inactive" src="/images/icon2.jpg" />
在 Javascript 中,每两秒一次:
var visibleElement = null;
var invisibleElement = null;
if( this.get("whatever").active == true )
{
visibleElement = this.element.getElementsByClassName("icon-active")[0];
invisibleElement = this.element.getElementsByClassName("icon-inactive")[0];
}
else
{
visibleElement = this.element.getElementsByClassName("icon-inactive")[0];
invisibleElement = this.element.getElementsByClassName("icon-active")[0];
}
visibleElement.style.display = null;
invisibleElement.style.display = "none";
在笔记本电脑和平板电脑上一切正常,但在某些智能手机上,每次我设置 visibleElement.style.display = null; 时都会加载图像,这意味着每隔两秒,可见图标就会一次又一次地从服务器获取。
一开始我不希望它发生以减少数据流量,这根本不是问题,但我不喜欢即使不需要也获取资源,其次,图像重新加载会产生烦人的闪烁效果,即真的不好看。
如何强制每个客户端都像平板电脑和笔记本电脑一样缓存图像?
----- 更多信息 -----
感谢大家的支持!这里有一些消息:
我尝试按照建议注释掉所有在 style.display 上工作的 JavaScript 代码,并按如下方式修改 HTML(模板):
{{#if whatever.active}}
<img class="icon-active" src="/images/icon1.jpg" />
{{else}}
<img class="icon-inactive" src="/images/icon2.jpg" />
{{/if}}
我得到了同样的结果。因此,我尝试回滚 HTML 并保留 javascript 注释,这样我应该始终使所有图标可见,并且令人惊讶……它们都在闪烁并每两秒被请求一次……
我猜这个问题是由于一些(可能不是最新的?)智能手机浏览器在更新 ember-views 绑定数据时完全重绘图像。我将进一步调查哪个浏览器/版本存在此问题,并确保所有测试设备都使用其浏览器的最新版本 - 因为 ember 使用最新的 javascript 功能,更好地切出老式客户端。
以下是每两秒刷新一次数据的代码,如有异常请告知:
import Ember from 'ember';
export default Ember.Route.extend({
model() {
// record generation code here...
},
afterModel()
{
Ember.run.later(this, function()
{
this.refresh();
}
, 2000);
}
});
-----解决方案-----
没有发生新的最新浏览器,因此,这种行为仅存在于“过去”......为了完整起见,我应该找到一种解决方案,使其在“旧”浏览器上也能正常工作,但我没有时间花在这上面。
如果你们中的任何人想出一个 360 度的解决方案,我们仍然很感激。
【问题讨论】:
-
您是否尝试过使用显示块/内联块/内联而不是空?如果失败了,那么您可以尝试添加删除类以显示/隐藏图像 - 我从来没有见过在更改显示属性时重新下载的图像,只有在更改 src 时
-
@Pete 是对的。如果您仅在将
img从 DOM 中删除时设置display: none;,则不会重新下载图像。 -
在使用 android 和 iPhone 打开页面时,服务器也会在每次闪烁时记录对图像资源的 GET 请求。
-
@Pete 我只是尝试将
更改为 "display: inline" 但每次重写样式显示字段值时仍然闪烁并获取图像,但我重复一遍,这只会发生在某些智能手机上,“那个操作系统”的“那个浏览器”是否可能只是以“奇怪”的方式表现?如果是这样,我也许应该考虑一种完全不同的方法。 -
您是否尝试过不使用 CSS 而是使用 ember
{{#if}}?这至少可以将您需要的一切都保留在 DOM 之外。接下来,检查图像上的缓存标头,并在您未处于开发者模式时验证是否会发生这种情况。接下来您是否要每 5 秒更改一次图像?因为如果不是这样,除非您这样做,否则 ember 不会改变任何东西。
标签: javascript html css caching ember.js