Guest User

Untitled

a guest
Apr 5th, 2021
3,438
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function update_in_place(old_root, new_root) {
  2.     function are_compatible(lhs, rhs) {
  3.         return lhs.nodeType === rhs.nodeType && lhs.tagName === rhs.tagName && lhs.id === rhs.id
  4.     }
  5.     if (old_root.nodeType === 3 && new_root.nodeType === 3) {
  6.         old_root.textContent = new_root.textContent;
  7.         return old_root
  8.     }
  9.     if (!are_compatible(old_root, new_root) || old_root.nodeType !== 1) {
  10.         old_root.parentElement.replaceChild(new_root, old_root);
  11.         return new_root
  12.     }
  13.     for (var i = 0; i < new_root.attributes.length; i++) {
  14.         var a = new_root.attributes[i];
  15.         if (a.specified && old_root.getAttribute(a.name) !== a.value) {
  16.             old_root.setAttribute(a.name, a.value)
  17.         }
  18.     }
  19.     for (var i = 0; i < old_root.attributes.length; i++) {
  20.         var a = old_root.attributes[i];
  21.         if (a.specified && !new_root.hasAttribute(a.name)) {
  22.             old_root.removeAttribute(a.name)
  23.         }
  24.     }
  25.     var old_children = Array.prototype.slice.call(old_root.childNodes);
  26.     var new_children = Array.prototype.slice.call(new_root.childNodes);
  27.     var old_start = 0;
  28.     var new_start = 0;
  29.     var old_end = old_children.length;
  30.     var new_end = new_children.length;
  31.     while (old_start < old_end || new_start < new_end) {
  32.         if (old_start === old_end) {
  33.             var target = old_children[old_end];
  34.             while (new_start < new_end) {
  35.                 old_root.insertBefore(new_children[new_start++], target)
  36.             }
  37.             break
  38.         }
  39.         if (new_start === new_end) {
  40.             while (old_start < old_end) {
  41.                 old_root.removeChild(old_children[old_start++])
  42.             }
  43.             break
  44.         }
  45.         if (old_children[old_start].isEqualNode(new_children[new_start])) {
  46.             old_start++;
  47.             new_start++;
  48.             continue
  49.         }
  50.         if (old_children[old_end - 1].isEqualNode(new_children[new_end - 1])) {
  51.             old_end--;
  52.             new_end--;
  53.             continue
  54.         }
  55.         if (old_children[old_start].isEqualNode(new_children[new_start + 1])) {
  56.             old_root.insertBefore(new_children[new_start], old_children[old_start]);
  57.             new_start += 2;
  58.             old_start++;
  59.             continue
  60.         }
  61.         if (old_children[old_end - 1].isEqualNode(new_children[new_end - 2])) {
  62.             old_root.insertBefore(new_children[new_end - 1], old_children[old_end]);
  63.             new_end -= 2;
  64.             old_end--;
  65.             continue
  66.         }
  67.         old_children[old_start] = update_in_place(old_children[old_start], new_children[new_start]);
  68.         old_start++;
  69.         new_start++
  70.     }
  71.     return old_root
  72. };
  73.  
  74. function virtual_refresh() {
  75.     xhr("GET", window.location.href, null, function(req) {
  76.         var parser = new DOMParser();
  77.         var doc = parser.parseFromString(req.response, "text/html");
  78.         update_in_place(document.querySelector("body"), doc.body)
  79.     })
  80. }
Advertisement
Add Comment
Please, Sign In to add comment