如何改造src_observer方法支持传入自定义函数与元素实现逻辑复用
实现方案
该需求完全可以实现,核心思路是把固定的src变化触发逻辑抽离为可传入的自定义回调函数,同时支持传入自定义上下文参数供回调内部使用。
改造后的src_observer方法
function src_observer(target_node, options = {}) { // 解构参数,保留原有默认逻辑作为降级,旧代码无需修改即可正常运行 const { callback = () => { target_node.show(); target_node.next().remove(); }, ...customParams } = options; let observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.attributeName === 'src') { // 执行回调,将mutation、监听目标节点、自定义参数全部透出 callback(mutation, target_node, customParams); } }); observer.disconnect(); }); // 兼容JQuery对象和原生DOM节点两种传入格式 observer.observe(target_node[0] ?? target_node, { attributes: true, attributeFilter: ['src'] }); }
调用示例
原有业务场景(无兼容成本)
原有调用方式无需修改即可沿用旧逻辑:
src_observer(your_target_node);
新自定义业务场景
const target_node = videoWrapper.html(videoElement).children('iframe'); // 传入自定义逻辑和需要的额外元素 src_observer(target_node, { videoWrapper, element, cover, callback: (mutation, target_node, params) => { const { videoWrapper, element, cover } = params; videoWrapper.parents().eq(1).children('.onetrust_container').remove(); videoWrapper.parent().show(); videoWrapper.show(); element.fadeOut(500); cover.fadeOut(500); } });
方案说明
- 不需要预先定义固定的参数字段名,支持传入任意自定义参数,灵活性更高
- 完全兼容现有两种代码的节点获取逻辑,无需额外调整业务代码
- 支持后续任意新增的src监听业务场景,无需重复编写MutationObserver基础逻辑
内容的提问来源于stack exchange,提问作者user16645285
相关产品推荐
相关产品推荐

