检测旧的 Internet Explorer Javascript 函数(< ES6)

Detect old Internet explorer Javascript functions ( < ES6)

提问人:spunka 提问时间:11/12/2021 最后编辑:Bergispunka 更新时间:11/12/2021 访问量:232

问:

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

比如:document.all、event.returnValue 等

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

JavaScript 向后兼容 jslint jshint Web 标准

评论

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

答:

1赞 ruffin 11/12/2021 #1

说 JSLint 不会告诉你弃用的属性是不公平的。让我解释一下。

首先回想一下,JavaScript 是一种动态语言。您可以将任何属性分配给 [几乎] 任何对象。如果您愿意,可以在浏览器上下文中分配 。您可以使用以下命令添加到字符串中...allwindowwindow.all = "Muahahaha!!! I'm evil!!!".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 逐个文件进行 lint 检查),它根本无法知道对象的属性发生了什么,也无法识别哪些是有效的,哪些是无效的。

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

除非你告诉 JSLint 怎么做!!-- JSLint 指令 ftwproperty

或者,如果您愿意做一些工作,则可以使用 JSLint 属性指令,该指令完全可以执行您想要的操作。

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

例如,在官方 JSLint.com 页面上尝试以下操作:

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

看看我如何使用但不在指令中?这对我来说会是错误的。document.allallproperty

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

你可能会说,“但是我需要很长时间才能从我的 3000 行文件中获取所有好的属性,我正在进入该指令!

并非如此!这里有一个提示:将您的文件(即使是未打印的文件)粘贴到 JSLint.com 中。它将在其报告中为您创建一个指令。property

这是我用AngularJS的[原文如此]路由.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
*/

按字母顺序排列,甚至。

现在只需删除您不想要的那些并 presto!您将获得所需的一切。

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

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

评论

0赞 spunka 11/16/2021
感谢您抽出宝贵时间并完成解释!(对不起,我的回复晚了)。我会尝试这个选项,我还没有时间,但如果我能让它在一批文件上工作,这似乎很有希望