其实我有这段HTML代码
<form method=POST action=dosomething.php>
<fieldset>
<legend>My account</legend>
<ul>
<li>
<label for=email>e-mail</label>
<span>
<?=$account->email?>
(<a name="change">change</a>)
</span>
<span name="ph">
<input id="email" name="email" placeholder="new email" type=email>
<br>
<button name="change_email">change</button> or <a name="cancel">undo</a>
</span>
</li>
<li>
<label for=foo>foo</label>
<span>
<?=$account->foo?>
(<a name="change">change</a>)
</span>
<span name="ph">
<input id="foo" name="foo" type=text>
<br>
<button name="change_foo">change</button> or <a name="cancel">undo</a>
</span>
</li>
</ul>
</fieldset>
</form>
我只重复<li> ... </li>
个部分2次,但是它们会重复多次,你会注意到所有部分都是相同的。
我使用这个JavaScript来实现一个非常简单的事情:显示/隐藏两个<span>
。
window.onload = function () {
/* email */
document.getElementsByName('change')[0].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('ph')[0].style.display = 'block';
}
document.getElementsByName('cancel')[0].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('change')[0].parentNode.style.display = 'block';
document.getElementsByName('change')[0].parentNode.style.width = '100%';
}
/* social id */
document.getElementsByName('change')[1].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('ph')[1].style.display = 'block';
}
document.getElementsByName('cancel')[1].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('change')[1].parentNode.style.display = 'block';
document.getElementsByName('change')[1].parentNode.style.width = '100%';
}
/* avatar */
document.getElementsByName('change')[2].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('ph')[2].style.display = 'block';
}
document.getElementsByName('cancel')[2].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('change')[2].parentNode.style.display = 'block';
document.getElementsByName('change')[2].parentNode.style.width = '100%';
}
/* shout */
document.getElementsByName('change')[3].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('ph')[3].style.display = 'block';
}
document.getElementsByName('cancel')[3].onclick = function () {
this.parentNode.style.display = 'none';
document.getElementsByName('change')[3].parentNode.style.display = 'block';
document.getElementsByName('change')[3].parentNode.style.width = '100%';
}
}
这太长了......重复一遍。
如您所见,唯一改变的部分是getElementsByName('change')[aNumber]
。
我的问题是: 如何消除冗余?
一点注意:我想看看jQuery解决方案,但我更喜欢使用纯JS。
提前谢谢!
答案 0 :(得分:1)
给他们所有同一个班级。
使用document.getElementsByClassName
例如:
var clickables = document.getElementsByClassName('clickme');
for(var i = 0; i < clickables.length; i++){
clickables[i].onclick = function(){
//some click fn
}
}
答案 1 :(得分:1)
你当然可以用几个循环简化事情:
elements = document.getElementsByName('change');
for (var i = 0; i < elements.length; i++) {
elements[i].onclick = function() {
document.getElementsByName('ph')[i].style.display = 'block';
}
}
cancels = documents.getElementsByName('cancel');
for (i = 0; i < cancels.length; i++) {
cancels[i].onclick = function () {
this.parentNode.style.display = 'none';
cancels[i].parentNode.style.display = 'block';
cancels[i].parentNode.style.width = '100%';
}
}
答案 2 :(得分:0)
要在JQuery中执行此操作,您可以使用.each()
,但我认为您需要更改标记以使用class
而不是name
,因为我不知道使用name作为选择器的方法。如果有办法,请告诉我!
$('.change').each(function(){
$(this).click(function(){
// Click function for 'change'
});
});
$('.cancel').each(function(){
$(this).click(function(){
// Click function for 'cancel'
});
});