问题
在浏览器中复制选项卡时,form
元素的当前值将被忽略。在Windows 11计算机上的最新版本的Chrome、Firefox和Edge中进行了测试。
示例代码及demo
var textarea = document.querySelector('textarea');
var p = document.querySelector('p');
var range = document.querySelector('input[type="range"]');
var output = document.querySelector('output');
var checkbox = document.querySelector('input[type="checkbox"]');
var span = document.querySelector('span');
var theme = document.querySelector('select');
function write() {
p.textContent = textarea.value;
output.value = range.value;
span.textContent = checkbox.checked;
document.body.className = theme.value;
}
textarea.addEventListener('input', write);
range.addEventListener('input', write);
checkbox.addEventListener('change', write);
theme.addEventListener('change', write);
write();
body {
display: grid;
grid-template-columns: repeat(2, max-content);
gap: 1em 0.5em;
}
body.Dark {
color: white;
background: black;
}
<textarea>Hello, world!</textarea>
<p></p>
<input type="range">
<output></output>
<input type="checkbox">
<span></span>
<select>
<option>Light</option>
<option>Dark</option>
</select>
问题重现步骤
1.打开demo page或创建自己的。
1.更改textarea
、input
s和select
默认值。
1.复制选项卡。
p
、output
和span
元素没有显示预期的文本内容,主题仍然很轻。
提问
1.为什么会这样呢?
1.解决办法是什么?
7条答案
按热度按时间cld4siwp1#
1.为什么会这样呢?
因为浏览器选项卡中的表单不存储当前值。
1.解决办法是什么?
两个解决方案解决这个问题:
1.查询参数的使用
Query params将当前值存储为URL Search Params,因此当通过
new URL(document.location).searchParams
复制浏览器选项卡时,可以访问它以重新填充数据。产品编号:https://playcode.io/queryparams
演示:https://queryparams.playcode.io
2.使用会话存储
会话存储器将当前值存储为session data,以便在通过
.getItem
方法复制浏览器选项卡时可以访问它以重新填充数据。产品编号:https://playcode.io/sessionstorage
演示:https://sessionstorage.playcode.io
aemubtdh2#
我观察到,如果复选框/单选按钮的
value
被覆盖,复选框和单选按钮的复制工作可靠。在下面的示例中,复选框和文本字段沿着它们的文本表示都正确复制。主题也是重复的。
8hhllhi23#
tpgth1q74#
当浏览器复制标签时,它不会触发textarea/range/checkbox的change事件。之后,复制选项卡,当dom被加载时,它将设置它的值。因此,您需要为
write
函数提供一些延迟,以便浏览器完成设置元素的内容,然后我们的write函数将获得元素的正确值。代码更新如下:
但Chrome没有复制复制选项卡中复选框的状态。
要检测标签是否在Chrome/Firefox/IE(Chromium)上重复或不重复,您可以使用以下JS:
s4chpxco5#
我在Firefox和Brave(基于Chromium)上测试了您提供的步骤,它们在标签复制上的行为都不同。
'change'
在<select>
上侦听'input'
时才有效。原因是'change'
仅在用户主动选择值时才会触发,而在复制过程中不会发生这种情况。)这种行为上的差异很好地表明了“标签复制”不是标准化的,而是每个浏览器供应商以其最佳方式实现的功能。每个浏览器都可以决定原始选项卡的状态有多少被复制,这可能会对用户体验,性能甚至安全性产生影响,正如我的测试所示,不同浏览器之间的复制程度可能会有很大差异。
因此,正如你所看到的,一个不能依赖于完美的复制或一致性在不同的浏览器之间。这意味着您需要某种持久性,以确保表单中的值在重复的选项卡中得到保存和重用。
正如其他人已经提到的,您可以使用sessionStorage或localStorage进行测试,或者将值保存在某种数据库中,作为更健壮的解决方案。
wz3gfoph6#
复制选项卡时,输入字段的值会被保存,但
:checked
属性除外。作为一个选项,您可以将
:checked
prop 保存在sessionStorage
中。为了测试,我创建了一个小的example。
我把剧本分成三部分:
1.保存和恢复
:checked
1.初始显示输入值
1.输入更改后显示值
我在这里添加所有代码:
ct3nt3jp7#
write()
必须在初始站点加载时被调用。这个应该能用