javascript - 如果 img src 的值被 JS 单击事件更改,为什么当使用后退按钮重新访问包含它的页面时,该值不开始为空?
问题描述
当我使用 JS 首先从浏览器中添加然后删除图像时,我预计当我离开页面然后使用返回按钮返回时屏幕会呈现清晰。但是,当我返回时,图像再次出现在屏幕上。尽管屏幕设置为清晰,即<img src="">
在我离开之前,我使用Delete Image
按钮删除了我添加的图像,但还是发生了这种情况。由于某种原因,图像又出现了。
如何重新创建此行为:
- 打开第 1 页
- 从您的系统中选择一个图像文件
- JavaScript 将为
<img src="">
您的图像设置值并显示它 - 单击
Delete Image
按钮,图像将被删除 - 点击
Link To Page Two
按钮 - 使用浏览器上的后退按钮,当您返回时,图像将再次出现在屏幕上
- 如果您使用屏幕返回而不是返回按钮,
Link To Page One
则在没有图像的情况下重新开始
page-one.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>Page One</h1>
<p><a href="page-two.html">link to Page Two</a></p>
<p><img src="" id="theImage"></p>
<p><input type="file" name="imageFile" accept=".gif,.jpg,.png" id="inputImageFile"></p>
<button id="theButton">Delete Image</button>
<script>
let theImage = document.querySelector('#theImage');
let inputImageFile = document.querySelector('#inputImageFile');
let theButton = document.querySelector('#theButton');
inputImageFile.addEventListener('input', imageUpload);
theButton.addEventListener('click', deleteImage);
function imageUpload(e) {
let uploadedFile = e.target.files[0];
let forViewing = new Image();
forViewing.src = URL.createObjectURL(uploadedFile);
theImage.src = forViewing.src;
}
function deleteImage() {
theImage.src = '';
}
</script>
</body>
</html>
page-two.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>Page Two</h1>
<p><a href="page-one.html">link to Page One</a></p>
</body>
</html>
解决方案
最可能的解释是浏览器会记住上次成功加载的内容 - 当您将源更改为空字符串时,浏览器“没有”要缓存,因此特定浏览器(或所有浏览器)的引擎有可能离开缓存不变 - 尝试在你的 deleteImage 函数中将源更改为类似“像素图像”的东西,如下所示:
theImage.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGNiYAAAAAkAAxkR2eQAAAAASUVORK5CYII=';
它将加载一个透明的 1x1px png 并可能替换缓存的图像。...或使用服务器上的缓存控制标头 - 告诉浏览器不要缓存。
第二个想法
在您的删除功能中添加以下行:
inputImageFile.value = '';
它现在可以工作了;)
看起来输入起了作用——值被缓存了——当浏览器从缓存中设置值时——我猜“输入”事件会触发——你的脚本会显示图像;)
推荐阅读
- python - 在方法内并行化 for 循环
- typescript - 从值中获取枚举实例
- react-native - 反应导航问题,它不能按我的意愿工作
- c# - 无法将类型“bool”隐式转换为“int”
- python-3.x - 尝试使用字段名的烧瓶变量更新 mongodb 时出错
- databricks - 数据块中的行级安全性 (RLS)
- mysql - mysql?Plesk Ec2 aws 错误 100% full xvda1
- javascript - 选择具有两个数组选项的对象应该选择什么值
- forms - 客户端验证和客户端表单验证
- python - 如何使用 Python Selenium 将任何网页翻译成英文并保存其完整的网页截图?