【问题标题】:How to avoid function overrides in dart html (dart web)?如何避免 dart html(dart web)中的函数覆盖?
【发布时间】:2021-04-28 12:28:54
【问题描述】:

假设我在 dart 代码中调用 window.alert('my message')。但是,如果(正是我的情况)有一个脚本确实覆盖了 alert 函数 before 我的脚本。现在,如果我尝试调用 window.alert('message') 它会执行覆盖的 alert 函数而不是初始函数。

是否有机制确保所有函数不会以所述方式被覆盖?或者我是否应该始终确保 dart 脚本是第一个在页面上执行的脚本,以确保没有完成不需要的覆盖并且行为稳定并且这是唯一的方法?

Here 是基本的 github 存储库,如果您想实时查看问题。

编辑 1:

main.dart

import 'dart:html';

void main() {
  window.alert('alert');
}

index.html

<html>
<head>
    <title>test</title>
    <script>
        alert = (variable) => confirm("hehe it's jinxed");
    </script>
    <script defer src="main.dart.js"></script>
</head>
</html>

【问题讨论】:

  • 如果需要该代码(在这种情况下)回答你的问题。

标签: javascript dart dart-html


【解决方案1】:

这听起来不太可能

如果某些东西“覆盖”了 JavaScript alert 函数,它实际上会覆盖 window 对象的 alert 属性。此时旧值完全丢失,甚至无法(轻易)检测到这种情况已经发生。

如果您的代码没有在网络浏览器中首先运行,您将无法保护自己免受这种情况的影响。如果您的代码确实首先运行,您可以使用Object.freeze 或类似功能来锁定原始属性,或将它们复制到您自己的变量中。如果您的代码只是稍后直接使用window.alert,那么简单地首先运行并不能保证。您必须努力防止以后的代码也覆盖它。

这确实是一个 JavaScript 问题,dart:html 或 Dart 编译的代码没有什么特别之处,它会影响任何不首先在浏览器中运行的 JavaScript 代码。

【讨论】:

  • 我觉得这根本不可能,因为至少有一个技巧可以创建 iframe 并从中获取函数值:stackoverflow.com/questions/8580431/…
  • 这是一个不错的技巧。正如该线程中提到的,它不是一个完全安全的替换,因为它指的是 iframe 中的原型,而不是当前帧。它很可能不适用于 DOM 方法。对于某些功能,它肯定会起作用……或者,好吧,我们在这里进入"Reflections on Trusting Trust" 领域,所以“某人”也可能已经替换了document.createElement 函数来拦截iframe 创建然后摆弄这些函数也创建了iframe
猜你喜欢
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2022-01-22
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多