我想为我的投资组合项目创建一个打字游戏.我是编程新手. 我希望呈现div中的每个随机单词,以及该div中包装在span标记中的每个字符. 我实现了对div的呈现,但似乎不可能将字符换行到span标记中.我试了很多方法,但都不能奏效.

与我最接近的是这个函数,它将单词和父元素作为参数,并在该父元素中创建跨区

    function spanifyWords(word, parent){
     for (i=0 ; i< word.length; i++){
         let newSpan = document.createElement("span");
         newSpan = parent.appendChild(newSpan);
         newSpan.innerHTML += word[i];
            }
        }

如果我调用这个函数,例如

spanifyWords("hello", wordsContainer) ;

然后它创建5个span标签,每个char都在主div中. 只要我不在其他函数中调用它,这个函数就可以很好地工作,因为它在主div(wordsContainer)中呈现div.

function renderDivs(n){
            for (i=0; i<n; i++){
                let randomIndex = Math.floor(Math.random()*wordsCount)
                let randomWord = newArray[randomIndex];
                let newDiv = document.createElement("div")   
                 newDiv = wordsContainer.appendChild(newDiv)
                newDiv.innerHTML += spanifyWords(randomWord, newDiv);   //  this needs attention
            
        }

    }

我的猜测是,我在第二个函数的最后一行做错了什么.这两个函数都不能配置父函数,或者是Java innerHTML不接受函数作为值.

有人能告诉我第二个功能出了什么问题吗?

推荐答案

  • For循环的i = 0应为let i = 0;,否则将设置为全局作用域
  • 不需要重置newSpan = parent.append(newSpan);,只需使用parent.append(newSpan);
  • 只使用wordsContainer.append(newDiv);而不使用innerHTML = -该任务已经在spanifyWords函数中完成
  • 在该用的地方用const

const wordsContainer = document.querySelector("#wordsContainer");
const newArray = ["hello", "world", "lorem", "ipsum"];
const wordsCount = newArray.length;

function spanifyWords(word, parent){
  for (let i=0 ; i < word.length; i++){
    const newSpan = document.createElement("span");
    parent.append(newSpan);
    newSpan.textContent = word[i];
  }
}

function renderDivs(n){
  for (let i=0; i<n; i++){
    const randomIndex = Math.floor(Math.random() * wordsCount);
    const randomWord = newArray[randomIndex];
    const newDiv = document.createElement("div"); 
    wordsContainer.append(newDiv);
    spanifyWords(randomWord, newDiv);
  }
}

renderDivs(6);
#wordsContainer * {
  outline: 1px solid #000;
  padding: 1rem;
  font: 1rem/1 sans-serif;
}
  <div id="wordsContainer"></div>

以下也是上述代码的一个细微变化:

// Utility functions
const el = (sel, par) => (par || document).querySelector(sel);
const els = (sel, par) => (par || document).querySelectorAll(sel);
const elNew = (tag, prop) => Object.assign(document.createElement(tag), prop);
const repeat = (n, cb) => [...Array(n)].forEach((_, i) => cb(i));

// Wordify
const elWords = el("#wordsContainer");
const words = ["hello", "world", "lorem", "ipsum"];

const spanify = (word) => [...word].reduce((a, x) => a + `<span>${x}</span>`, "");

function renderDivs(n){
  repeat(n, () => {
    const randomIndex = Math.floor(Math.random() * words.length);
    const randomWord = words[randomIndex];
    const elDiv = elNew("div", { innerHTML: spanify(randomWord) });
    elWords.append(elDiv);
  });
}

renderDivs(6);
#wordsContainer * {
  outline: 1px solid #000;
  padding: 1rem;
  font: 1rem/1 sans-serif;
}
<div id="wordsContainer"></div>

Javascript相关问答推荐

微软Edge Select 间隙鼠标退出问题

从实时数据库(Firebase)上的子类别读取数据

我应该绑定不影响状态的函数吗?'

为什么我的列表直到下一次提交才更新值/onChange

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

这个值总是返回未定义的-Reaction

从页面到应用程序(NextJS):REST.STATUS不是一个函数

使用Nuxt Apollo在Piniastore 中获取产品细节

如何使用TypeScrip设置唯一属性?

VSCode中出现随机行

搜索功能不是在分页的每一页上进行搜索

使用插件构建包含chart.js提供程序的Angular 库?

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

将以前缓存的 Select 器与querySelector()一起使用

相对于具有选定类的不同SVG组放置自定义工具提示

将匿名函数附加到链接的onClick属性

我如何让我的弹力球在JavaScript和HTML画布中相互碰撞后改变 colored颜色 ?