Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2018, 16:33
Кандидат Javascript-наук
Отправить личное сообщение для yaparoff Посмотреть профиль Найти все сообщения от yaparoff
 
Регистрация: 26.04.2016
Сообщений: 106

Метод closest не срабатывает на IE 10,11 (?)
Не срабатывает метод closest на IE 11
_removeImage(e) {
    const imageItem = e.target.closest('.add-images__item');
    this.imagesRow.removeChild(imageItem);
    if(!this.imagesRow.querySelector('.add-images__item')) {
      this.imagesRow.classList.add('visually-hidden');
    }
  }


В IE11, который установлен у меня на рабочей машине (Windows 10) приведенный выше код работает корректно.
Когда тестируешь на browserstack, выбираешь Windows 10 -> IE 11
то приведенный ниже код не работает. Указывает что const imageItem = null

Вот и думаю что за ерунда и как это исправить.
Нашел вот такой код-полифил
(function(ELEMENT) {
    ELEMENT.matches = ELEMENT.matches || ELEMENT.mozMatchesSelector || ELEMENT.msMatchesSelector || ELEMENT.oMatchesSelector || ELEMENT.webkitMatchesSelector;
    ELEMENT.closest = ELEMENT.closest || function closest(selector) {
        if (!this) return null;
        if (this.matches(selector)) return this;
        if (!this.parentElement) {return null}
        else return this.parentElement.closest(selector)
      };
}(Element.prototype));


и еще вот

(function(e){ 
 e.closest = e.closest || function(css){ 
   var node = this;
  
   while (node) { 
      if (node.matches(css)) return node; 
      else node = node.parentElement; 
   } 
   return null; 
 } 
})(Element.prototype)



Но как их сюда подставить? У меня просто проект большой, все в ООП. Этих closest там много и что мне каждый раз прописывать этот фикс в месте где closest встречается? Меня еще смущает то, что это IIFE-функция и куда ее прописывать?

до этого просто не использовал такие полифиллы. Надеюсь на помощь
Ответить с цитированием
  #2 (permalink)  
Старый 12.11.2018, 16:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

yaparoff,
добавить один раз на страницу в начале
<script src="https://cdn.polyfill.io/v1/polyfill.js?Element.prototype.closest"></script>
Ответить с цитированием
  #3 (permalink)  
Старый 12.11.2018, 18:59
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

или вот этот код в начало скрипта.
(function(ELEMENT) {
	ELEMENT.matches = ELEMENT.matches || ELEMENT.mozMatchesSelector || ELEMENT.msMatchesSelector || ELEMENT.oMatchesSelector || ELEMENT.webkitMatchesSelector;
	ELEMENT.closest = ELEMENT.closest || function closest(selector) {
		if (!this) return null;
		if (this.matches(selector)) return this;
		if (!this.parentElement) {return null}
			else return this.parentElement.closest(selector)
		};
}(Element.prototype));
Ответить с цитированием
  #4 (permalink)  
Старый 12.11.2018, 19:01
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони,
у вас там много всего
Ответить с цитированием
  #5 (permalink)  
Старый 12.11.2018, 19:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

j0hnik,
там ничего или будет только closest и только в ie
Ответить с цитированием
  #6 (permalink)  
Старый 12.11.2018, 20:37
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони, файл то откывали?
<div></div>
	<script src="https://cdn.polyfill.io/v1/polyfill.js?Element.prototype.closest"></script>
	<script>
var span = document.createElement('span');
document.querySelector("div").replaceWith(span);
	</script>


в ie запустите
Ответить с цитированием
  #7 (permalink)  
Старый 12.11.2018, 20:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

j0hnik,
протестируйте с этими параметрами
<script src="https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.closest"></script>



https://cdn.polyfill.io/v2/docs/examples
Ответить с цитированием
  #8 (permalink)  
Старый 13.11.2018, 08:26
Кандидат Javascript-наук
Отправить личное сообщение для yaparoff Посмотреть профиль Найти все сообщения от yaparoff
 
Регистрация: 26.04.2016
Сообщений: 106

рони, j0hnik, спасибо, все решилось
Создал отдельный файл, в котором написан полифил для closest

(function(e){
  e.closest = e.closest || function(css){
    var node = this;

    while (node) {
      if (node.matches(css)) return node;
      else node = node.parentElement;
    }
    return null;
  }
})(Element.prototype);

и полифил для matches
if (!Element.prototype.matches) {
  Element.prototype.matches =
    Element.prototype.matchesSelector ||
    Element.prototype.mozMatchesSelector ||
    Element.prototype.msMatchesSelector ||
    Element.prototype.oMatchesSelector ||
    Element.prototype.webkitMatchesSelector ||
    function(s) {
      var matches = (this.document || this.ownerDocument).querySelectorAll(s),
        i = matches.length;
      while (--i >= 0 && matches.item(i) !== this) {}
      return i > -1;
    };
}
Ответить с цитированием
  #9 (permalink)  
Старый 13.11.2018, 08:33
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони,
Этот норм
Ответить с цитированием
  #10 (permalink)  
Старый 13.11.2018, 08:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

yaparoff,
преимущество сервиса cdn.polyfill.io в том что он самостоятельно определяет что грузить надо или нет необходимости, в вашем случае для firefox например, код будет лишним.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
полифил для метод closest в internet explorer Sevic Internet Explorer 2 09.08.2018 10:46
метод не срабатывает Cdelphi78 jQuery 5 16.05.2017 19:27
Не срабатывает метод .animate() Latronem Events/DOM/Window 1 07.12.2015 13:54
Метод closest any.zicky jQuery 0 17.09.2012 13:55
Не срабатывает метод slice() и join() Faab Общие вопросы Javascript 3 22.04.2012 17:10