如何解决 IE11 localStorage 事件在 iframe 中触发两次或根本不触发的问题?

2023-12-29

我猜这是一个错误,但我找不到任何关于此的讨论。

众所周知,IE10 将(违反规范)本地触发存储事件(即,在触发事件的同一全局执行上下文中),但 IE11 似乎更偏离规范(http://www.w3.org/TR/webstorage/ http://www.w3.org/TR/webstorage/) 当涉及同域 iframe 时:

  • 如果 iframe 嵌入到触发存储事件的页面中,则该事件将在该 iframe 内触发两次。
  • 如果 iframe 嵌入的页面与触发存储事件的页面不同,则该 iframe 内根本不会触发该事件。
  • 如果事件被触发来自 iframe,它将在本地触发两次,并在嵌入同一页面的任何其他 iframe 中触发两次,但在其他页面的 iframe 中根本不会触发。

您可以通过在两个单独的选项卡中打开以下链接来测试这一点:http://hansifer.com/main.html http://hansifer.com/main.html

有人对这种怪异现象有任何见解吗?

最后测试版本:浏览器 v11.0.9600.16476(更新 2016-08-13:显然是相关的“更新版本”,而不是 IE 的“关于”对话框中报告的“版本”)

错误报告链接: https://connect.microsoft.com/IE/feedback/details/811546/ie11-localstorage-events-fire-twice-or-not-at-all-in-iframes https://connect.microsoft.com/IE/feedback/details/811546/ie11-localstorage-events-fire-twice-or-not-at-all-in-iframes

更新2015-10-26

我刚刚注意到这个问题似乎在 v11.0.9600.18059 中得到了修复,尽管我无法判断该修复何时被删除,因为它似乎没有在任何最近的知识库中被引用。

不幸的是,IE11 localStorage 事件在其他方面仍然存在异常(尽管这些是与本文中提出的问题不同的问题):

  • IE 在调用触发该事件的 localStorage 设置或删除的窗口上下文中引发 localStorage 事件。 localStorage 事件只能在foreign同源的窗口上下文。 (更新:在 EdgeHTML 13.10586 中工作)

  • IE 使用空字符串代替null for e.oldValue/e.newValue添加/删除存储项目时。 (更新:EdgeHTML 13.10586 中仍然存在问题)

  • IE 在设置/删除生效之前或之后不确定地调用 localStorage 事件处理程序,而不是始终在之后。

更新2015-12-24

看来此错误已转移到 Edge(已测试 EdgeHTML 13.10586)

更新2016-02-02

韦尔普,没关系。在 IE v11.63.10586.0 中再次观察到此错误(更新 2016-08-13:显然是相关的“更新版本”,而不是 IE 的“关于”对话框中报告的“版本”)

更新2016-08-13

现在,这个问题似乎在 IE 中得到了修复(更新版本 11.0.34),尽管存储事件仍然在原始窗口中触发,这违反了规范(如上所述的一个已知的长期存在的问题)。

I found this KB https://support.microsoft.com/en-us/kb/3168674包括在IE 2016 年 6 月 14 日安全更新 https://support.microsoft.com/en-us/kb/3160005,尽管根据其描述,它只解决了上面的第二个项目符号。

至于 Edge(已测试 EdgeHTML 14.14393),似乎这个问题现在也已得到解决,但出现了一个新问题:存储事件不会跨同一页面的同源框架触发。

我单独向MS报告了here https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8486073/.


如果您想要限制某个事件被多次调用,无论调用原因如何,请使用标志来阻止后续事件。有几种策略:

.1.基于时间的节流。假设你有一个函数“func”,并且你希望它在 200 毫秒内仅被调用一次:

function func(){
  if (document.func_lock) return;
  document.func_lock=true; // block future calls
  setTimeout(function(){document.func_lock=null;},300);
}

当同时触发多个事件时,您可以预期所有事件都会在 300 毫秒的窗口内到达。上面的代码可以通过利用定时器句柄来简化:

function func(){
  if (document.func_lock) return;
  document.func_lock=setTimeout(function(){return;},300);
}

当定时器到期时,锁会自动解除。

.2.使用回调删除该标志。这个过程很简单,所以我不会在这里发布示例代码。

在标志放置方面,您可以使用任何唯一的 DOM 对象。由于我不知道您的应用程序的上下文,因此我在这里仅使用“文档”。您还可以使用特定于您的应用程序的哈希键,因为您已经在处理本地存储。概念是一样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决 IE11 localStorage 事件在 iframe 中触发两次或根本不触发的问题? 的相关文章

  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐