在写一个 JS ,但我发现关闭代码片段之后这个 JS 还在运行,咋整?
启用代码片段之后会添加一个元素,这个元素在关闭代码片段时会移除,但 JS 却还会持续运行:
在写一个 JS ,但我发现关闭代码片段之后这个 JS 还在运行,咋整?
启用代码片段之后会添加一个元素,这个元素在关闭代码片段时会移除,但 JS 却还会持续运行:
思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。
融合块、大纲和双向链接,重构你的思维。
提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。
我通过这个函数实现了判断代码片段是否关闭,不知是否你想要的效果。
// 判断脚本是否开启
// 通过唯一标志符判断是否启用此脚本,下面的uuid不要删除,也可以改成其他全局唯一字符串
// 如果性能更好,可以使用脚本id和这个方法相结合,即把这个uuid改为脚本id,然后先用脚本id判断脚本是否存在,再用keyword判断
// 也可以通过/api/snippet/getSnippet来判断脚本开启状态,这里采用判断脚本是否存在的方式
// 调用方式 isEnabled()
// b6fb408a-d400-4874-b357-06fcdce67ca6
function isEnabled(keyword = 'b6fb408a-d400-4874-b357-06fcdce67ca6') {
if(!siyuan.config.snippet.enabledJS) return false;
const scripts = document.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].textContent.indexOf('// ' + keyword) !== -1) {
return true;
}
}
return false;
}
然后在 MutationObserver
回调中添加判断
if(!isEnabled()) {
if(observer) observer.disconnect();
if(timeoutId) clearTimeout(timeoutId);
if(animationFrameRequestId) cancelAnimationFrame(animationFrameRequestId);
return;
}
如图
效果
我通过这个函数实现了判断代码片段是否关闭,不知是否你想要的效果。
// 判断脚本是否开启
// 通过唯一标志符判断是否启用此脚本,下面的uuid不要删除,也可以改成其他全局唯一字符串
// 如果性能更好,可以使用脚本id和这个方法相结合,即把这个uuid改为脚本id,然后先用脚本id判断脚本是否存在,再用keyword判断
// 也可以通过/api/snippet/getSnippet来判断脚本开启状态,这里采用判断脚本是否存在的方式
// 调用方式 isEnabled()
// b6fb408a-d400-4874-b357-06fcdce67ca6
function isEnabled(keyword = 'b6fb408a-d400-4874-b357-06fcdce67ca6') {
if(!siyuan.config.snippet.enabledJS) return false;
const scripts = document.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].textContent.indexOf('// ' + keyword) !== -1) {
return true;
}
}
return false;
}
然后在 MutationObserver
回调中添加判断
if(!isEnabled()) {
if(observer) observer.disconnect();
if(timeoutId) clearTimeout(timeoutId);
if(animationFrameRequestId) cancelAnimationFrame(animationFrameRequestId);
return;
}
如图
效果
对,非常感谢。另外我改为只遍历 head 元素下的 script 标签:
// 判断脚本是否开启
// 通过唯一标志符判断是否启用此脚本,下面的uuid不要删除,也可以改成其他全局唯一字符串
// 如果性能更好,可以使用脚本id和这个方法相结合,即把这个uuid改为脚本id,然后先用脚本id判断脚本是否存在,再用keyword判断
// 也可以通过/api/snippet/getSnippet来判断脚本开启状态,这里采用判断脚本是否存在的方式
// 调用方式 isEnabled()
// b6fb408a-d400-4874-b357-06fcdce67ca6
function isEnabled(keyword = 'b6fb408a-d400-4874-b357-06fcdce67ca6') {
if(!siyuan.config.snippet.enabledJS) return false;
const scripts = document.head.getElementsByTagName('script'); // 只遍历 head 元素下的 script 标签
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].textContent.indexOf('// ' + keyword) !== -1) {
return true;
}
}
return false;
}
👍 我在你的基础上,对这个函数进一步优化,加入了通过 id 判断,遍历脚本仅执行一次。
// 判断脚本是否开启
// 通过唯一标志符判断是否启用此脚本,注释中的uuid不要删除,也可以改成其他全局唯一字符串
// 也可以通过/api/snippet/getSnippet来判断脚本开启状态,这里采用判断脚本是否存在的方式
// 调用方式 isEnabled()
let scriptId = '';
function isEnabled(keyword = 'b6fb408a-d400-4874-b357-06fcdce67ca6') {
if(!siyuan.config.snippet.enabledJS) return false;
const script = scriptId ? document.getElementById(scriptId) : null;
if(script) return true;
const scripts = document.head.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
// b6fb408a-d400-4874-b357-06fcdce67ca6
if (scripts[i].textContent.indexOf('// ' + keyword) !== -1) {
scriptId = scripts[i].id;
return true;
}
}
return false;
}
另外,建议不用对整个 body 进行监控,监控 .layout__center
应该就足够了。
把 isEnabled()函数中的
const scripts = document.head.getElementsByTagName('script');
改为
const scripts = document.head.querySelectorAll("script[id^=snippetJS]");
可大大提高第一次遍历时的性能,毕竟系统库函数啥的文本量还是巨大的,而代码片段的代码往往很小。
OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。
Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。
WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。
阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。
宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。
沉迷游戏伤身,强撸灰飞烟灭。
CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。
PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。
Mobi.css is a lightweight, flexible CSS framework that focus on mobile.
Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。
单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。
脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。
一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。
ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。
uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。
i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。
小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。
由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!
有什么新发现就分享给大家吧!
找到自己的位置,萌新烦恼少。
GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。