我正在制作一个西蒙游戏,其中有四个四分之一圆,它们的类名均为“ colorButton”:红色,黄色,蓝色和绿色。
我希望这样做,以便在计算机旋转时,所有指向4个彩色圆圈的指针事件都被禁用,因此您无法单击它们。
在我的代码中,我使用:
const colorButtons = document.getElementsByClassName('colorButton');
colorButtons.style.pointerEvents = 'none';
但我收到此控制台错误:
Uncaught TypeError: Cannot set property 'pointerEvents' of undefined
at App.computerMove (http://localhost:8080/bundle.js:14010:42)
at App.startGame (http://localhost:8080/bundle.js:13997:14)
我在这里做错什么了吗?
完整代码供参考:
import React, { Component } from 'react';
import ColorButton from './colorbutton';
export default class App extends Component {
constructor(props) {
super(props);
this.state = {
powerOn: false,
start: false,
myTurn: false,
compMoves: ['red', 'yellow', 'blue', 'green'],
myMoves: [],
count: null
};
this.colors = ['green', 'red', 'yellow', 'blue'];
this.powerOn = this.powerOn.bind(this);
this.startGame = this.startGame.bind(this);
this.highlightBtn = this.highlightBtn.bind(this);
this.computerMove = this.computerMove.bind(this);
}
startGame() {
const { powerOn } = this.state;
if (powerOn) {
this.setState({ start: true });
this.computerMove();
}
}
computerMove(){
if (!this.state.myTurn) {
const randNum = Math.floor(Math.random() * 4);
const randColor = this.colors[randNum];
const count = this.state.count;
const colorButtons = document.getElementsByClassName('colorButton');
colorButtons.style.pointerEvents = 'none';
const compMoves = this.state.compMoves.slice();
compMoves.push(randColor);
var i=0;
const repeatMoves = setInterval(() => {
this.highlightBtn(compMoves[i]);
i++;
if (i >= compMoves.length) {
clearInterval(repeatMoves);
}
}, 1000);
this.setState({
compMoves: compMoves,
myTurn: true,
count: count + 1
});
}
}
highlightBtn(color) {
const audio = document.getElementById(color+'Sound');
audio.play();
const selectColor = document.getElementById(color);
selectColor.style.opacity = 0.5;
setTimeout(() =>{ selectColor.style.opacity = 1}, 200);
}
powerOn(event) {
const { powerOn } = this.state;
if (!powerOn) { this.setState({ powerOn: true }) }
else { this.setState({ powerOn: false }) }
}
render() {
console.log('moves:', this.state.compMoves);
const { count } = this.state;
return(
<div className='container'>
<div className='outer-circle'>
<ColorButton
color='green'
handleClick={() => this.highlightBtn('green')}
/>
<ColorButton
color='red'
handleClick={() => this.highlightBtn('red')}
/>
<ColorButton
color='yellow'
handleClick={() => this.highlightBtn('yellow')}
/>
<ColorButton
color='blue'
handleClick={() => this.highlightBtn('blue')}
/>
<div className='inner-circle'>
<h2>Simon®</h2>
<div className='count-box'>
<div className='count-display'>{count ? count : '--'}</div>
<div className='small-text'>Count</div>
</div>
</div>
</div>
<div className='controls'>
<div className='power-box'>
<div className='power-text'>OFF</div>
<label className="switch">
<input type="checkbox" onChange={this.powerOn}/>
<div className="slider round"></div>
</label>
<div className='power-text'>ON</div>
</div>
<div className='buttons'>
<div className='start-box'>
<div className='start-button' onClick={this.startGame}></div>
<div className='small-text'>Start</div>
</div>
<div className='strict-box'>
<div className='strict-button'></div>
<div className='small-text'>Strict</div>
</div>
</div>
</div>
<p className='footer'>
Source code on <a href='https://github.com/drhectapus/react-simon-game'>Github</a>
</p>
</div>
)
}
}
错误的原因是getElementsByClassName返回了类似数组的对象。因此,它没有样式属性。因此,colorButtons.style是未定义的,并且colorButtons.style.pointerEvents会导致您的错误。
我还要指出,虽然您的一般方法是完全没有反应的。您几乎永远都不想像这样直接更改DOM。使用React,您只需定义组件应如何呈现给定的道具和状态。更改DOM的一个大问题是,每次触发重新渲染时,所做的更改都会消失。我会考虑处理您要使用的类似方法:
<ColorButton
color='green'
disabled={ !this.state.myTurn }
handleClick={() => this.highlightBtn('green')}
/>
class ColorButton extends Component {
render() {
return (
<div style={{ pointerEvents: this.props.disabled ? 'none' : 'auto' }}>
...
</div>
)
}
}
我已经在谷歌云功能中构建了API。当我试图直接获取API时,会出现CORS错误。虽然我添加了,但失败了。 来自“http://localhost:3000”的“https://xxxxxxxx.com”已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上没有“access-control-allog-origin”标头。如果一个不透明的响应满足您的需要,请将请求的模式设置为“n
我用react-native做了一个移动应用程序(目前只有Android系统,它不是一个世博会应用程序),我想禁止用户在应用程序打开时截图。我知道这是不可能完全禁用这一点,但我想使它至少更难采取截图。我发现了一些示例,但我不知道如何实现它们,例如: 如何在Android中防止截屏 有人知道如何设置一个标志,这样我的react-native(android)应用程序的用户在使用该应用程序时就不能截图
问题内容: CSS-属性 在Firefox中可以正常工作,但在Internet Explorer 9-10中却不能。 有没有办法在IE中实现此属性的相同行为?有任何想法吗? 问题答案: 从MDN文档中: 警告:在CSS中将指针事件用于非SVG元素是实验性的。该功能曾经是CSS3UI草案规范的一部分,但由于存在许多未解决的问题,因此已推迟到CSS4。基本上,在这里阅读更多关于非SVG(可缩放矢量图形
我在spring boot应用程序上开发了rest API。API只接受GET和POST,但在使用OPTIONS方法请求时,API响应200状态(而不是405)。我搜索了这个问题,但是没有一个解决方案是基于springboot的。 答复: 需要禁用OPTIONS方法。
我正在尝试dockerise一个反应应用程序。我正在使用以下Dockerfile来实现这一点。 还有,在我的包裹里。json开始脚本被定义为
我在主页组件中有这个代码,当按下向下/向上箭头键时,什么也没有发生。我刚刚意识到,当用ctrl键按箭头键时,eventhandler可以正常工作。我到处找,但什么也没找到。有人能帮忙吗?我的浏览器是Chrome v.96。React版本17.0.2,节点v.16.13.1