Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Выделение определенного чекбокса через поиск. (https://javascript.ru/forum/misc/73443-vydelenie-opredelennogo-chekboksa-cherez-poisk.html)

jfox 16.04.2018 19:23

Выделение определенного чекбокса через поиск.
 
Доброго времени.
Требуется помощь в дополнении скрипта. Внизу есть таблица с товарами, напротив каждого товара есть чекбокс. Задача в том, чтобы выделить определенные чекбоксы, в зависимости от артикула.
<table>
    <tbody>
        <tr>
            <th class="min-width"><input type="checkbox" class="s-select-all" data-count="6116"></th>
            <th>Код артикула</th>
            <th>Название</th>
            <th>Цена</th>
            <th>В наличии</th>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6636">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21400</td>
            <td class="drag-handle s-product-name">Велосипед<td>
            <td title="Цена">50000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6637">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21401</td>
            <td class="drag-handle s-product-name">Велосипед<td>
            <td title="Цена">12000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6638">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21402</td>
            <td class="drag-handle s-product-name">Велосипед<td>
            <td title="Цена">60000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6639">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21403</td>
            <td class="drag-handle s-product-name">Велосипед<td>
            <td title="Цена">13300</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6640">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21404</td>
            <td class="drag-handle s-product-name">Велосипед<td>
            <td title="Цена">33200</td>
            <td title="В наличии">5</td>
        </tr>
    <tbody>
</table>


Вот собственно скрипт, который находит определенные артикулы, например, нужны 21401,21403,21404. Скрипт находит их и выделяет желтым цветом.
Проблема в том, что я не знаю как зацепиться за определенный чекбокс, чтобы скрипт автоматически отмечал его в зависимости от тех артикулов, которые я введу. Чекбоксы попросту пустые и не содержат в себе какого-либо значения типа айдишка товара.
var count = prompt("Введите артикулы через запятую:");
    var array = count.split(',');

    function searchText() {
        for (var i = 0; i < array.length; i++) {
            var result = $("td:contains(" + array[i] + ")")
                .css("background-color", "yellow");
        }
        return result;
    }
    searchText();

j0hnik 16.04.2018 19:31

var count = prompt("Введите артикулы через запятую:");
    var array = count.split(',');

    function searchText() {
        for (var i = 0; i < array.length; i++) {
            var result = $("td:contains(" + array[i] + ")")
                .css("background-color", "yellow")
                .prev().children('input[type="checkbox"]').prop('checked', true);
        }
        return result;
    }
    searchText();

jfox 16.04.2018 19:50

Ого, благодарю, сейчас буду разбираться.

рони 16.04.2018 19:56

jfox,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .yellow {
       background-color: #FFFF00;
  }

  </style>


</head>

<body>
<table>
    <tbody>
        <tr>
            <th class="min-width"><input type="checkbox" class="s-select-all" data-count="6116"></th>
            <th>Код артикула</th>
            <th>Название</th>
            <th>Цена</th>
            <th>В наличии</th>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6636">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21400</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">50000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6637">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21401</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">12000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6638">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21402</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">60000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6639">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21403</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">13300</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6640">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21404</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">33200</td>
            <td title="В наличии">5</td>
        </tr>
    </tbody>
</table>
<script>
var a = ["21401","21403","21404"], num = 0, b = [];
[].forEach.call(document.querySelectorAll('.product'), function(tr) {
var td = tr.querySelector('.s-product-col-sku');
var kod = td.textContent.trim();
var checked = ~a.indexOf(kod);
checked ? num++ : b.push(kod);
tr.querySelector('input').checked = checked;
td.classList[checked ? 'add' : 'remove']("yellow")
});
console.log(num, b)
  </script>
</body>
</html>

Javany11 16.04.2018 22:26

var count = prompt("Введите артикулы через запятую:");
    var array = count.split(',');

    function searchText() {
        for (var i = 0; i < array.length; i++) {
            var result = $("td:contains(" + array[i] + ")")
                .css("background-color", "yellow");
        }
        return result;
    }
    searchText();


Я конечно сам еще новичок, и возможно не совсем по теме, но мне кажется что если Вы оставляете за пользователем право вводить артикулы, то в результате в своём массиве можете получить кашу. Проверку данных нужно делать.

jfox 18.04.2018 21:14

Цитата:

Сообщение от Javany11 (Сообщение 483425)
Я конечно сам еще новичок, и возможно не совсем по теме, но мне кажется что если Вы оставляете за пользователем право вводить артикулы, то в результате в своём массиве можете получить кашу. Проверку данных нужно делать.

А в чем собственно может быть каша?

Javany11 18.04.2018 22:59

Цитата:

Сообщение от jfox (Сообщение 483575)
А в чем собственно может быть каша?

Например если пьяный пользователь введет 12мм2и14..2.2., и Вы это в массиве получите, Вы это сможете дальше обработать своим скриптом? Думаю без проверки нет. Как минимум нужно сказать пользователю о том что ввод некорректный.
while(true){var UserDigit = prompt("Введите несколько числовых значений, разделенных запятыми:", "2,2,5,5,3,7")

	var arr = UserDigit.split(",")
	var arr2 = arr.includes("") 
	var test = arr.join('')
	if (isNaN(test)||!isNaN(arr[i])||arr2!=false){alert('Некорректный ввод...','')}
		else if(!isNaN(test)){break}	
}

Не буду утверждать что это хорошая проверка, но она работает. Отбрасывает буквы и пробелы между запятыми, что позволяет не создавать пустой массив.

рони 18.04.2018 23:07

Цитата:

Сообщение от Javany11
arr[i]

это что?

Javany11 18.04.2018 23:58

Цитата:

Сообщение от рони (Сообщение 483586)
это что?

!isNaN(arr[i]) Это лишнее, случайно попало.:(

jfox 19.04.2018 12:09

Цитата:

Сообщение от Javany11 (Сообщение 483585)
Например если пьяный пользователь введет 12мм2и14..2.2., и Вы это в массиве получите, Вы это сможете дальше обработать своим скриптом? Думаю без проверки нет. Как минимум нужно сказать пользователю о том что ввод некорректный.
while(true){var UserDigit = prompt("Введите несколько числовых значений, разделенных запятыми:", "2,2,5,5,3,7")

	var arr = UserDigit.split(",")
	var arr2 = arr.includes("") 
	var test = arr.join('')
	if (isNaN(test)||!isNaN(arr[i])||arr2!=false){alert('Некорректный ввод...','')}
		else if(!isNaN(test)){break}	
}

Не буду утверждать что это хорошая проверка, но она работает. Отбрасывает буквы и пробелы между запятыми, что позволяет не создавать пустой массив.

А, вы про это. Скрипт лично для меня писался, для работы с админкой одной из CMS:)
Но вообще я сижу думаю еще, как сделать вывод в консоль тех артикулов, которые он не отметил, плюс сколько количество отмеченных чекбоксов.

рони 19.04.2018 16:21

Цитата:

Сообщение от jfox
как сделать вывод в консоль тех артикулов, которые он не отметил, плюс сколько количество отмеченных чекбоксов.

пост №3 строка 70.

laimas 19.04.2018 16:26

jfox,
а к чему эти мытарства, почему не сделать артикул и флажок единым целым? Какой смысл прятать флажок и упорно решать проблемы?

jfox 20.04.2018 21:47

Цитата:

Сообщение от laimas (Сообщение 483637)
jfox,
а к чему эти мытарства, почему не сделать артикул и флажок единым целым? Какой смысл прятать флажок и упорно решать проблемы?

А вот это уже вопрос не ко мне, а к самой CMS. Там так сделано. Вообще скрипт получился от части рабочим. Чекбокс там для визуализации по идеи. Когда отмечаешь его то он... не отмечается)) Мне еще пришлось дописать параметр для добавления класса.

laimas 20.04.2018 23:14

Цитата:

Сообщение от jfox
А вот это уже вопрос не ко мне, а к самой CMS. Там так сделано.

А что сложно самому дописать человечески, вы же правите и добавляете свое. Что сложно сделать так:

<td class="min-width drag-handle"><input id="6636" type="checkbox"></td>
<td class="s-product-col-sku" title="Код артикула"><label for="6636">21400</label></td>

а класс просто переключать toggle?

jfox 12.07.2018 09:59

Цитата:

Сообщение от рони (Сообщение 483635)
пост №3 строка 70.

Я имел ввиду вывести те артикулы, которые он не отметил из моего списка артикулов(помещаемые в массив). В вашем коде он выводит вообще все не отмеченные артикулы со страницы.

рони 12.07.2018 10:16

Цитата:

Сообщение от jfox
Я имел ввиду вывести те артикулы, которые он не отметил из моего списка артикулов.

Цитата:

Сообщение от jfox
Задача в том, чтобы выделить определенные чекбоксы, в зависимости от артикула.

не понимаю

Dilettante_Pro 12.07.2018 10:58

Цитата:

Сообщение от jfox
не отметил из моего списка артикулов(помещаемые в массив)

М.б. артикулы из массива, которых нет на странице?

jfox 12.07.2018 12:27

Цитата:

Сообщение от рони (Сообщение 489513)
не понимаю

Цитата:

Сообщение от рони (Сообщение 489513)
не понимаю

На сайте куча артикулов, но мне нужно отметить только некоторые из них. Те, которые я хочу отметить я указываю в prompt. Проблема в том, что некоторых артикулов может не оказаться на сайте и именно эти артикулы мне нужно, чтобы выводило в лог.

Не оказаться их может, потому что в одном товаре может находится два артикула, но отображается только первый из них.

Например Велосипед 1 имеет артикулы 20400(красный цвет) и 20452(синий цвет). Я добавляю в prompt два этих артикула, но чекбоксом он отметит мне только 20400, а 20452 он(скрипт) пропустит, потому что не сможет найти. И вот скрипт в логах должен мне указать, что артикул с номером 20452 не отметился. Только вот таких артикулов бывает много.

Забегу вперед и отвечу на вопрос "А зачем тебе отмечать 20452, если он находится внутри товара с 20400 артикулом и уже считается отмеченным?"

Ответ: Велосипед 2 имеет первый артикул 0001, а второй 0005. Мне нужен 0005 и я его добавляю в prompt, однако 0001 я не добавляю, потому что я вообще знать не знаю, что 0005 сидит в 0001.

Как-то так.

рони 12.07.2018 12:53

jfox,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .yellow {
       background-color: #FFFF00;
  }
  .info {
      color: #FF0000;
  }

  </style>


</head>

<body>
<table>
    <tbody>
        <tr>
            <th class="min-width"><input type="checkbox" class="s-select-all" data-count="6116"></th>
            <th>Код артикула</th>
            <th>Название</th>
            <th>Цена</th>
            <th>В наличии</th>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6636">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21400</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">50000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6637">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21401</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">12000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6638">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21402</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">60000</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6639">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21403</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">13300</td>
            <td title="В наличии">5</td>
        </tr>
        <tr class="product ui-droppable ui-draggable" data-product-id="6640">
            <td class="min-width drag-handle"><input type="checkbox"></td>
            <td class="s-product-col-sku" title="Код артикула">21404</td>
            <td class="drag-handle s-product-name">Велосипед</td>
            <td title="Цена">33200</td>
            <td title="В наличии">5</td>
        </tr>
    </tbody>
</table>
<p class="info"></p>
<script>
var a = ["21401","21403","21404", "20400", "20452"], b = [], err;
[].forEach.call(document.querySelectorAll('.product'), function(tr) {
var td = tr.querySelector('.s-product-col-sku');
var kod = td.textContent.trim();
var checked = ~a.indexOf(kod);
checked && b.push(kod);
tr.querySelector('input').checked = checked;
td.classList[checked ? 'add' : 'remove']("yellow")
});
err = a.filter(function(e) {
   return b.indexOf(e) == -1
})
document.querySelector('p.info').innerHTML = err

  </script>
</body>
</html>

jfox 12.07.2018 14:17

рони, в коде более-менее разобрался и подстроил под себя.
Благодарю за помощь.


Часовой пояс GMT +3, время: 00:11.