javascript - 无法获取未定义或空引用的属性“classList” - 在第一次 MouseClick
问题描述
我只是想编写一个 svg 编辑器,当然我有一些事件。
我的实际问题属于更改 svg 元素的类列表,单击它时,将其标记为选中,并带有一些 css 样式。
因此,从数据库中加载的每个符号都会获得可拖动和预览的类以及在鼠标单击时触发的事件监听器。
$(document).ready(function () {
...some code...
addSymbolMouseEvents(document.getElementsByClassName('draggable'));
}
function addSymbolMouseEvents(svgSymbols) {
for (var i = 0; i < svgSymbols.length; i++) {
svgSymbols[i].addEventListener('mouseenter', symbolMouseEnter);
svgSymbols[i].addEventListener('mouseover', symbolMouseOver);
svgSymbols[i].addEventListener('mouseout', symbolMouseOut);
svgSymbols[i].addEventListener('click', symbolClick);
svgSymbols[i].addEventListener('dblclick', symbolDblClick);
svgSymbols[i].addEventListener('contextmenu', symbolRightClick);
}
return svgSymbols;
}
到目前为止它有效,点击被触发。现在,如果单击一个元素,该元素应该选择类并且应该删除类预览,因此笔划宽度由类样式更改:
function symbolClick(evt) {
//deselect all symbols
var selectableSymbols = document.getElementsByClassName('selected');
for (var i = 0; i < selectableSymbols.length; i++) {
selectableSymbols[i].classList.remove("selected");
selectableSymbols[i].classList.add("preview");
}
//select the firing symbol
this.classList.add("selected");
this.classList.remove("preview");
}
<style type="text/css">
svg {
border: 1px dotted #808080;
width: 100%;
height: 500px;
background: #fafafa;
}
.selected {
stroke-width: 1;
opacity: 1;
stroke: #0026ff
}
.draggable {
cursor: grab;
/*stroke-width: 0.8;
stroke: #000000;
opacity: 0.8;*/
}
.preview {
cursor: grab;
stroke-width: 0.8;
stroke: #000000;
opacity: 0.8;
}
.mouseovereffect {
opacity: 1;
stroke-width: 1;
}
</style>
我不知道为什么,但我只能在第二次点击时运行它。在第一次单击时,每个预览样式都会被删除,而在第二次单击时,选定的样式会被设置。有没有更简单的方法来突出显示选定的符号?
解决方案
不,
这个
我认为是指触发事件的符号。
现在我改变了css样式的顺序,所以我不必删除预览类。实际上它是这样工作的:
//remove al selected-classes
var selectableSymbols = document.getElementsByClassName('selected');
for (var i = 0; i < selectableSymbols.length; i++) {
selectableSymbols[i].classList.remove("selected");
}
//add new selected
this.classList.add("selected");
推荐阅读
- rust - 无法打开创世配置文件
- c# - Unity IOException:在 output_log.txt 的路径上共享冲突,如何读取正在使用的文件?
- python - 使模型的第一个实例在 SQLAlchemy 中具有唯一字段
- swift - SWIFTUI Firebase 检索子集合数据
- qt - 是否在 deleteLater() 之前调用了所有 Qt 插槽?
- c - 在 GDB 中使用便利变量的地址
- java - 尝试保存图像时出现 Android 运行时错误
- java - 有谁知道如何自动在手机屏幕上找到坏点?
- arrays - 检测 shell 脚本中的 ksh 数组支持
- javascript - 如何在 Jest 中跟踪失败的异步测试?