如何从JavaScript / jQuery重新呈现页面?

时间:2016-09-09 22:38:16

标签: javascript jquery render swap

我不太确定这是否是正确的表达方式,但这里是my problem

如您所见,非常简单的代码:

<div class="first"></div>
<div></div>

我想要实现的目标是:

  1. 您使用第一个类点击div,它会将该类与兄弟元素交换
  2. 您单击兄弟元素,然后将其交换回来,因此您只需在2个元素周围交换类
  3. 这里的问题是它只在第一次正常工作,第二次新元素通过addClass接收类时,jQuery没有认识到它包含第一页加载的类?我该如何解决这个问题?

    PS:我做了一个console.log(111);只是为了确保,当我在第一次交换后点击黑色div(那个应该没有的那个)时,它肯定会触发第一个类了)

3 个答案:

答案 0 :(得分:2)

要实现此行为,您可以在元素包装器上使用委派事件http://api.jquery.com/delegate/;

$(document).delegate('.first', 'click', function(e){
    e.preventDefault();
    console.log(123);
    $(this).removeClass('first');
   $(this).siblings().addClass('first');
})

答案 1 :(得分:1)

快速而简单的方法是:

&#13;
&#13;
$(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');
  });
});
&#13;
div {
  background-color: black;
  height: 100px;
  width: 100px;
  margin-bottom: 10px;
}
.first {
  background-color: green;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="first"></div>
<div></div>
&#13;
&#13;
&#13;

这种方式不能很好地扩展。

您的问题是,只有当您点击$(first)时,只有在点击时它仍然没有变化,它仍会指向第一个div。

使用vanilla javascript的更好方法:

&#13;
&#13;
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
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您需要做的就是将两个项目都推入一个数组,然后在点击时在索引之间切换。

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>