Перейти к содержанию

Рекомендуемые сообщения

Все прекрасно работало, но вдруг хром и лиса начали ругаться:

Uncaught TypeError: Cannot read property 'outerHTML' of undefined

Сафари и опера ничего не замечают и прекрасно себя чувствуют.

 

Расследование вывело на OCfilter, конкретно сюда:

if ($('#ocfilter').is(':hidden')) {
  $('#navbar-ocfilter').html($('#ocfilter').remove().get(0).outerHTML);
  var html = $('#ocfilter-mobile').remove().get(0).outerHTML;
  $('.breadcrumb').after(html);
  options['mobile'] = true;
}

Пытался обернуть в typeof и try catch, но работать как положено отказывается.

 

Кто сталкивался? Можно мне горсточку советов?

Изменено пользователем Jackazzm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишите в тему поддержки OCfilter. Сейчас набегут "бородатые" постояльцы форума и будут ругать вас. Здесь такого не любят.

Р.Ы. Автор не будет рад публикации кода его продукта.

Изменено пользователем mario512

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, mario512 сказал:

Пишите в тему поддержки OCfilter. Сейчас набегут "бородатые" постояльцы форума и будут ругать вас. Здесь такого не любят.

Р.Ы. Автор не будет рад публикации кода его продукта.

 

Ок, спасибо.

Думал, что ошибка связана больше с нюансами обработки браузером outerHTML, чем непосредственно с модулем. Поэтому сюда и написал.

 

Закройте, пожалуйста, тему, если она нарушает правила.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
$('#ocfilter').remove().get(0).outerHTML

может быть чего-то не понимаю, но я вижу тут бред

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, mario512 сказал:

Пишите в тему поддержки OCfilter. Сейчас набегут "бородатые" постояльцы форума и будут ругать вас. Здесь такого не любят.

Р.Ы. Автор не будет рад публикации кода его продукта.

Чи не код - больше на тарабарщину похоже

Пользователь не должен писать из за косяков автором вообще! Тем более оц фильтра))) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, Jackazzm сказал:

Пытался обернуть в typeof и try catch, но работать как положено отказывается.

 

1. Версия 4.19 из варезника, старовата и неизвестно через какие руки прошла.

2. Обернуть в typeof? :unsure: лучше оберните в console.info изучаемый объект, подозреваю, что из DOM уходит #ocfilter-mobile

 

6 часов назад, TeslaFeo сказал:

может быть чего-то не понимаю, но я вижу тут бред

Объясните свое видение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
41 минуту назад, SooR сказал:

Объясните свое видение?

на сколько знаю, метод remove() удаляет элемент и ничего не возвращает (не тестил, но перечитал док)

но к тому, что он возвращает применяется метод get(), который вообще является ajax запросом и в который передается 0

а затем вызывается свойство outerHTML того, что вернет get. Но outerHTML - это свойство элемента страницы, причем в ванильном JS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

плохо читаете

в данном контеrсте remove вернет родителя, get - это не аякс, а метод возвращающий элемент по списку, в данном случае сам элемент с индексом 0,  не знаю что такое ванильный js
outerHTML - это свойство элемента.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@TeslaFeo , :) интересное у вас суждение.

 

$.get и $([node]).get() - разные вещи. Многие используют доступ к DOM элементу через JS из jQuery объекта как к элементу массива вот так

var element = $('#some-el-by-id')[0];

я же предпочитаю использовать алиас .get(0), мне он кажется более подходящим к стилистике цепочки вызовов jQuery

var element = $('#some-el-by-id').get(0);

Док

 

38 минут назад, TeslaFeo сказал:

метод remove() удаляет элемент и ничего не возвращает

Нужно понимать, в каком контексте мы вызываем метод jQuery. В данном случае, контекстом является объект с элементом #ocfilter, согласно этому руководству, этот объект он и вернет, причем, вернет копию удалившегося элемента, что очень удобно.

 

47 минут назад, TeslaFeo сказал:

не тестил, но перечитал док

Очень просто. F12, в консоле пишем 

console.log($('a:first').remove())

и смотрим что нам показывает консоль. Если в свойстве length объекта будет 1 - нам вернулся удаленный объект (при условии, что элемент есть в наборе).

 

50 минут назад, TeslaFeo сказал:

Но outerHTML - это свойство элемента страницы

Т.к. jQuery не имеет своего метода возвращающего html элемента с ним вместе, то приходится использовать нативное свойство outerHTML

 

<div id="html-box"><span>Some Text</span></div>

var innerHTML = $('#html-box').html(); // Вернет <span>Some Text</span>
var outerHTML = $('#html-box').get(0).outerHTML; // Вернет <div id="html-box"><span>Some Text</span></div>

Надеюсь, понятно объяснил. Вообще JS - уникальной гибкости язык, при взгляде на код которого не сразу понимаешь что происходит, если его автор любит минимализм и краткость записи.

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@SooR Спасибо за столь подробное описание. :)

До этого момента думал, что хорошо знаю JQuery )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, SooR сказал:

Вообще JS - уникальной гибкости язык

и многие его за это не любят

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.