这个 JavaScript Api 已被废弃!请慎用!
ztj100 2025-08-03 09:33 2 浏览 0 评论
在开发过程中,我们可能会不自觉地使用一些已经被标记为废弃的 JavaScript API。这些 API 由于存在兼容性问题、安全风险或有更好的替代方案,已经被现代浏览器和标准所淘汰。
为了确保代码的兼容性、安全性和可维护性,我们需要尽快排查并替换这些废弃的 API。
以下是六个常见的废弃 API 及其替代方法,希望能帮助你快速更新代码。
String.prototype.substr()
String.prototype.substr() 方法可以从一个字符串中提取指定长度的子字符串。
不过,这个方法已经被标记为遗留特性,主要是因为它和其他字符串提取方法(如 substring 和 slice)的行为不一致,容易让人混淆。
替代方法:
- 使用 String.prototype.substring() 方法。它接受两个参数,分别是子字符串的起始索引和结束索引。例如:
const str = "Hello, world!";
console.log(str.substring(7, 12)); // 输出 "world"
- 或者使用 String.prototype.slice() 方法。它和 substring 类似,但可以接受负数索引,从字符串的末尾开始计数。例如:
const str = "Hello, world!";
console.log(str.slice(7, 12)); // 输出 "world"
console.log(str.slice(-6, -1)); // 输出 "world"
这两个方法都比 substr 更灵活,也更符合现代 JavaScript 的规范。
document.execCommand()
document.execCommand() 曾经被广泛用于实现富文本编辑功能,比如复制、粘贴、加粗文字等。
但这个 API 存在很大的兼容性问题,不同浏览器的表现都不一样,而且很容易引发安全问题,比如被恶意利用导致 XSS 攻击。
现在,它已经被大多数浏览器标记为废弃,不再推荐使用。
替代方法:
- 如果你需要实现复制功能,可以使用 navigator.clipboard.writeText()。这是一个更安全、更现代的 API,能够异步地将文本复制到剪贴板。例如:
async function copyText(text) {
try {
await navigator.clipboard.writeText(text);
console.log("文本已复制到剪贴板");
} catch (err) {
console.error("复制失败:", err);
}
}
- 对于富文本编辑,建议使用一些现代的编辑器库,比如 Quill、Slate.js 或 Draft.js。这些库提供了更强大、更安全的编辑功能,而且能够很好地兼容各种浏览器。
window.event
在旧的 IE 浏览器中,window.event 被用来访问全局的事件对象。
但这种用法在现代浏览器中已经不再被支持,因为它不符合 W3C 的标准。依赖 window.event 的代码在非 IE 浏览器或严格模式下可能会出现错误。
替代方法:
在现代 JavaScript 中,事件对象会作为第一个参数传递给事件处理函数。所以,你应该直接使用这个参数来获取事件对象。例如:
document.getElementById("myButton").addEventListener("click", function(event) {
console.log(event);
});
这样,无论在什么浏览器中,都能正确地获取到事件对象,避免了兼容性问题。
Event.keyCode, Event.which, Event.charCode
Event.keyCode、Event.which 和 Event.charCode 这些属性曾经被用来获取键盘事件中按下的键。
然而,它们的值在不同浏览器、不同操作系统甚至不同键盘布局下都不一致,这给开发者带来了很大的困扰。
替代方法:
- 使用 Event.key 属性。它会返回一个表示按键物理值的字符串,比如 "a"、"Enter"、"ArrowUp" 等。这个属性更直观,也更容易理解和使用。例如:
document.addEventListener("keydown", function(event) {
console.log(event.key);
});
- 如果你需要获取按键的代码,可以使用 Event.code 属性。它返回的是一个表示物理按键代码的字符串,比如 "KeyA->65"、"Enter->13"、"ArrowUp->38" 等,不受键盘布局的影响。例如:
document.addEventListener("keydown", function(event) {
console.log(event.code);
});
这两个属性都能很好地替代 keyCode、which 和 charCode,并且具有更好的兼容性和国际化支持。
Performance.timing
Performance.timing 提供了页面加载过程中的一些时间戳信息,比如导航开始时间、DNS 查询时间、TCP 连接时间等。
但随着 Web 性能测量技术的发展,这个 API 已经被新的 PerformanceNavigationTiming 接口所取代。
替代方法:
使用 performance.getEntriesByType('navigation') 方法来获取页面导航性能信息。这个方法返回一个包含 PerformanceNavigationTiming 对象的数组,你可以从中获取更详细、更准确的性能数据。例如:
const navigationEntries = performance.getEntriesByType('navigation');
if (navigationEntries.length > 0) {
const navigationEntry = navigationEntries[0];
console.log(`导航开始时间:${navigationEntry.startTime}`);
console.log(`DNS 查询耗时:${navigationEntry.domainLookupEnd - navigationEntry.domainLookupStart}`);
console.log(`TCP 连接耗时:${navigationEntry.connectEnd - navigationEntry.connectStart}`);
console.log(`请求耗时:${navigationEntry.responseEnd - navigationEntry.requestStart}`);
console.log(`DOMContentLoaded 事件耗时:${navigationEntry.domContentLoadedEventEnd - navigationEntry.domContentLoadedEventStart}`);
console.log(`页面加载总耗时:${navigationEntry.loadEventEnd - navigationEntry.startTime}`);
}
PerformanceNavigationTiming 接口不仅提供了更高精度的时间戳,而且和其他性能测量 API 保持了一致性,更适合现代 Web 性能优化的需求。
document.registerElement
document.registerElement 是一个用于注册自定义元素的旧 API。
它已经被废弃,现代浏览器推荐使用 customElements.define 来定义自定义元素。
替代方法:
使用 customElements.define 来定义自定义元素。这个方法更符合现代 Web 标准,并且得到了更好的浏览器支持。例如:
// 定义一个自定义元素
class MyElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `<p>Hello, I'm a custom element!</p>`;
}
}
// 使用 customElements.define 注册自定义元素
customElements.define('my-element', MyElement);
// 使用自定义元素
document.body.innerHTML = `<my-element></my-element>`;
customElements.define 提供了更灵活的自定义元素定义方式,并且能够更好地与现代 Web 组件技术(如 Shadow DOM)集成。
以上就是六个已经被废弃的 JavaScript API 及其替代方法。
如果你的代码中还在使用这些废弃的 API,建议尽快进行排查和替换。
这不仅能提高代码的兼容性和安全性,还能让你的代码更加符合现代 JavaScript 的开发规范。
- 上一篇:JavaScript中10个“过时”的API,你的代码里还在用吗?
- 已经是最后一篇了
相关推荐
- 这个 JavaScript Api 已被废弃!请慎用!
-
在开发过程中,我们可能会不自觉地使用一些已经被标记为废弃的JavaScriptAPI。这些...
- JavaScript中10个“过时”的API,你的代码里还在用吗?
-
JavaScript作为一门不断发展的语言,其API也在持续进化。新的、更安全、更高效的API不断涌现,而一些旧的API则因为各种原因(如安全问题、性能瓶颈、设计缺陷或有了更好的替代品)被标记为“废...
- 几大开源免费的 JavaScript 富文本编辑器测评
-
MarkDown编辑器用的时间长了,发现发现富文本编辑器用起来是真的舒服。...
- 比较好的网页里面的 html 编辑器 推荐
-
如果您正在寻找嵌入到网页中的HTML编辑器,以便用户可以直接在网页上编辑HTML内容,以下是几个备受推荐的:CKEditor:CKEditor是一个功能强大的、开源的富文本编辑器,可以嵌入到...
- Luckysheet 实现excel多人在线协同编辑
-
前言前些天看到Luckysheet支持协同编辑Excel,正符合我们协同项目的一部分,故而想进一步完善协同文章,但是遇到了一下困难,特此做声明哈,若侵权,请联系我删除文章!若侵犯版权、个人隐私,请联系...
- 从 Element UI 源码的构建流程来看前端 UI 库设计
-
作者:前端森林转发链接:https://mp.weixin.qq.com/s/ziDMLDJcvx07aM6xoEyWHQ引言...
- 手把手教你如何用 Decorator 装饰你的 Typescript?「实践」
-
作者:Nealyang转发连接:https://mp.weixin.qq.com/s/PFgc8xD7gT40-9qXNTpk7A...
- 推荐五个优秀的富文本编辑器
-
富文本编辑器是一种可嵌入浏览器网页中,所见即所得的文本编辑器。对于许多从事前端开发的小伙伴来说并不算陌生,它的应用场景非常广泛,平时发个评论、写篇博客文章等都能见到它的身影。...
- 基于vue + element的后台管理系统解决方案
-
作者:林鑫转发链接:https://github.com/lin-xin前言该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统(WebManagementSystem)开发。基于v...
- 开源富文本编辑器Quill 2.0重磅发布
-
开源富文本编辑器Quill正式发布2.0版本。官方TypeScript声明...
- Python之Web开发框架学习 Django-表单处理
-
在Django中创建表单实际上类似于创建模型。同样,我们只需要从Django类继承,则类属性将是表单字段。让我们在myapp文件夹中添加一个forms.py文件以包含我们的应用程序表单。我们将创建一个...
- Django测试入门:打造坚实代码基础的钥匙
-
这一篇说一下django框架的自动化测试,...
- Django ORM vs SQLAlchemy:到底谁更香?从入门到上头的选择指南
-
阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。...
- 超详细的Django 框架介绍,它来了!
-
时光荏苒,一晃小编的Tornado框架系列也结束了。这个框架虽然没有之前的FastAPI高流量,但是,它也是小编的心血呀。总共16篇博文,从入门到进阶,包含了框架的方方面面。虽然小编有些方面介绍得不是...
- 20《Nginx 入门教程》使用 Nginx 部署 Python 项目
-
今天的目标是完成一个PythonWeb项目的线上部署,我们使用最新的Django项目搭建一个简易的Web工程,然后基于Nginx服务部署该PythonWeb项目。1.前期准备...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)