如何重新呈现 JavaScript/jQuery 中的页面?
How can you re-render a page from JavaScript/jQuery?
我不太确定这是否是正确的表达方式,但这里是 my problem
如您所见,非常简单的代码:
<div class="first"></div>
<div></div>
我要实现的是:
- 您点击
div
和 第一个 class,它会将 class 与兄弟元素 [=33= 交换]
- 您单击同级元素,它会将其交换回来,因此您只需交换 classes 围绕 2 个元素
这里的问题是它只有第一次正确工作,第二次当新元素通过 addClass
接收到 class 时,jQuery 无法识别它包含第一页加载的 class?我该如何解决这个问题?
P.S:我做了一个 console.log(111);
只是为了确定,果然只有当我在第一次交换后点击黑色 div
时它才会触发(应该不再有 第一个 class)
一个快速简单的方法是这样的:
$(document).ready(function() {
var first = $('.first');
var second = first.next();
first.click(function(e) {
e.preventDefault();
first.removeClass('first');
second.addClass('first');
});
second.click(function(e) {
e.preventDefault();
second.removeClass('first');
first.addClass('first');
});
});
div {
background-color: black;
height: 100px;
width: 100px;
margin-bottom: 10px;
}
.first {
background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first"></div>
<div></div>
这种方式不能很好地扩展。
您的问题是您仅在单击 $(first)
时发生变化,单击时不会发生变化,它仍然指向第一个 div。
更好的香草方式javascript:
document.addEventListener('click', function(e) {
if (e.target.classList.contains('first')) {
e.target.classList.remove('first')
var sibling = getNextSibling(e.target) || getPreviousSibling(e.target)
if (sibling) {
sibling.classList.add('first')
}
}
})
function getNextSibling(elem) {
var sibling = elem.nextSibling
while(sibling && sibling.nodeType != 1) {
sibling = sibling.nextSibling
}
return sibling
}
function getPreviousSibling(elem) {
var sibling = elem.previousSibling
while(sibling && sibling.nodeType != 1) {
sibling = sibling.previousSibling
}
return sibling
}
要实现此行为,您可以在元素包装器上使用委托事件http://api.jquery.com/delegate/;
$(document).delegate('.first', 'click', function(e){
e.preventDefault();
console.log(123);
$(this).removeClass('first');
$(this).siblings().addClass('first');
})
您需要做的就是将两个项目推入一个数组,然后在点击时在索引之间切换。
var elems = [];
$(document).on("click", ".first", function(event) {
elems = elems.length == 0 ? [event.originalEvent.target, $(event.originalEvent.target).next()] : elems;
$(elems[event.originalEvent.target === elems[0] ? 1 : 0]).addClass("first");
$(elems[event.originalEvent.target === elems[0] ? 0 : 1]).removeClass("first");
});
.first {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first">x</div>
<div>y</div>
我不太确定这是否是正确的表达方式,但这里是 my problem
如您所见,非常简单的代码:
<div class="first"></div>
<div></div>
我要实现的是:
- 您点击
div
和 第一个 class,它会将 class 与兄弟元素 [=33= 交换] - 您单击同级元素,它会将其交换回来,因此您只需交换 classes 围绕 2 个元素
这里的问题是它只有第一次正确工作,第二次当新元素通过 addClass
接收到 class 时,jQuery 无法识别它包含第一页加载的 class?我该如何解决这个问题?
P.S:我做了一个 console.log(111);
只是为了确定,果然只有当我在第一次交换后点击黑色 div
时它才会触发(应该不再有 第一个 class)
一个快速简单的方法是这样的:
$(document).ready(function() {
var first = $('.first');
var second = first.next();
first.click(function(e) {
e.preventDefault();
first.removeClass('first');
second.addClass('first');
});
second.click(function(e) {
e.preventDefault();
second.removeClass('first');
first.addClass('first');
});
});
div {
background-color: black;
height: 100px;
width: 100px;
margin-bottom: 10px;
}
.first {
background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first"></div>
<div></div>
这种方式不能很好地扩展。
您的问题是您仅在单击 $(first)
时发生变化,单击时不会发生变化,它仍然指向第一个 div。
更好的香草方式javascript:
document.addEventListener('click', function(e) {
if (e.target.classList.contains('first')) {
e.target.classList.remove('first')
var sibling = getNextSibling(e.target) || getPreviousSibling(e.target)
if (sibling) {
sibling.classList.add('first')
}
}
})
function getNextSibling(elem) {
var sibling = elem.nextSibling
while(sibling && sibling.nodeType != 1) {
sibling = sibling.nextSibling
}
return sibling
}
function getPreviousSibling(elem) {
var sibling = elem.previousSibling
while(sibling && sibling.nodeType != 1) {
sibling = sibling.previousSibling
}
return sibling
}
要实现此行为,您可以在元素包装器上使用委托事件http://api.jquery.com/delegate/;
$(document).delegate('.first', 'click', function(e){
e.preventDefault();
console.log(123);
$(this).removeClass('first');
$(this).siblings().addClass('first');
})
您需要做的就是将两个项目推入一个数组,然后在点击时在索引之间切换。
var elems = [];
$(document).on("click", ".first", function(event) {
elems = elems.length == 0 ? [event.originalEvent.target, $(event.originalEvent.target).next()] : elems;
$(elems[event.originalEvent.target === elems[0] ? 1 : 0]).addClass("first");
$(elems[event.originalEvent.target === elems[0] ? 0 : 1]).removeClass("first");
});
.first {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first">x</div>
<div>y</div>