Javascript 帮我做这个,让它变干
Javascript Help me make this so it's DRY
我想让这段代码变干。我知道我在这里重复自己,必须有一种方法来压缩这段代码。该代码正在运行并且可以执行我想要的操作,但我正在尝试学习如何更好地配置我的代码。你能帮忙吗?
http://codepen.io/anon/pen/GpMKLX
<div class="wrapper">
<div class="num_wrapper">
<div id="divNum_1"></div>
<button id="btn_1"> Pick</button>
</div>
<div class="num_wrapper">
<div id="divNum_2"></div>
<button id="btn_2"> Pick</button>
</div>
<div class="num_wrapper">
<div id="divNum_3"></div>
<button id="btn_3"> Pick</button>
</div>
<div class="num_wrapper">
<div id="divNum_4"></div>
<button id="btn_4"> Pick</button>
</div>
</div>
var btnOne = document.getElementById("btn_1");
var btnTwo = document.getElementById("btn_2");
var btnThree = document.getElementById("btn_3");
var btnFour = document.getElementById("btn_4");
var divOne = document.getElementById("divNum_1");
var divTwo = document.getElementById("divNum_2");
var divThree = document.getElementById("divNum_3");
var divFour = document.getElementById("divNum_4");
function randomNum() {
var num = Math.random() * 10;
num = Math.floor(num);
return num;
}
btnOne.onclick = function () {
divOne.innerHTML = randomNum();
}
btnTwo.onclick = function () {
divTwo.innerHTML = randomNum();
}
btnThree.onclick = function () {
divThree.innerHTML = randomNum();
}
btnFour.onclick = function () {
divFour.innerHTML = randomNum();
}
var buttons = document.querySelectorAll("div button");
var divs = document.querySelectorAll("div.num_wrapper > div");
if( buttons.length != divs.length ) throw "different number of buttons vs divs";
for(var i=0; i<buttons.length;i++) {
buttons[i].onclick = function() {
divs[i].textContent = Math.floor( Math.random() * 10 );
}
}
- 重复调用
getElementbyId
替换为 querySelectorAll
textContent
用来代替半标准 innerHTML
,它也是 XSS 安全的
- 消除
randomNum
function addOnclick(index)
{
//Get the button
var button = document.getElementById( "btn_" + index );
//Add listener
button.addEventListener(
"click",
function () {
document.getElementById( "divNum_" + index ).innerHTML = randomNum();
}
);
}
//Now call it
for ( var i = 1; i < 5; i++ ) addOnclick( i );
无需求助于具有匹配数字后缀的唯一 ID,这可以通过在零件上附加 类 来完成。它也可以在没有 类 的情况下使用相对元素来完成,但是 类 在我的示例中使它更清楚。
我将使用与您相同的 CSS 和基本相同的结构,但使用 类 代替所使用的 ID。
页面结构如我之前的评论所述:
"a div of class 'num_wrapper' which encloses exactly one div of class 'num_content' and a sibling button of class 'num_pick'"
这会获取所有 _num_pick_ 按钮,然后遍历它们并为每个按钮附加一个 click 事件处理程序。
处理函数对被点击的按钮使用 this
,获取父按钮,然后在 (querySelector 可以在任何节点上使用,而不仅仅是 document.querySelector!) 并设置其 textContent.
var buttons = document.querySelectorAll("button.num_pick");
for (var i=0; i<buttons.length; i++) {
buttons[i].addEventListener("click", function(e) {
var cont = this.parentElement.querySelector("div.num_content")
cont.textContent = Math.floor( Math.random() * 10 );
});
}
.wrapper {
width:448px;
margin:0 auto;
}
.num_wrapper {
margin:0 5px;
width:100px;
height:100px;
float:left;
border:1px solid #333;
background-color:#ccc;
position:relative;
font-family:Arial;
font-size:60px;
text-align:center;
}
button {
width:100%;
position:absolute;
top:72px;
left:0;
font-size:20px;
text-align:center;
}
<div class="wrapper">
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
</div>
这适用于任意数量的重复 num_wrapper
div,而无需在每个 id
.
中输入 change/update 个数字
我想让这段代码变干。我知道我在这里重复自己,必须有一种方法来压缩这段代码。该代码正在运行并且可以执行我想要的操作,但我正在尝试学习如何更好地配置我的代码。你能帮忙吗?
http://codepen.io/anon/pen/GpMKLX
<div class="wrapper">
<div class="num_wrapper">
<div id="divNum_1"></div>
<button id="btn_1"> Pick</button>
</div>
<div class="num_wrapper">
<div id="divNum_2"></div>
<button id="btn_2"> Pick</button>
</div>
<div class="num_wrapper">
<div id="divNum_3"></div>
<button id="btn_3"> Pick</button>
</div>
<div class="num_wrapper">
<div id="divNum_4"></div>
<button id="btn_4"> Pick</button>
</div>
</div>
var btnOne = document.getElementById("btn_1");
var btnTwo = document.getElementById("btn_2");
var btnThree = document.getElementById("btn_3");
var btnFour = document.getElementById("btn_4");
var divOne = document.getElementById("divNum_1");
var divTwo = document.getElementById("divNum_2");
var divThree = document.getElementById("divNum_3");
var divFour = document.getElementById("divNum_4");
function randomNum() {
var num = Math.random() * 10;
num = Math.floor(num);
return num;
}
btnOne.onclick = function () {
divOne.innerHTML = randomNum();
}
btnTwo.onclick = function () {
divTwo.innerHTML = randomNum();
}
btnThree.onclick = function () {
divThree.innerHTML = randomNum();
}
btnFour.onclick = function () {
divFour.innerHTML = randomNum();
}
var buttons = document.querySelectorAll("div button");
var divs = document.querySelectorAll("div.num_wrapper > div");
if( buttons.length != divs.length ) throw "different number of buttons vs divs";
for(var i=0; i<buttons.length;i++) {
buttons[i].onclick = function() {
divs[i].textContent = Math.floor( Math.random() * 10 );
}
}
- 重复调用
getElementbyId
替换为querySelectorAll
textContent
用来代替半标准innerHTML
,它也是 XSS 安全的- 消除
randomNum
function addOnclick(index)
{
//Get the button
var button = document.getElementById( "btn_" + index );
//Add listener
button.addEventListener(
"click",
function () {
document.getElementById( "divNum_" + index ).innerHTML = randomNum();
}
);
}
//Now call it
for ( var i = 1; i < 5; i++ ) addOnclick( i );
无需求助于具有匹配数字后缀的唯一 ID,这可以通过在零件上附加 类 来完成。它也可以在没有 类 的情况下使用相对元素来完成,但是 类 在我的示例中使它更清楚。
我将使用与您相同的 CSS 和基本相同的结构,但使用 类 代替所使用的 ID。
页面结构如我之前的评论所述:
"a div of class 'num_wrapper' which encloses exactly one div of class 'num_content' and a sibling button of class 'num_pick'"
这会获取所有 _num_pick_ 按钮,然后遍历它们并为每个按钮附加一个 click 事件处理程序。
处理函数对被点击的按钮使用 this
,获取父按钮,然后在 (querySelector 可以在任何节点上使用,而不仅仅是 document.querySelector!) 并设置其 textContent.
var buttons = document.querySelectorAll("button.num_pick");
for (var i=0; i<buttons.length; i++) {
buttons[i].addEventListener("click", function(e) {
var cont = this.parentElement.querySelector("div.num_content")
cont.textContent = Math.floor( Math.random() * 10 );
});
}
.wrapper {
width:448px;
margin:0 auto;
}
.num_wrapper {
margin:0 5px;
width:100px;
height:100px;
float:left;
border:1px solid #333;
background-color:#ccc;
position:relative;
font-family:Arial;
font-size:60px;
text-align:center;
}
button {
width:100%;
position:absolute;
top:72px;
left:0;
font-size:20px;
text-align:center;
}
<div class="wrapper">
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
<div class="num_wrapper">
<div class="num_content"></div>
<button class="num_pick"> Pick </button>
</div>
</div>
这适用于任意数量的重复 num_wrapper
div,而无需在每个 id
.