2017-02-01 4 views
1

У меня есть select[multiple], который я дал класс custom-multiselect на моей странице, для которой я уловивший DOMSubtreeModified событие следующим образом:Реализация MutationObserver вместо DOMSubtreeModified

HTML:

<select class="custom-multiselect"></select> 

JQuery:

$('.custom-multiselect').each(function (i, select) { 
    var sel = this; 
    adjustHeight(sel); //Custom function 
    //Binding DOMSubtreeModified to catch if the select list gets modified by the user 
    $(sel).on('DOMSubtreeModified', function() {    
     adjustHeight(sel); 
    }); 
    //For Internet Explorer 
    $(sel).on('propertychange', function() { 
     adjustHeight(sel); 
    }); 
}); 

Этот подход работает безупречно. Я хочу преобразовать функцию DOMSubtreeModified в MutationObserver, так как DOMSubtreeModified амортизируется.

Так что я сделал что-то вроде этого:

var observer = new MutationObserver(function (mutation) { 
    mutation.forEach(function (m) { 
     if (m.type == 'subtree') { 
      adjustHeight(this);//Can I use m.target here? 
     } 
    }); 
}); 
observer.observe(document.querySelector('select.custom-multiselect'), { 
    subtree: true 
}); 

Но я в конечном итоге получить ошибки

TypeError: The expression cannot be converted to return the specified type.

Как я могу конвертировать мой DOMSubtreeModified событие наблюдается в MutationObserver?

+1

'this' в' adjustHeight' наверняка не будет, что вы хотите - пытались ли вы м. цель? –

+0

Я сделал, но я получаю вышеупомянутую ошибку, это не дает мне знать, работает ли m.target или нет: -S – progrAmmar

+0

ОК, прочитайте [документацию] (https://developer.mozilla.org/en/docs/Web/API/MutationObserver # MutationObserverInit) - ** По крайней мере, childList, атрибуты или characterData должны быть установлены в true. В противном случае «была указана недопустимая или недопустимая строка» ошибка выбрана ** - также нет мутации '.type ==« поддерево »' - я удивлен, что ваш код добирается настолько, насколько вы утверждаете, - о, я вижу, эта ошибка связана с тем, что вы не установили хотя бы один из 'childList',' attributes' или 'characterData' в true ... –

ответ

4
  • Поместите код вместо старого события DOM и используйте переменную sel в качестве цели наблюдения;
  • Используйте опцию childList в MutationObserver, потому что subtree не определяет, что искать;
  • Нет необходимости проверять мутации, поскольку вы подписываетесь только на один тип.

$('.custom-multiselect').each(function() { 
    var sel = this; 
    adjustHeight(sel); 

    new MutationObserver(function() { 
     adjustHeight(sel); 
    }).observe(sel, {childList: true, subtree: true}); 
}); 

Или, если вам нравится .bind по некоторым причинам:

new MutationObserver(adjustHeight.bind(null, sel)) 
    .observe(sel, {childList: true, subtree: true}); 
+0

Спасибо, я попробую это – progrAmmar

+0

Это работает спасибо! – progrAmmar

Смежные вопросы