添加到dom [对象DocumentFragment]问题

问题描述 投票:0回答:2

大家好,所以在添加文档对象片段时遇到一个奇怪的问题。

总体而言,我正在为艺术家站点进行一些快速修复样式替代。他们有一些下拉菜单,以前的开发人员尝试样式化但没有用。

我正在尝试克隆现有的select并将其放入div包装器中,然后我有一个预先构建的脚本+ CSS来制作自己的样式下拉列表。

不幸的是我遇到了这个!似乎它没有像我期望的那样被解析。

[object DocumentFragment]

这里是相关代码:

    const fragment = document.createDocumentFragment();
    const selectContainer = document.createElement("div");
    const select = document.querySelector("#billing_country");
    const selectClone = select.cloneNode(true);

    selectContainer.append(selectClone);
    selectContainer.id = "custom-select";
    fragment.append(selectContainer);

    document.querySelector(
       "#billing_country"
    ).parentElement.innerHTML = fragment;
javascript html dom
2个回答
1
投票

Element.innerHTML设置程序需要一个字符串,而不是节点。

将您的documentFragment附加到该元素中,您可以这样做

element.append( fragment );

const fragment = document.createDocumentFragment();
const selectContainer = document.createElement("div");
const select = document.querySelector("#billing_country");
const selectClone = select.cloneNode(true);

selectContainer.append(selectClone);
selectContainer.id = "custom-select";
fragment.append(selectContainer);

document.querySelector( "#billing_country" ).parentElement
  .append( fragment ); // don't use innerHTML here
#custom-select {
  border: 1px solid red;
}
<div id="parent">

  <select id="billing_country">
    <option>Absurdistan</option>
    <option>Atlantis</option>
    <option>Borduria</option>
    <option>Kambezi</option>
    <option>Lugash</option>
  </select>
  
</div>

0
投票

嗯,我仍然不知道为什么DOM似乎不想解析我的对象片段。

我最终还是用字符串文字以旧的方式完成了它。

这里是想要替换选择下拉列表的所有人的完整代码。这将节省您大量的时间。享受!

document.addEventListener("DOMContentLoaded", function () {
  console.log("Overrides Loaded");

  (function initCustomSelect() {
    const elems = [
      "#billing_country",
      "#billing_state",
      "#shipping_country",
      "#shipping_state",
      ".orderby",
    ];
    let match = false;

    elems.map(function (elem, index) {
      if (document.querySelector(elem)) {
        const parent = document.querySelector(elem).parentElement;
        const html = parent.innerHTML;

        parent.innerHTML = `<div class='custom-select'>${html}</div>`;
        match = true;
      }
    });

    if (match) {
      formatSelectItems();
    }
  })()

  function formatSelectItems() {
    // Prebuit Select Script
    var x, i, j, selElmnt, a, b, c;
    /*look for any elements with the class "custom-select":*/
    x = document.getElementsByClassName("custom-select");
    for (i = 0; i < x.length; i++) {
      selElmnt = x[i].getElementsByTagName("select")[0];
      /*for each element, create a new DIV that will act as the selected item:*/
      a = document.createElement("DIV");
      a.setAttribute("class", "select-selected");
      a.innerHTML = selElmnt.options[selElmnt.selectedIndex].innerHTML;
      x[i].appendChild(a);
      /*for each element, create a new DIV that will contain the option list:*/
      b = document.createElement("DIV");
      b.setAttribute("class", "select-items select-hide");
      for (j = 1; j < selElmnt.length; j++) {
        /*for each option in the original select element,
    create a new DIV that will act as an option item:*/
        c = document.createElement("DIV");
        c.innerHTML = selElmnt.options[j].innerHTML;
        c.addEventListener("click", function (e) {
          /*when an item is clicked, update the original select box,
        and the selected item:*/
          var y, i, k, s, h;
          s = this.parentNode.parentNode.getElementsByTagName("select")[0];
          h = this.parentNode.previousSibling;
          for (i = 0; i < s.length; i++) {
            if (s.options[i].innerHTML == this.innerHTML) {
              s.selectedIndex = i;
              h.innerHTML = this.innerHTML;
              y = this.parentNode.getElementsByClassName("same-as-selected");
              for (k = 0; k < y.length; k++) {
                y[k].removeAttribute("class");
              }
              this.setAttribute("class", "same-as-selected");
              break;
            }
          }
          h.click();
        });
        b.appendChild(c);
      }
      x[i].appendChild(b);
      a.addEventListener("click", function (e) {
        /*when the select box is clicked, close any other select boxes,
      and open/close the current select box:*/
        e.stopPropagation();
        closeAllSelect(this);
        this.nextSibling.classList.toggle("select-hide");
        this.classList.toggle("select-arrow-active");
      });
    }
    function closeAllSelect(elmnt) {
      /*a function that will close all select boxes in the document,
  except the current select box:*/
      var x,
        y,
        i,
        arrNo = [];
      x = document.getElementsByClassName("select-items");
      y = document.getElementsByClassName("select-selected");
      for (i = 0; i < y.length; i++) {
        if (elmnt == y[i]) {
          arrNo.push(i);
        } else {
          y[i].classList.remove("select-arrow-active");
        }
      }
      for (i = 0; i < x.length; i++) {
        if (arrNo.indexOf(i)) {
          x[i].classList.add("select-hide");
        }
      }
    }
    /*if the user clicks anywhere outside the select box,
then close all select boxes:*/
    document.addEventListener("click", closeAllSelect);
  }
});

及其CSS样式!

/* Custom Select Styles */
/*the container must be positioned relative:*/
.custom-select {
  position: relative;
  font-family: Arial;
}

.custom-select select {
  display: none; /*hide original SELECT element:*/
}

.select-selected {
  background-color: #333333;
}

/*style the arrow inside the select element:*/
.select-selected:after {
  position: absolute;
  content: "";
  top: 14px;
  right: 10px;
  width: 0;
  height: 0;
  border: 6px solid transparent;
  border-color: #baa640 transparent transparent transparent;
}

/*point the arrow upwards when the select box is open (active):*/
.select-selected.select-arrow-active:after {
  border-color: transparent transparent #baa640 transparent;
  top: 7px;
}

/*style the items (options), including the selected item:*/
.select-items div,
.select-selected {
  color: #baa640;
  padding: 8px 16px;
  border: 1px solid transparent;
  border-color: transparent transparent rgba(0, 0, 0, 0.1) transparent;
  cursor: pointer;
  user-select: none;
}

/*style items (options):*/
.select-items {
  position: absolute;
  background-color: #333333;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 99;
  max-height: 320px;
  overflow-y: auto;
}

.select-items::-webkit-scrollbar-track {
  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  border-radius: 10px;
  background-color: #333333;
}

.select-items::-webkit-scrollbar {
  width: 12px;
  background-color: #333333;
}

.select-items::-webkit-scrollbar-thumb {
  border-radius: 10px;
  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  background-color: #baa640;
}

/*hide the items when the select box is closed:*/
.select-hide {
  display: none;
}

.select-items div:hover,
.same-as-selected {
  background-color: rgba(0, 0, 0, 0.1);
}

.woocommerce-ordering:after {
  display: none !important;
}

.select-selected {
  padding-right: 30px !important;
}
© www.soinside.com 2019 - 2024. All rights reserved.