在写一个 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]");
可大大提高第一次遍历时的性能,毕竟系统库函数啥的文本量还是巨大的,而代码片段的代码往往很小。
Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。
DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。
SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。
NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。
哪里都缺人,哪里都不缺人。
CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。
互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。
有点意思就行了
资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。
Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。
C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。
OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。
我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。
Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。
AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。
生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。
安全永远都不是一个小问题。
让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
新手上路,请谨慎驾驶!
京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。
Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。