【问题标题】:template-div clones into same template javascripttemplate-div 克隆到相同的模板 javascript
【发布时间】:2018-01-02 21:03:23
【问题描述】:

我在将克隆模板克隆到同一模板时遇到问题。 我有一个主模板和两个子模板。我希望能够在事件的一个主模板中打开一个子模板,并在第二个事件的另一个主模板中打开另一个子模板。但是现在他们在每个事件中都在同一个主模板中打开。 主模板:

<main>
  <div id="wrapper">

    <template class="myTemplate">
      <div class="dragdiv">
        <div class="dragdivheader">Main template</div>
          <div class="windowContent">

          </div>
      </div>
    </template>

  </div>
</main>

第一个子模板:

<template>
  <div class="memory">                      
    <a href="#"><img src="image/0.jpeg" alt="A brick"></a>
  </div>
</template>

第二个子模板:

<template class="chatBox">
  <div class="chat">
    <div class="messages">
      <template>
        <div class="message">
          <p class="author"></p>
          <p class="text"></p> 
        </div>
      </template>
    </div>
    <div id="messageArea">
      <textarea class="messageArea"></textarea>
      <input type="button" class="send" value="Send" />
    </div>
  </div>
</template>

事件监听器:

document.querySelector('#memoryLauncher').onclick = function () {
  let container = document.querySelector('#wrapper')
  let mainTemplate = 
  document.querySelectorAll('template'[0].content.firstElementChild
  let div = document.importNode(mainTemplate, true)
  container.appendChild(div)

  startMemory(4, 4)
}

document.querySelector('#chatLauncher').onclick = function () {
  let container = document.querySelector('#wrapper')
  let mainTemplate = 
  document.querySelectorAll('template'[0].content.firstElementChild
  let div = document.importNode(mainTemplate, true)
  container.appendChild(div)

  let chat = new Chat(document.querySelector('.windowContent'))
  chat.connect().then(function (socket) {
  })
}

【问题讨论】:

  • 除了缺少一个右括号之外,两个函数的第一部分是相同的(直到空行),除了您将点击侦听器附加到哪个元素。我没有足够的上下文,但我怀疑#wrapper 和/或模板索引应该在这两者之间有所不同。
  • @RyanHanekamp 我添加了 wrapper-div ,如果它清除了一点,所有元素都应该结束。所以从现在看来,你不认为每个事件都应该创建一个新的主模板容器吗?

标签: javascript html dom event-handling templatetags


【解决方案1】:

您需要在“主”模板和“子”模板上调用importNode。接下来,将 subTemplate 附加到 mainTemplate 节点。最后,这需要附加到#wrapper div。

我还将模板移出#wrapper div,因为我假设#wrapper 是您将创建所有元素的地方。我的代码如下:

document.querySelector('#memoryLauncher').onclick = function () {
  let templates = document.querySelectorAll('template');
  let mainTemplate =   templates[0].content.firstElementChild;
  let mainNode = document.importNode(mainTemplate, true);

  let subTemplate = templates[1].content.firstElementChild;
  let div = document.importNode(subTemplate, true);
  mainNode.appendChild(div);

  let container = document.querySelector('#wrapper')
  container.appendChild(mainNode);

  startMemory(4, 4)
}

document.querySelector('#chatLauncher').onclick = function () {
  let templates = document.querySelectorAll('template');
  let mainTemplate =   templates[0].content.firstElementChild;
  let mainNode = document.importNode(mainTemplate, true);

  let subTemplate = templates[2].content.firstElementChild;
  let div = document.importNode(subTemplate, true);
  mainNode.appendChild(div);

  let container = document.querySelector('#wrapper');
  container.appendChild(mainNode);


  let chat = new Chat(document.querySelector('.windowContent'))
  chat.connect().then(function (socket) {
  })
}

【讨论】:

  • 因为它是我希望克隆到的第一个模板,我相信我需要使用 let mainTemplate = document.querySelectorAll('template')[0].content.firstElementChild; 指定它,或者我将它与类作为目标:let mainTemplate = document.querySelector('.myTemplate').content.firstElementChild;
  • 看来我误解了你的问题。你有多个“主模板”吗?
  • 否,但每个事件都应打开一个新的主模板元素,其中包含两个子模板元素中的任何一个。因此,如果我四次按下其中一个事件按钮,我应该得到四个主模板元素,每个元素都有一个子模板元素。现在我得到一个带有四个子模板元素的主模板元素......对不起,如果问题中没有出现。
猜你喜欢
  • 2019-04-29
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多