JS:删除元素的所有属性
您知道在构建过程中为元素分配属性非常有用且高效。基本上,元素是一个可以分配给任何东西的对象:
let el = document.createElement('div');
el.a = 1;
el.b = [];
class C{}
el.c = new C()
并且在测试中这些实际上运行良好,返回了可靠的结果;
console.log(el.a); // 1
我寻求一种详细观察和操纵这些操作的方法。
例如,我想获取所有分配值的对象:
// something like
el.assigned // {a: 1, b: [], ...}
以及一个
删除所有
的方法(仅分配插件 javascript,而不是默认的,例如
style
、
parentNode
等)
我如何遇到问题
JsPlumb is a DOM element connectivity library archived by SVG, newest version 5.2.2 on Github, however not a browser release yet. currently stable version on CDN JS
值得一提的两个 API:
-
instance.connect
:创建并返回一个实例对象,同时将 SVG 结果渲染到Dom。 -
jsPlumb.deleteConnection
,以连接对象为参数执行删除操作。
但是,lib 似乎在 connect 中使用元素进行缓存,而 deleteConnection 不会完全分离所有引用,代码会遇到问题。删除后,我们无法再连接。在测试中,在 @esqew 的帮助下,证明了一个变量
_jsPlumbConnections
被分配给元素 props,而 lib 认为它仍然存在。
// when you tries to connect again, the lib seems verifying through the assigned props and run into bug
TypeError: null is not an object (evaluating 'x.endpoints[0]') jsPlumb.min.js
this.plumb.bind('click', function(conn){
connect.connections.splice(connect.connections.indexOf(conn.cn), 1);
jsPlumb.deleteConnection(conn);
console.log(Object.keys(conn.cn.source));
attr_element({id: null, class: null}, conn.cn.source.backup);
attr_element({id: null, class: null}, conn.cn.target.backup);
connect.render();
});
// ["_jsPlumbConnections"] (1)
这可能不是一个好主意(正如 OP 上的评论所规定的那样),但您可以使用扩展运算符在使用
document.createElement
创建的元素上完成此操作,它仅返回您以这种方式添加的键:
var element = document.createElement('div');
element.a = 'foo';
element.b = 'bar';
element.c = 4;
console.log({...element});
然后,您可以通过使用
Object.keys()
进行迭代来将它们全部删除:
var element = document.createElement('div');
element.a = 'foo';
element.b = 'bar';
element.c = 4;
console.log({...element});
Object.keys(element).forEach(key => delete element[key]);
console.log({...element});
如果您能在 jsPlumb 的 Github 上为此开一个问题,那就太好了。没有提到具体问题是什么,但如果有错误,我们想知道。
(编辑)
是这个问题吗?
https://github.com/jsplumb/jsplumb/issues/1077
这里没有 jsPlumb 的错误。您没有从拥有连接的实例调用删除。