#jquery #placeholder #polyfills #shim
#jquery #плейсхолдер #полизаполнения #прокладка
Вопрос:
Мне нужно поддерживать атрибут placeholder обратно в IE8. Я традиционно считал, что этот скрипт отлично подходит для этого:
https://github.com/parndt/jquery-html5-placeholder-shim/blob/master/jquery.html5-placeholder-shim.js
Однако он не привязывается к динамически создаваемым элементам. Поэтому, если новый ввод добавляется на страницу с помощью JS, заполнитель не будет работать.
Есть ли способ применить этот скрипт к динамически создаваемым элементам?
Ответ №1:
В принципе .. Нет.
Как и в случае с большинством плагинов (которые не основаны строго на событиях), вам необходимо инициализировать плагин для новых элементов после их создания.
В современных браузерах вы могли бы использовать такие вещи, как MutationObservers, но причина, по которой вам нужен этот плагин, — поддерживать старый браузер, чтобы эта концепция не работала
Ответ №2:
jQuery.placeholder.shim();
Работает ли вызов? Это метод, который вызывается при ready / load, поэтому может помочь.
Если это не так, то вы, вероятно, не сможете, по крайней мере, напрямую использовать этот конкретный плагин в его текущей форме. Возможно, вы могли бы изменить исходный код для его обработки.
Генерируются ли они динамически при загрузке страницы? Не могли бы вы просто отложить загрузку плагина до тех пор, пока эти элементы не будут сгенерированы?
Единственный другой возможный вариант, который у меня есть, — не могли бы вы обернуть плагин в функцию и вызывать его после создания каждого ввода? Это может иметь непреднамеренные побочные эффекты, но может быть дешевой и неприятной альтернативой.
Комментарии:
1. Да, если посмотреть на источник дальше, метод shim выглядит как лучший выбор. Он подготавливает объект конфигурации, который затем передается в $.fn._placeholder_shim, который, в свою очередь, выполняет всю тяжелую работу. Возможно, вы сможете передать методу shim() объект конфигурации, указывающий селектор, предназначенный только для новых элементов, т.е. jQuery.placeholder.shim({selector: ‘input#newElement1’});
2. ничего неприятного в последнем idea…it так делалось уже много лет. Легко добавить класс к уже настроенным и отфильтровать их с помощью not()
3. Нет, я имел в виду повторный повторный вызов всего плагина, а не только метода, который создает экземпляр заполнителя. Если он перебирает все входные данные на странице и не использует селектор, то в итоге вы получите такие вещи, как повторяющиеся обработчики событий и прочий беспорядок, примените его к динамической генерации большого количества входных данных, тогда вы можете быстро столкнуться с проблемами производительности. В тот момент, когда я писал, что не заметил метод «shim», только метод jQuery.fn._placeholder_shim, который не работает, если вы вызываете его через $(‘selector’) . _placeholder-shim() поскольку для этого требуется объект конфигурации.
4. Согласен, селекторы являются важной частью, но я не думаю, что какой-либо из методов, предоставляемых оболочкой, использует селектор в традиционном стиле jQuery, вместо этого он использует config.selector в качестве селектора. Повторный вызов всего плагина выглядит не так неприятно, как я думал — метод shim() будет вызван только один раз, но это также, вероятно, означает, что повторная загрузка всего плагина не применит его к динамически генерируемым элементам