javascript - 如何在一个网页上使用多个编辑器
问题描述
我创建了一个代码编辑器,您可以在其中查看代码。这是代码(按整页):
function openLanguage(evt, codeLanguage) {
var i, tabcontent, tablinks;
let currentTab = document.querySelector('.tablinks.active');
tabcontent = document.querySelectorAll(".tabs .tabcontent");
tabcontent.forEach(content => content.style.display = "none");
tablinks = document.querySelectorAll(".tab .tablinks");
tablinks.forEach(tab => tab.classList.remove("active"));
if (currentTab != evt.currentTarget) {
document.getElementById(codeLanguage).style.display = "block";
evt.currentTarget.classList.add("active");
}
}
* {
margin: 0;
padding: 0;
}
body {font-family: Arial;}
.codeOutput {
margin: 1em;
}
.tab {
overflow: hidden;
border: 1px solid #ccc;
border-bottom: none;
background-color: #f1f1f1;
width: 100%;
}
.tab button {
background-color: inherit;
float: left;
border: none;
outline: none;
cursor: pointer;
padding: 14px 16px;
transition: 0.1s;
font-size: 17px;
}
.tab button:hover {
filter: brightness(90%)
}
.tab button.active {
background-color: #ccc;
}
.tabcontent {
display: none;
padding: 6px 0;
border-bottom: 1px solid #000;
height: 100%;
width: 100%;
background: #000;
color: #fff;
overflow: scroll;
border-left: 1px solid;
border-right: 1px solid;
}
.result {
height: 100%;
width: 100%;
padding: 6px 0;
border: 1px solid #ccc;
border-top: none;
overflow: scroll;
}
.tabs {
display: block;
height: 200px;
border-top: 1px solid #ccc;
}
@media screen and (min-width: 600px) {
.tabs {
display: flex;
}
.result {
width: 100%;
}
.tabcontent {
width: 100%;
}
}
<div class="codeOutput">
<div class="tab">
<button class="tablinks" onclick="openLanguage(event, 'HTML')">HTML</button>
<button class="tablinks" onclick="openLanguage(event, 'CSS')">CSS</button>
<button class="tablinks" onclick="openLanguage(event, 'JavaScript')">JavaScript</button>
</div>
<div class="tabs">
<div id="HTML" class="tabcontent">
<p>Some HTML Code</p>
</div>
<div id="CSS" class="tabcontent">
<p>Some CSS Code</p>
</div>
<div id="JavaScript" class="tabcontent">
<p>Some JS Code</p>
</div>
<div class="result">
Result
</div>
</div>
</div>
然后我尝试添加第二个,但后来我意识到第二个的按钮打开了第一个的选项卡。这里又是一个有两个编辑器的例子(按整页):
function openLanguage(evt, codeLanguage) {
var i, tabcontent, tablinks;
let currentTab = document.querySelector('.tablinks.active');
tabcontent = document.querySelectorAll(".tabs .tabcontent");
tabcontent.forEach(content => content.style.display = "none");
tablinks = document.querySelectorAll(".tab .tablinks");
tablinks.forEach(tab => tab.classList.remove("active"));
if (currentTab != evt.currentTarget) {
document.getElementById(codeLanguage).style.display = "block";
evt.currentTarget.classList.add("active");
}
}
* {
margin: 0;
padding: 0;
}
body {font-family: Arial;}
.codeOutput {
margin: 1em;
}
.tab {
overflow: hidden;
border: 1px solid #ccc;
border-bottom: none;
background-color: #f1f1f1;
width: 100%;
}
.tab button {
background-color: inherit;
float: left;
border: none;
outline: none;
cursor: pointer;
padding: 14px 16px;
transition: 0.1s;
font-size: 17px;
}
.tab button:hover {
filter: brightness(90%)
}
.tab button.active {
background-color: #ccc;
}
.tabcontent {
display: none;
padding: 6px 0;
border-bottom: 1px solid #000;
height: 100%;
width: 100%;
background: #000;
color: #fff;
overflow: scroll;
border-left: 1px solid;
border-right: 1px solid;
}
.result {
height: 100%;
width: 100%;
padding: 6px 0;
border: 1px solid #ccc;
border-top: none;
overflow: scroll;
}
.tabs {
display: block;
height: 200px;
border-top: 1px solid #ccc;
}
@media screen and (min-width: 600px) {
.tabs {
display: flex;
}
.result {
width: 100%;
}
.tabcontent {
width: 100%;
}
}
<div class="codeOutput">
<div class="tab">
<button class="tablinks" onclick="openLanguage(event, 'HTML')">HTML</button>
<button class="tablinks" onclick="openLanguage(event, 'CSS')">CSS</button>
<button class="tablinks" onclick="openLanguage(event, 'JavaScript')">JavaScript</button>
</div>
<div class="tabs">
<div id="HTML" class="tabcontent">
<p>Some HTML Code</p>
</div>
<div id="CSS" class="tabcontent">
<p>Some CSS Code</p>
</div>
<div id="JavaScript" class="tabcontent">
<p>Some JS Code</p>
</div>
<div class="result">
Result
</div>
</div>
</div>
<!-- Second Editor -->
<div class="codeOutput">
<div class="tab">
<button class="tablinks" onclick="openLanguage(event, 'HTML')">HTML</button>
<button class="tablinks" onclick="openLanguage(event, 'CSS')">CSS</button>
<button class="tablinks" onclick="openLanguage(event, 'JavaScript')">JavaScript</button>
</div>
<div class="tabs">
<div id="HTML" class="tabcontent">
<p>Some HTML Code</p>
</div>
<div id="CSS" class="tabcontent">
<p>Some CSS Code</p>
</div>
<div id="JavaScript" class="tabcontent">
<p>Some JS Code</p>
</div>
<div class="result">
Result
</div>
</div>
</div>
提前致谢!
解决方案
您应该为每个编辑器使用不同的选择器。因为当前查询选择器将始终返回第一个编辑器部分给您。
所以,而不是:
tablinks = document.querySelectorAll(".tab .tablinks");
您可以为每个部分添加一个 id,然后在选择器中使用它们。
例如:
tablinksEditor1 = document.querySelectorAll("#editor1 .tab .tablinks");
tablinksEditor2 = document.querySelectorAll("#editor2 .tab .tablinks");
推荐阅读
- php - json格式的通道中的Laravel日志错误
- sql - IRA-00904:“STOREBALANCE”:无效标识符 00904。00000 -“%s:无效标识符”*原因:*操作:行错误:1 列:49
- discord.py - discord py 不断更新机器人的状态
- octobercms - 10 月将文件 url 导出到数据库
- android - 默认情况下如何选择Android允许管理所有文件选项?
- python - Python:matplotlib:纠正缠绕轴上的重叠标签
- java - 如何在 Minecraft 的圆形或椭圆形生成区域中获得随机离散点?
- c# - Facebook Messenger 平台 Webhook 上的 X-Hub-Signature
- sql-server - 如何在 SQL Server 中获取当前网站的登录名?
- html - 添加字段以在 voyager 中编辑用户