Javascript:在特定屏幕尺寸下移除子对象

标签 javascript html event-listener matchmedia

我现在尝试了几个小时,以在特定屏幕尺寸(>60em 和 <90em)下围绕两个 div(aside 和 .related)添加一个包装器。我正在用 matchMedia 和一个 eventListener 来做这件事。包装似乎添加在正确的位置,但问题是即使不满足尺寸条件,它仍然存在。

这是一个 jsfiddle:http://jsfiddle.net/Vanilla__/4q26ngmg/1/

简化的 HTML:

<body>
  <header>Header</header>
  <main>Main</main>
  <aside>Aside</aside>
  <div class="related">Related</div>
  <footer>Footer</footer>
</body>

Javascript:

if(window.matchMedia("screen and (min-width: 60em) and (max-width: 90em)").matches) {

  window.addEventListener("resize", function addWrapper(q) {

  //Create div with id wrapper
  var div = document.createElement('div');
  div.id = "wrapper";

  // Select aside
  var selectDiv = document.querySelector("aside");

  //clone
  div.appendChild(selectDiv.cloneNode(true));
  //Place the new wrapper at the right place in the HTML
   selectDiv.parentNode.replaceChild(div, selectDiv);

  //Add related to the wrapper so they're both in the wrapper
  document.querySelector('#wrapper').appendChild(
    document.querySelector('.related') );

  });
}

当有另一个屏幕尺寸时,我想添加一个“其他”来删除子项(使用 removeChild)或删除 eventListener(使用 removeEventListener),但我得到的只是关于函数未定义的错误或其他错误我试试。

else {
       window.removeEventListener("resize", addWrapper(q));
    }

有谁知道当屏幕尺寸不是 >60em 和 <90em 时如何移除包装?我是 Javascript 菜鸟(可能很清楚 ;))。感谢您的帮助。

最佳答案

你可以这样做:

var addWrapper = function () {

    //Don't add wrapper if already added
    var wrapper = document.getElementById("wrapper");
    if (wrapper !== null) return;

    //Create div with id wrapper
    var div = document.createElement('div');
    div.id = "wrapper";

    // Select aside
    var selectDiv = document.querySelector("aside");

    //clone
    div.appendChild(selectDiv.cloneNode(true));
    //Place the new wrapper at the right place in the HTML
    selectDiv.parentNode.replaceChild(div, selectDiv);

    //Add related to the wrapper so they're both in the wrapper
    document.querySelector('#wrapper').appendChild(
    document.querySelector('.related'));
};

var removeWrapper = function () {
    //Don't remove if there is no wrapper
    var wrapper = document.getElementById("wrapper");
    if (wrapper === null) return;

    //Replace wrapper with its content
    wrapper.outerHTML = wrapper.innerHTML;
}

var wrapperFixer = function () {
    if (window.matchMedia("screen and (min-width: 60em) and (max-width: 90em)").matches) {
        addWrapper();
    } else {
        removeWrapper();
    }
}

window.onload = function () {
    window.addEventListener("resize", wrapperFixer);
    //Check and add if wrapper should be added on load
    wrapperFixer();
}
body {
    display: flex;
    height: 40em;
    flex-wrap: wrap;
    font-family: Helvetica, Arial, sans-serif;
    color: white;
    text-align: center;
}
header {
    background-color: purple;
    width: 30%
}
main {
    background-color: pink;
    width: 40%
}
aside {
    background-color: deepPink;
    width: 15%
}
.related {
    background-color: red;
    width: 15%
}
footer {
    background-color: slateBlue;
    width: 100%;
    height: 5em;
}
#wrapper {
    border: 4px solid white;
}
<body>
    <header>Header</header>
    <main>Main</main>
    <aside>Aside</aside>
    <div class="related">Related</div>
    <footer>Footer</footer>
</body>

关于Javascript:在特定屏幕尺寸下移除子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318461/

相关文章:

javascript - 从数组派生类型 Typescript

javascript - 当元素具有子元素并使用 JQuery 时,如何仅更改 HTML 中的文本?

javascript - jQuery 是否清空通过 addEventListener 附加的分离监听器?

javascript - Chrome 扩展程序获取新选择的标签页的 url

javascript - Vuex:刷新浏览器时保留部分状态

javascript - 为什么数组上的js映射会修改原始数组?

html - 使用angularjs在html中的表格数据单元格上显示下拉列表

java - 同一类型的 Swing 事件是否有保证优先级?

javascript - 用于在 Google Maps v3 上创建多条路线的数组

javascript/jquery - 倒计时器