У меня есть руководство по веб-компонентам, в котором есть список веб-компонентов, построенных по шаблону следующего имени:
mkk-textfield
mkk-textarea
mkk-counter
mkk-checkbox
Все они, как видите, начинаются с префикса мкк- и все они имеют внутри тег input
.
Мне нужно проверить некоторые вещи с помощью Аякс и jQuery и добавить некоторые атрибуты и классы в компонент mkk-whatever
(не во вложенный ввод) в зависимости от этой проверки.
Пример:
(Перед проверкой)
<mkk-textfield label = "Text">
<input type = "text" value = "" placeholder = "Text" />
</mkk-textfield>
(После проверки)
<mkk-textfield label = "Text" class = "someClass error" error-message = "My custom error message">
<input type = "text" value = "" placeholder = "Text" />
</mkk-textfield>
Есть ли способ выбрать тег с jQuery, соответствующий шаблону, например регулярному выражению? Что-то вроде селекторов jQuery, но для тега:
В следующем примере для выбора всех div атрибут имени начинается со слова ценность или содержит его:
div[name|=”value”]
или div[name~=”value”]
Но в моем случае я хотел бы сделать что-то вроде mkk.*
, который выбирает все теги, соответствующие регулярному выражению.
Дело в том, что у всех из них не может быть идентификатора, поэтому мне нужно сделать это, чтобы использовать что-то вроде функции closest
, и на этом этапе выберите функцию с mkk-, которая может быть текстовым полем, счетчиком или чем-то еще.
Заранее спасибо.
ОБНОВИТЬ для полного примера. У меня есть форма с тремя веб-компонентами:
<mkk-textfield label = "Text">
<input type = "text" value = "" placeholder = "Text" />
</mkk-textfield>
<mkk-datepicker label = "MyDate">
<input type = "date" value = "" placeholder = "Text" />
</mkk-textfield>
<mkk-radio label = "MyRadio">
<input type = "radio" value = "" />
</mkk-textfield>
Все эти веб-компоненты `` взрываются '' в DOM с помощью div и меток внутри, например, текстовое поле:
<mm-textfield label = "Name" class = "hydrated">
<label>Name</label>
<div class = "input-content">
<input id = "name" type = "text" value = "" placeholder = "Enter your name" name = "name">
</div><
/mm-textfield>
Когда выполняется отправка (проверка вызова ajax), я получаю в своей функции jQuery все поля формы и сообщение, поэтому функция addError выполняется один раз для каждого поля формы:
function addError(field, message){
// Do the magic to figure out which mkk web component is the closest one
$(/*PUT HERE THIS STACKOVERFLOW SOLUTION*/).attr("error-message", message).addClass("error");
}
Я мог бы решить эту проблему с помощью ifs и parent (). Parent () в зависимости от компонента mkk, потому что каждый из них имеет разные вложенные теги html, но я написал этот вопрос, чтобы сделать это более элегантным способом.
Надеюсь, это поможет лучше понять проблему.
Спасибо @RoryMcCrossan, здесь pastebin.com/ZBZHYN4C - это фрагмент кода, откуда берется первый параметр addError
Вы никогда не должны использовать Regex для синтаксического анализа HTML. Если вы уже используете jQuery, вы можете использовать его для синтаксического анализа строки HTML и при необходимости изменить ее с помощью доступных методов; attr()
и addClass()
в этом случае:
var $tags = $('<mkk-textfield label = "Text" class = "someClass error" error-message = "My custom error message"><input type = "text" value = "" placeholder = "Text" /></mkk-textfield>');
$tags.filter('mkk-textfield').attr('error-message', 'My custom error message').addClass('someClass error');
// testing
console.info($tags.get(0).outerHTML);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Может быть, нам нужен канонический ответ, на который мы могли бы ссылаться, чтобы показать, насколько плох синтаксический анализ HTML с помощью регулярных выражений. ;)
Уже есть (stackoverflow.com/questions/1732348/…), но я подумал, что в этом случае я дам OP работоспособную альтернативу с примером.
Для моих нужд не пригодится. Дело в том, что это делается динамически, я не знаю, какое поле (компонент mkk) мне нужно проанализировать. Я просто получаю поле (ввод), и я хочу связаться с его родителем mkk и добавить классы и сообщение об ошибке, не выполняя этого с помощью чего-то вроде parent (). Parent () [В некоторых случаях мне нужны два родителя из-за метки, но в радио или выборе отличается, поэтому мне нужно знать ближайший компонент mkk.
Я добавил наглядный пример, чтобы лучше его понять.
Судя по вашему обновлению,
closest()
может быть решением, но это зависит от того, как вызывается функцияaddError()
и / или какойfield
является ссылкой на