Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Селектор по нескольким атрибутам (https://javascript.ru/forum/dom-window/78136-selektor-po-neskolkim-atributam.html)

nGreg 31.07.2019 15:42

Селектор по нескольким атрибутам
 
Прошу помочь разобраться в селекторах. Имеется страница, возвращённая с сервера, в которой есть 10, 20, 30... одинаковых блоков. В двух словах - php, foreach, include...
<form action="tempOffStatus" method="post">
            <input type="hidden" name="row" value="<?=$item_r['id'];?>">
            <select id="tempOffChangeStatus" rel="<?=$item_r['id'];?>">
                <option value="0" <? if($item_r['tempOff'] == 0): ?> selected <?endif;?>> есть в наличии </option>
                <option value="1" <? if($item_r['tempOff'] == 1): ?> selected <?endif;?>> нет в наличии </option>
            </select>
        </form>


Все блоки одинаковые, но параметр rel=<?=$item_r['id'];?> в каждом блоке уникальный.

Нужно select-ом менять значения в каждом конкретном блоке.
<script>
    $(document).ready(function(){
        $("#tempOffChangeStatus").change(function(){

            var rel = $(this).attr("rel");
            var offStatus = $("#tempOffChangeStatus + rel :selected").val();


Т.е. переменная offStatus должна относиться к одному блоку, а не ко всем сразу. Я так понимаю, что селектор в JS должен быть составным. Из двух частей. Где то я с синтаксисом намудрил, что ли.
Может кто-нибудь помочь в грамотном оформлении, а то с JS я не очень ...

ЗЫ. То, что в моём примере здесь, это у меня уже крыша поехала, тыкал всё подряд...

laimas 31.07.2019 16:39

То есть задача при выборе в списке занести его значение в скрытое поле? Если да, то нафига оно вообще нужно это поле?

Malleys 31.07.2019 16:45

Атрибут id замените на атрибут class...
<form action="tempOffStatus" method="post">
            <input type="hidden" name="row" value="<?=$item_r['id'];?>">
            <select class="tempOffChangeStatus" rel="<?=$item_r['id'];?>">
                <option value="0" <? if($item_r['tempOff'] == 0): ?> selected <?endif;?>> есть в наличии </option>
                <option value="1" <? if($item_r['tempOff'] == 1): ?> selected <?endif;?>> нет в наличии </option>
            </select>
        </form>


В скрипте соответственно #tempOffChangeStatus замените на .tempOffChangeStatus
<script>
    $(document).ready(function(){
        $(".tempOffChangeStatus").change(function() {

            var rel = $(this).attr("rel");
            var offStatus = $(this).val();

Я правильно думаю, что вы значение переменной offStatus не собираетесь записывать в то скрытое поле?

nGreg 31.07.2019 16:46

Если речь об input-е, то оно лишнее. Оно не нужно, я его уберу. В JS будет ajax запрос в php модель. И дальше обновление в базу данных. Там уже всё настроено и работает.

nGreg 31.07.2019 16:50

Теперь всё работает! Спасибо большое!!!!!

nGreg 31.07.2019 16:57

Ещё вопрос в догонку. Как взять результаты только первой инерации средствами JS? Ибо в теле страницы у меня столько блоков, сколько записей в БД. И перебор массива возвращается из php.

Malleys 31.07.2019 17:12

Цитата:

Сообщение от nGreg
В JS будет ajax запрос

Такого не существует, вы наверное имели в виду, например, POST запрос... https://developer.mozilla.org/ru/docs/Web/HTTP/Methods

Цитата:

Сообщение от nGreg
Как взять результаты только первой инерации средствами JS?

Вы имеете в виду первый попавший .tempOffChangeStatus? Можно так...
$(".tempOffChangeStatus").first()

nGreg 31.07.2019 17:22

Да. Именно POST запрос. Там всё в порядке.

Вы имели ввиду так:

$(document).ready(function(){
$(".tempOffChangeStatus").first().change(function( ){

var rel = $(this).attr("rel");
var offStatus = $(this).val();

В таком виде ничего не происходит.

Malleys 31.07.2019 17:24

Цитата:

Сообщение от nGreg
Вы имели ввиду так

Да, если вам нужно именно первое .tempOffChangeStatus и чтобы на нём был обработчик события...

nGreg 31.07.2019 17:27

В таком виде почему то не работает...

nGreg 31.07.2019 17:28

<script>
    $(document).ready(function(){
            $(".tempOffChangeStatus").first().change(function(){

            var rel = $(this).attr("rel");
            var offStatus = $(this).val();

            $.post("/index.php?component=org&section=ajax", {
                sect: "<?=$_GET['section']?>",
                id: rel,
                id_zp:<?=$openzakup[0]['id']?>,
                offStatus: offStatus,
                event: "tempOffStatus"
            },
                function(){
                console.log(rel);
                console.log(offStatus);
                })
        })
    })
</script>

Malleys 31.07.2019 17:35

Пост №11 строка 11... может вместо
id_zp: <?=$openzakup[0]['id']?>,
надо
id_zp: "<?=$openzakup[0]['id']?>",
?

Лучше, конечно, чтобы вы так не делали... Пусть в JS-коде будет JS-код, и в PHP-коде будет PHP-код!

nGreg 31.07.2019 17:38

У меня получается даже не массив, а 20 (по количеству sql записей) post запросов в php модель, если без first(). С правильными, но одинаковыми данными. Если добавляю first(), то ничего не происходит. Ни запросов, ни в консоль ничего не выводиться...

nGreg 31.07.2019 17:42

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

Malleys 31.07.2019 17:43

Цитата:

Сообщение от nGreg
Если добавляю first(), то ничего не происходит. Ни запросов, ни в консоль ничего не выводиться...

Если вы добавляете first(), то только самый первый <select> будет работать...

Цитата:

Сообщение от nGreg
У меня получается даже не массив, а 20 (по количеству sql записей) post запросов в php модель

Цитата:

Сообщение от nGreg
С кавычками тоже ничего не изменилось.

Я так понимаю, у вас проблема в том, что <script> вставлен тоже 20 раз... он должен быть только один раз! Тогда first() не нужен, я думал вам нужно, чтобы только первый <select> работал...

nGreg 31.07.2019 17:48

Да. Мне достаточно будет первого <select>-а. Ибо они все одинаковые. Скрипт вставлен один раз в конце. Но Post отсылается почему то по количеству элементов с классом .tempOffChangeStatus в теле страницы.

nGreg 31.07.2019 17:52

Тьфу ты блин... Действительно. Его php-шный foreach 20 раз в страницу вставил. Буду теперь голову ломать, как выкручиваться... Ещё раз, спасибо за помощь!!!


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