diff --git a/dom/include/dom/dom_manager.h b/dom/include/dom/dom_manager.h index 5a0c22a57..21788630f 100644 --- a/dom/include/dom/dom_manager.h +++ b/dom/include/dom/dom_manager.h @@ -46,7 +46,7 @@ class DomManager { void RemoveEventListener(uint32_t id, const std::string &name, bool use_capture); void CallFunction(uint32_t id, const std::string &name, const DomValue ¶m, const CallFunctionCallback &cb); - + void AddListenerOperation(std::shared_ptr node, const std::string& name); std::tuple GetRootSize(); void SetRootSize(float width, float height); void AddLayoutChangedNode(const std::shared_ptr &node); @@ -72,6 +72,7 @@ class DomManager { using DomOperation = std::function; std::vector batched_operations_; + std::vector add_listener_operations_; std::vector> layout_changed_nodes_; }; diff --git a/dom/src/dom/dom_manager.cc b/dom/src/dom/dom_manager.cc index afb4b1cdb..00955552c 100644 --- a/dom/src/dom/dom_manager.cc +++ b/dom/src/dom/dom_manager.cc @@ -105,6 +105,11 @@ void DomManager::EndBatch() { for (auto& batch_operation : batched_operations_) { batch_operation(); } + batched_operations_.clear(); + for (auto& batch_operation : add_listener_operations_) { + batch_operation(); + } + add_listener_operations_.clear(); layout_changed_nodes_.clear(); // 触发布局计算 root_node_->DoLayout(); @@ -144,6 +149,13 @@ void DomManager::CallFunction(uint32_t id, const std::string &name, node->CallFunction(name, param, cb); } +void DomManager::AddListenerOperation(std::shared_ptr node, const std::string& name) { + add_listener_operations_.emplace_back([this, node, name]() { + TDF_BASE_DCHECK(render_manager_); + render_manager_->AddEventListener(node, name); + }); +} + std::tuple DomManager::GetRootSize() { TDF_BASE_DCHECK(root_node_); return root_node_->GetLayoutSize(); diff --git a/dom/src/dom/dom_node.cc b/dom/src/dom/dom_node.cc index 6ad10eb6c..9b89d575b 100644 --- a/dom/src/dom/dom_node.cc +++ b/dom/src/dom/dom_node.cc @@ -116,9 +116,7 @@ uint32_t DomNode::AddEventListener(const std::string &name, bool use_capture, auto dom_manager = dom_manager_.lock(); TDF_BASE_DCHECK(dom_manager); if (dom_manager) { - auto render_manager = dom_manager->GetRenderManager(); - TDF_BASE_DCHECK(render_manager); - render_manager->AddEventListener(shared_from_this(), name); + dom_manager->AddListenerOperation(shared_from_this(), name); } } if (use_capture) {