【问题标题】:Detect old Internet explorer Javascript functions ( < ES6)检测旧的 Internet Explorer Javascript 函数(< ES6)
【发布时间】:2021-12-24 14:48:11
【问题描述】:

是否有网络在线、库或其他东西可以检测与 Chrome/Firefox 或仅 ES6 不兼容的旧 IE 功能?

喜欢:document.all、event.returnValue 等

JsHint/Jslint 没有将它们检测为已弃用或不兼容

【问题讨论】:

  • 但是document.all 与 Firefox 和 Chrome 兼容。它是非标准的,但他们很久以前就实现了它以兼容 IE(与 .innerHTML 等相同)跨度>
  • 您在寻找caniuse.com吗?
  • @slebetman 就现代 Web 开发而言,它们仍应被视为已弃用。当然,出于兼容性原因,它们已包含在标准中并得到广泛支持,但仍不应使用它们。
  • 用chrome打开页面;有时,如果它警告您有关已弃用的功能、api 和可能是页面上使用的功能。
  • 只需在 Chrome 中打开它们,按 F12 并查看所有警告/错误。

标签: javascript backwards-compatibility jslint jshint web-standards


【解决方案1】:

说 JSLint 不会告诉您有关已弃用的属性的说法相当不公平。让我解释一下。

首先回想一下,JavaScript 是一种动态语言。您可以将任何属性分配给 [几乎] 任何对象。如果您愿意,只需说出window.all = "Muahahaha!!! I'm evil!!!",就可以在浏览器上下文中将all 分配给window。您可以将.all 添加到带有...的字符串中

var spam = "a string";
spam.all = "I'm still evil!!!"

或者,更糟糕的是,某些代码可能已经更改了您文件之外某处的String(或任何其他对象类型)的原型。在浏览器控制台中试试这个:

String.prototype.all = String.prototype.all || "This is beyond evil.";
// 'This is beyond evil.'
var spam = "spam"
// undefined
spam.all
// 'This is beyond evil.'

所以默认情况下,JSLint 不会按名称检查对象的属性。尤其是对于可能存在于文件上下文之外的对象(因为 JSLint 逐个文件地 lints),它根本无法知道对象的属性发生了什么并识别什么是有效的,什么是无效的。

(这就是TypeScript 的用途,顺便说一句。)

除非你告诉 JSLint 如何!! -- JSLint property 指令 ftw

或者您可以使用JSLint property directive,如果您愿意做一些工作,它正是您想要做的。

如果您将属性指令放在文件的顶部,JSLint 将为页面上不在该列表中的对象使用的任何属性显示错误。

例如,试试这个on the official JSLint.com page

/*property
    log
*/
/*jslint browser, devel */
function mySpam() {
    var spam = document.all;
    console.log(spam);
}

看看我如何使用document.allall 不在property 指令中?这对我来说会出错。

1. Unregistered property name 'all'.
    var spam = document.all;

您可能会说,“但我要永远从我正在 linting 到该指令中的 3000 行文件中获取所有 good 属性!”

不是这样!这里有一个提示:将您的文件(即使是未整理的)粘贴到 JSLint.com 中。它将在其报告中为您创建一个property 指令。

这是我在几秒钟内从AngularJS' [sic] route.js 制作的一个:

/*property
    $$minErr, $evalAsync, $get, angularVersion, caseInsensitiveMatch, create,
    defaultPrevented, eagerInstantiationEnabled, extend, info, isArray,
    isDefined, isObject, isUndefined, length, module, noop, originalPath,
    otherwise, preventDefault, provider, redirectTo, reload, reloadOnSearch,
    reloadOnUrl, routes, run, substr, when
*/

按字母顺序排列,偶数。

现在只需删除你不想要的那些并立即!你会抓住你需要的一切。

这有点乏味吗,是否需要对正确使用document 的文件进行一些按摩/培训?是的,但是,再一次,在动态语言中,这接近于您对逐个文件的 linter 所能期望的最好结果。

注意:如果这不能解决您的问题,无论多么不完美,那么我们需要查看您的更多文件并更准确地了解您在实践中要解决的问题。

【讨论】:

  • 感谢您的宝贵时间和完整的解释! (对不起我迟到的回复)。我会试试这个选项,我还没有时间,但如果我可以让它在一批文件上工作似乎很有希望
猜你喜欢
  • 2018-04-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2012-12-10
  • 1970-01-01
相关资源
最近更新 更多