开发者问题收集

JS:删除元素的所有属性

2021-12-07
213

您知道在构建过程中为元素分配属性非常有用且高效。基本上,元素是一个可以分配给任何东西的对象:

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,而不是默认的,例如 styleparentNode 等)


我如何遇到问题

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)
2个回答

这可能不是一个好主意(正如 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});
esqew
2021-12-07

如果您能在 jsPlumb 的 Github 上为此开一个问题,那就太好了。没有提到具体问题是什么,但如果有错误,我们想知道。

(编辑)

是这个问题吗?

https://github.com/jsplumb/jsplumb/issues/1077

这里没有 jsPlumb 的错误。您没有从拥有连接的实例调用删除。

jsPlumb Team
2021-12-19