检测DOM元素顺序的变化

iul*_*net 5 javascript jquery dom

我有以下代码:

<div>
  <span>Random text</span> 
  <span style="color: red">Random text</span>
</div>
Run Code Online (Sandbox Code Playgroud)

并且,使用代码,我有50%的几率改变div中元素的顺序.

$(document).ready(function() {
  var initial = $("div"); //This might not be ok

  if (new Date() % 2) //50% chance to randomize order 
    randomizeOrder();

  var after = $("div"); //Also this might not be ok
  //Detect if the order of spans changed
  if (after != initial) //Definitely won't work
    console.log("Order changed");
})

function randomizeOrder() {
  var lastElement = $("div span").last();
  $(lastElement).insertBefore($("div span").first());
}
Run Code Online (Sandbox Code Playgroud)

这个例子过于简单了.订单由用户使用第三方库完成,该库不会告诉我订单是否实际更改,只需告诉我它何时开始和完成.

如何检测DOM元素的顺序是否实际发生了变化?我在其中的信息不能使用,因为它可以完全相同,如示例中所示.

小提琴

Dek*_*kel 15

如果要检查DOM中的更改,可以使用MutationObserver:

$(document).ready(function() {
  var initial = $("div"); //This might not be ok

  if (new Date() % 2) {
    randomizeOrder();
  }
  
});

function randomizeOrder() {
  var lastElement = $("div span").last();
  $(lastElement).insertBefore($("div span").first());
}

var target = document.getElementById('id1');

// create an observer instance
var observer = new MutationObserver(function(mutations) {
  var changed = false;
  mutations.forEach(function(mutation) {
    // You can check the actual changes here
  });
  console.log('Dom Changed');
});

// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };

// pass in the target node, as well as the observer options
observer.observe(target, config);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="id1">
  <span>Random text</span> 
  <span style="color: red">Random text</span>
</div>
Run Code Online (Sandbox Code Playgroud)

MutationObserver使您能够检查特定元素中的DOM更改,而无需更改DOM的代码.