【问题标题】:change the button value and color on click单击时更改按钮值和颜色
【发布时间】:2021-05-26 09:25:16
【问题描述】:

我正在接受 PHP laravel web 开发方面的培训

但是我在前端有两个小任务,我没有时间学习前端来完成它们,请帮助解决它们。

我有 4 个按钮和 1 个按钮:

       <button> trans('navbar.Students')</buttom>
       <button> trans('navbar.Schools')</buttom>
       <button> trans('navbar.teachers')</buttom>
       <button> trans('navbar.teachers')</buttom>

                       <p> </p>   

我想要以下内容: 当用户按下其中一个按钮时:

   1- Change the button color.
   2- Putting the value of the button that was pressed in <p>.
  • 例如有人点击按钮1: 按钮颜色将变为蓝色,p值为

    Students

【问题讨论】:

  • 与 Laravel / PHP 无关,你的 CSS 和 JS 在哪里?

标签: javascript html css


【解决方案1】:

遍历按钮节点列表,添加事件监听器。

设置一个函数来运行一个for循环来比较每个循环的索引。确保当前迭代类列表不是未定义的(如果未定义,则会抛出错误)。默认情况下,删除选择时的背景颜色,请检查索引是否匹配,如果要添加bg颜色,并将p标签设置为textcontent textcontent textcontent textcontent toxtcontent在当前按钮的文本续写中,使用具有背景色和颜色规则集的类。

const button = document.querySelectorAll('.btn')
const display = document.querySelector('#display')

const setSelection = (btnEl, index, parEl) => {
  for (let key in btnEl) {
    if (btnEl[key].classList !== undefined) {
      btnEl[key].classList.remove('blue')
      if (index == key) {
        btnEl[key].classList.add('blue')
        parEl.textContent = btnEl[key].textContent
      }
    }
  }
}

button.forEach((btn, i) => {
  btn.addEventListener('click', (e) => {
     setSelection(button,i,display)
  })
})
.blue {
  background-color: blue;
  color: white;
}
<button class="btn">Value 1</button>
<button class="btn">Value 2</button>
<button class="btn">Value 3</button>
<button class="btn">Value 4</button>

<p id="display"></p>

【讨论】:

  • 不需要undefined 检查,因为没有类的元素的classList 只是长度为0 的classList。此外,这个答案几乎相同 i> 去我的。
【解决方案2】:

var buttons = document.querySelectorAll(".my-button");
var para = document.querySelector("#my-para");

buttons.forEach((button, i) => {
  button.addEventListener("click", () => {
    select(i);
    para.innerHTML = button.innerHTML;
  });
});

function select(num) {
  buttons.forEach((button, i) => {
    if (i === num) return button.classList.add("active");
    button.classList.remove("active");
  });
}
.active {
  background: blue;
}
<button class="my-button">AAA</button>
<button class="my-button">BBB</button>
<button class="my-button">CCC</button>
<button class="my-button">DDD</button>
<p id="my-para"></p>

这是一个旧答案,但回到它,我想展示一种方法,即使在重新加载页面后也能保持选择答案,只使用 JavaScript。解决方案在于使用localStorage。 (它在 Stack Snippets 中不起作用,因此请使用 this Jsitor link

【讨论】:

  • 优秀的答案,记住 reset 以获得更好的 UI。
  • 谢谢你的帮助,但是刷新后,所有这些都被重置了,我可以在刷新后保存页面状态吗?因为导航栏上的按钮链接,当有人点击它时,状态会改变
  • @Jades 你可以使用你的 PHP,如果他们选择了它,则回显类“活动”
【解决方案3】:

你可以用javascript做,这里是例子:

document.querySelectorAll('button').forEach(function(item){
   item.addEventListener('click', function(e){
      e.target.style.background = 'red';
      e.target.setAttribute('value', 'yourValue');
   });
});

【讨论】:

  • 使用 classListtoggleadd 等代替(参见 stackoverflow.com/a/66997191/383904)。样式不应该是 JS 的一部分,而是 CSS 的一部分。
  • 是的,我知道,我只是举了一些 javascript 的例子来理解事件监听器。
  • 另外,请始终使用Event.currentTarget。仅当您真正知道自己在做什么时才使用Event.target
【解决方案4】:

这是我的解决方案:

function go(theButton){
    theButton.style.background = 'blue';
  theButton.style.color = 'white';
    document.getElementById("gg").textContent=theButton.textContent;
}
<button onclick="go(this)"> Students</button>
<button onclick="go(this)"> Schools</button>
<button onclick="go(this)"> teachers</button>
<button onclick="go(this)"> teachers</button>

<p id="gg"> </p>

【讨论】:

  • 不要使用内联 JavaScript on* 处理程序 - 就像你希望不要使用内联 CSS style 属性一样。脚本和样式应该在它们的相关文件或标签中。此外,在您的示例中,没有选项可以重置以前的按钮状态,这使它成为一个奇怪的 UI。
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 2012-12-06
  • 2014-08-26
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2021-05-21
相关资源
最近更新 更多