Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как проверить, что есть поле селект у товара (https://javascript.ru/forum/misc/46120-kak-proverit-chto-est-pole-selekt-u-tovara.html)

borus 29.03.2014 12:46

Как проверить, что есть поле селект у товара
 
Здравствуйте.

Общими усилиями для страницы написал скрипт abv347.js, который с помощью функции $('.addtocart-button').on('click', function() проверяет, выбрано ли значение из выпадающего списка с типом багета картины. Скрипт хорошо отрабатывает на странице с детальным описанием товара, где может существовать только один выпадающий список с id = baget_select.

Если кликнуть на кнопку добавить в корзину на выше указанной странице категории товаров для товара, у которого нет возможности выбора типа багета, то скрипт сходит с ума, видя другие селекты с id = "baget_select". Как написать условие $('.addtocart-button').on('click', function(), которое бы проверяло, есть ли поле селект с выбором типа багета только у того товара, под которым была нажата кнопка с class="addtocart-button"?

jsnb 29.03.2014 13:58

На странице в принципе не должно быть нескольких элементов с одинаковым id. На то он и идентификатор, чтобы быть уникальным.
Вот костыли для проверки наличия селекта багетов:
var hasBagetSelection = $(this.form).find('#baget_select').length > 0;
if (hasBagetSelection) { alert('есть') } else { alert('нет') };

borus 22.04.2014 16:07

Цитата:

Сообщение от jsnb (Сообщение 304986)
На странице в принципе не должно быть нескольких элементов с одинаковым id. На то он и идентификатор, чтобы быть уникальным.
Вот костыли для проверки наличия селекта багетов:
var hasBagetSelection = $(this.form).find('#baget_select').length > 0;
if (hasBagetSelection) { alert('есть') } else { alert('нет') };

благодарю, исправлю, проморгал задвоение id.

Тестирую на локальном сервере. Условие не срабатывает верно. Воспользовался отладчиком Хрома, поставил точку останова на
var hasBagetSelection = $(this.form).find('#baget_select').length > 0;

он указывает, что this на этой строке это span.addtocart-button, видимо поэтому hasBagetSelection всегда = false. Выпадающий список с типом багета находится в другой ветке DOM насколько понимаю, судя по принтскрину:

Как можно добраться и проверить наличие #baget_select в соседней ветке DOM?

ksa 22.04.2014 16:22

Цитата:

Сообщение от borus
var hasBagetSelection = $(this.form).find('#baget_select').length > 0;

Зная ИД элемента, ничего искать не нужно... :)
Обращайся сразу
$('#baget_select')

depp 22.04.2014 16:24

используйте вместо #baget_select => .baget_select
к спискам с баггетами добавьте class="baget_select"

borus 22.04.2014 16:52

Цитата:

Сообщение от ksa
Зная ИД элемента, ничего искать не нужно...

просто на странице несколько таких baget_select и нужно проверить наличие этого поля у того товара, под которым и была нажата кнопка "Добавить в корзину", которая запустила весь этот "триггер"

borus 22.04.2014 17:12

Цитата:

Сообщение от depp
используйте вместо #baget_select => .baget_select
к спискам с баггетами добавьте class="baget_select"

а вот это почему-то не сработало...

depp 22.04.2014 17:17

я вкратце объясню, так как не знаю ваш код.
вы вызываете событие
$('.addtocart-button').click(function(){
//внутри есть объект this
$(this).parent().prev(). //по моему такой путь до блока с выбором типа багета
find('.baget_select'); // вот вам ваш объект. далее делаете с ним что хотите.
});

borus 22.04.2014 17:58

Цитата:

Сообщение от depp (Сообщение 308826)
я вкратце объясню, так как не знаю ваш код.
вы вызываете событие
$('.addtocart-button').click(function(){
//внутри есть объект this
$(this).parent().prev(). //по моему такой путь до блока с выбором типа багета
find('.baget_select'); // вот вам ваш объект. далее делаете с ним что хотите.
});

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

depp 22.04.2014 18:00

$('element').click(function(){
    $(this).hasClass('class_name'); // true, если есть, false - если нет
});


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