Javascript 如何避免观察者变异中的代码重复

Javascript 如何避免观察者变异中的代码重复,javascript,Javascript,有以下结构(示例本身不起作用,在这里理解结构): 在这个结构中,一些动作是重复的。如何避免JS代码重复?例如,在自调用函数中 //ObserverAddRule 函数ObserverAddRule(){ const target1=document.querySelector(“#form_edit_rule.sc”) const target2=document.querySelector(“#form_edit_rule.sc1”) 常量配置={ 儿童名单:对 } 常量回调=函数(muta

有以下结构(示例本身不起作用,在这里理解结构):

在这个结构中,一些动作是重复的。如何避免JS代码重复?例如,在自调用函数中

//ObserverAddRule
函数ObserverAddRule(){
const target1=document.querySelector(“#form_edit_rule.sc”)
const target2=document.querySelector(“#form_edit_rule.sc1”)
常量配置={
儿童名单:对
}
常量回调=函数(mutationsList,observer){
for(让突变列表突变){
if(mutation.type==='childList'){
(功能(){
让scFrstItem=Array.from(document.queryselectoral('.sc.acrList.frstItem.mySelect')).slice(-1)
让scndItem=Array.from(document.queryselectoral('.sc.acrList.scndItem.scnd-title.mySelect')).slice(-1)
设元素=scFrstItem.concat(scnditem)
initChoices(false、、false、false、scElements)
delegateEventChoices()//
})();
(功能(){
让sc1FrstItem=Array.from(document.queryselectoral('.sc1.acrList.frstItem.mySelect')).slice(-1)
让sc1ScndItem=Array.from(document.queryselectoral('.sc1.acrList.scndItem.scnd-title.mySelect')).slice(-1)
设SC1元素=sc1FrstItem.concat(sc1ScndItem)
initChoices(false、、false、false、元素)
delegateEventChoices()//
})();
}
}
}
const observer=新的MutationObserver(回调)
观察者观察(target1,配置)
观察者观察(target2,配置)
}




避免重复的唯一方法是使用参数

自调用函数旨在现场运行,仅一次,不打算重复

因此,如果您有重复的功能,那么可以对可更改的数据使用单独的功能和/或参数

两种可能的解决办法:

  • 将参数传递给自调用函数
  • const callback=函数(mutationsList,observer){
    for(让突变列表突变){
    if(mutation.type==='childList'){
    (函数(名称空间){
    for(让名称空间中的名称空间){
    让scFrstItem=Array.from(document.queryselectoral(namespace+'.acrList.frstItem.mySelect')).slice(-1)
    让scndItem=Array.from(document.queryselectoral(namespace+'.acrList.scndItem.scnd-title.mySelect')).slice(-1)
    设元素=scFrstItem.concat(scnditem)
    initChoices(false、、false、false、scElements)
    delegateEventChoices()//
    }
    })(['.sc','.sc1']);
    }
    }
    }
    
  • 创建单独的、可调用的函数
  • const doSomething=函数(名称空间){
    让scFrstItem=Array.from(document.queryselectoral(namespace+'.acrList.frstItem.mySelect')).slice(-1)
    让scndItem=Array.from(document.queryselectoral(namespace+'.acrList.scndItem.scnd-title.mySelect')).slice(-1)
    设元素=scFrstItem.concat(scnditem)
    initChoices(false、、false、false、scElements)
    delegateEventChoices()//
    };
    常量回调=函数(mutationsList,observer){
    for(让突变列表突变){
    if(mutation.type==='childList'){
    剂量测定法('sc');
    剂量测定法('.sc1');
    }
    }
    }
    

    如果您需要更具体的答案,请发布更具体的片段。

    我不知道为什么创建此票证。显然,已经太晚了,我的大脑也累了。今天早上,我试着像往常一样去做,结果成功了,但您有一个非常有趣的实现方法。沙箱:
    const callback = function (mutationsList, observer) {
      for (let mutation of mutationsList) {
        if (mutation.type === 'childList') {
    
          (function(namespaces){
            for(let namespace in namespaces) {
              let scFrstItem = Array.from(document.querySelectorAll(namespace + ' .acrList .frstItem .mySelect')).slice(-1) 
              let scScndItem = Array.from(document.querySelectorAll(namespace + ' .acrList .scndItem.scnd-title .mySelect')).slice(-1) 
    
              let scElements = scFrstItem.concat(scScndItem)
    
              initChoices(false, '', false, false, scElements) 
              delegateEventChoices() // <here you need to pass .sc>
            }
          })(['.sc', '.sc1']);
        }
      }
    }
    
    const doSomething = function(namespace){
        let scFrstItem = Array.from(document.querySelectorAll(namespace + ' .acrList .frstItem .mySelect')).slice(-1) 
        let scScndItem = Array.from(document.querySelectorAll(namespace + ' .acrList .scndItem.scnd-title .mySelect')).slice(-1) 
    
        let scElements = scFrstItem.concat(scScndItem)
    
        initChoices(false, '', false, false, scElements) 
        delegateEventChoices() // <here you need to pass .sc>
    };
    
    const callback = function (mutationsList, observer) {
      for (let mutation of mutationsList) {
        if (mutation.type === 'childList') {
          doSomething('.sc');
          doSomething('.sc1');
        }
      }
    }