Мне нужно ограничить выбор флажка в нескольких разделах на одной странице. Поэтому я думаю, что лучший способ избежать конфликтов во входных данных из разных разделов — это использовать селектор меток <label data-addon-name = "xxx">
в качестве разделителя, поскольку HTML-код уже имеет разные метки для каждого раздела перед входными данными, например: <label data-addon-name = "Opções">
, <label data-addon-name = "Carnes">
и так далее. Кроме того, каждый из них должен иметь разные ограничения флажка.
У меня есть следующий HTML-код:
HTML
<div class = "wc-pao-addon-container wc-pao-addon wc-pao-addon-opcoes" data-product-name = "Marmitex">
<label for = "addon-3913-opcoes-0" class = "wc-pao-addon-name" data-addon-name = "Opções" data-has-per-person-pricing = "" data-has-per-block-pricing = "">Opções </label>
<div class = "wc-pao-addon-description"><p>Escolha no máximo 5</p>
</div>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-0">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "arroz" data-label = "Arroz"> Arroz </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-1">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "feijao-caldo" data-label = "Feijão Caldo"> Feijão Caldo </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-2">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "feijao-farofa" data-label = "Feijão Farofa"> Feijão Farofa </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-3">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "macarrao" data-label = "Macarrão"> Macarrão </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-4">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "vinagrete" data-label = "Vinagrete"> Vinagrete </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-5">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "pure" data-label = "Purê"> Purê </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-6">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "salada-de-alface" data-label = "Salada de Alface"> Salada de Alface </label>
</p>
<div class = "clear"></div>
</div>
<div class = "wc-pao-addon-container wc-pao-addon wc-pao-addon-carnes" data-product-name = "Marmitex">
<label for = "addon-3913-carnes-1" class = "wc-pao-addon-name" data-addon-name = "Carnes" data-has-per-person-pricing = "" data-has-per-block-pricing = "">Carnes </label>
<div class = "wc-pao-addon-description"><p>Escolha no máximo 3</p>
</div>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-carnes-1-0">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-carnes-1[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "carne-assada" data-label = "Carne Assada"> Carne Assada </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-carnes-1-1">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-carnes-1[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "carne-cozida" data-label = "Carne Cozida"> Carne Cozida </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-carnes-1-2">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-carnes-1[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "frango-assado" data-label = "Frango Assado"> Frango Assado </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-carnes-1-3">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-carnes-1[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "frango-cozido" data-label = "Frango Cozido"> Frango Cozido </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-carnes-1-4">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-carnes-1[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "frango-frito" data-label = "Frango Frito"> Frango Frito </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-carnes-1-5">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-carnes-1[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "calabresa-assada" data-label = "Calabresa Assada"> Calabresa Assada </label>
</p>
<div class = "clear"></div>
</div>
<input name = "add-to-cart" type = "hidden" value = "3913"></form>
СЦЕНАРИЙ
$("[data-addon-name='Opções'] > input").change(function() {
var max = 2;
if ($("[data-addon-name='Opções'] > input:checked").length == max) {
$("[data-addon-name='Opções'] > input").attr('disabled', 'disabled');
$("[data-addon-name='Opções'] > input:checked").removeAttr('disabled');
} else {
$("[data-addon-name='Opções'] > input").removeAttr('disabled');
}
});
Еще одна попытка, которую я предпринял, — это использование input[name=addon-3913-opcoes-0[]] ...
, так как имя одинаково для всех селекторов, но оно возвращается с ошибкой на консоли. Я не знаю, что означает []
в конце имени ввода, я думаю, что это массив, но понятия не имею, как с этим работать. Я предпочитаю первый вариант, используя родительский селектор, чтобы упростить обслуживание кода, но я также хотел бы знать, как заставить скрипт работать с []
.
Большое спасибо!
@ imvain2 Я удалил >
, но все равно не работает...
console.info($("[data-addon-name='Opções'] input:checked").length );
Ваш html имеет только один элемент label
с атрибутом данных data-addon-name
, только один, и у него вообще нет потомков, не говоря уже о потомке элемента input
. Поэтому ваш JS не имеет смысла. Какова ваша цель?
@PeterKA Мне нужно ограничить выбор флажка в нескольких разделах на одной странице. Поэтому я думаю, что лучший способ избежать конфликтов во входных данных из разных разделов — использовать метку data-addon-name
в качестве разделителя, поскольку в HTML-коде уже есть разные метки для каждого раздела перед входными данными, например: [label data-addon-name = "Opções"]
, [label data-addon-name = "Carnes"]
и т. д., каждый с разными пределы. Как избежать конфликтов?
Вся новая информация должна быть в вашем вопросе, а не здесь.
Вопрос обновлен!
Ваш html имеет только один элемент метки с атрибутом данных data-addon-name, только один, и у него вообще нет потомков, не говоря уже о потомке элемента ввода. Поэтому ваш JS не имеет смысла. Может быть, следующий JS имеет смысл:
$("div:has([data-addon-name='Opções']) input").change(function() {
var max = 2;
if ($("div:has([data-addon-name='Opções']) input:checked").length == max) {
$("div:has([data-addon-name='Opções']) input").attr('disabled', 'disabled');
$("div:has([data-addon-name='Opções']) input:checked").removeAttr('disabled');
} else {
$("div:has([data-addon-name='Opções']) input").removeAttr('disabled');
}
});
var max = 2;
var $inputs = $("div:has([data-addon-name='Opções']) input");
$inputs.change(function() {
if ($inputs.filter(':checked').length == max) {
$inputs.attr('disabled', 'disabled');
$inputs.filter(':checked').removeAttr('disabled');
} else {
$inputs.removeAttr('disabled');
}
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "wc-pao-addon-container wc-pao-addon wc-pao-addon-opcoes" data-product-name = "Marmitex">
<label for = "addon-3913-opcoes-0" class = "wc-pao-addon-name" data-addon-name = "Opções" data-has-per-person-pricing = "" data-has-per-block-pricing = "">Opções </label>
<div class = "wc-pao-addon-description">
<p>Escolha no máximo 5</p>
</div>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-0">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "arroz" data-label = "Arroz"> Arroz </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-1">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "feijao-caldo" data-label = "Feijão Caldo"> Feijão Caldo </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-2">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "feijao-farofa" data-label = "Feijão Farofa"> Feijão Farofa </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-3">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "macarrao" data-label = "Macarrão"> Macarrão </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-4">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "vinagrete" data-label = "Vinagrete"> Vinagrete </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-5">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "pure" data-label = "Purê"> Purê </label>
</p>
<p class = "form-row form-row-wide wc-pao-addon-wrap wc-pao-addon-3913-opcoes-0-6">
<label><input type = "checkbox" class = "wc-pao-addon-field wc-pao-addon-checkbox" name = "addon-3913-opcoes-0[]" data-raw-price = "" data-price = "" data-price-type = "quantity_based" value = "salada-de-alface" data-label = "Salada de Alface"> Salada de Alface </label>
</p>
<div class = "clear"></div>
</div>
Хорошо, но ваш оператор if
будет перехватывать все входные данные на странице.
Да, как избежать захвата всех входов на странице?
Для этого замените каждое вхождение 'input
на 'div:has([data-addon-name='Opções']) input
, как я сделал выше, или еще лучше определите переменную $inputs
и используйте ее, как показано в демонстрации.
@PeterKA демо возвращает ошибку. Кстати, я обновил вопрос, не могли бы вы взглянуть?
Демо сейчас хорошее. Попробуйте. Это то, что вам нужно.
@PeterKA Отлично! Большое спасибо!
>
означает, что следующий селектор должен быть прямым потомком того, что было введено перед ним.[]
позволяет получить доступ к данным на стороне сервера в PHP, например, в виде массива. Но чтобы ваш код работал, просто удалите>
в селекторе CSS, и он будет фильтровать все дочерние элементы родителя, чтобы найти соответствующие входные данные.