Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 29.11.2015, 17:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Нет понятия о чем я спрашиваю.
Например, цена имеет закономерность - каждая последующая больше предыдущей на 200 руб., и первая равна 200 руб. Цвета в зависимости от цены распределены так: 200 руб. - зеленый, 400 руб. - синий, 600 руб. - красный.
В этом случае городить огород с классами с прицепом идентификатора нет необходимости (такой необходимости в вашем случае вообще нет, каким бы там образом не определялся цвет), и каких-то условий для вывода тоже не надо. Определены классы как: color_1 имеющем зеленый цвет, и соответственно другие классы. Все они сразу прописываются в CSS, а при выводе элементов на страницу указывается соответствующий цене класс, как:
class="color_' .<?=$row['price']/200?>. '"

Либо цвет определяется номером ряда мест, и если между номером места и рядом тоже есть некая закономерность, то также можно автоматом определять класс. Вот о чем я спрашивал - какая зависимость межу цветом/местом/ценой. Ну не сидит же некая Маня, которая сегодня месту 100 назначила розовый цвет, а завтра будет не в настроении и выставит черный. Есть же наверное условия определенные, и цветов у вас не тысячи, и прописывать, причем постоянно, огромные портянки селекторов "уродуемых номерами мест" при выводе, ну это надо писать код "в лоб", чтобы до такого додуматься.

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

И можно только представить себе CSS портянку при таком способе.

Понятно, новичок, но не так страшен черт, как его малютки, все мы рождаемся голенькими. И собственно, если hover определен для всех, а это же изменение нужно и по щелчку, то и задача решена - как выбрать элементы, было показано, а что не работает, ну обработчик не на кого ставить (элементы не загружены, говорил об этом, но все осталось без комментариев, так что неизвестность), либо иной баг...

Но не так и сложно "навести порядок" в этом бардаке. Далее простой пример, описывающий все. Так как на вопросы я ответов не получаю, то просто запускайте пример, думайте, решайте сами. Пример с описанием.

Допустим, есть места в зале, и пусть в зависимости от чего-то (так как и у вас, от чего не известно), администратор "раскрашивает" их цветами. Цвет определяется посредством выбора в цветовом круге и записывается в таблицу цветов как его десятичное значение в поле типа INT (в примере имя поля таблицы color_value). При выводе CSS, это значение приводится к виду #XXXXXX. Каждому значению определенного цвета определяется и его имя, которое будет служить классом и сохраняемое в таблице цветов в поле color_name. Каждая такая запись записывается в таблицу под уникальным идентификатором, который позволяет редактировать цвет. Кроме этого эта таблица может содержать значения как флаги определяющие некие индивидуальные условия или действия на клиенте, которые в свою очередь могут быть динамически добавляемые или заранее определенные, а флаг связывает определенный обработчик с цветом. В примере этого нет, есть как пример использования такого цвета - бонус, ну пусть типа рядом с местом таким дама в неглиже подливающая виски в бокал.

Данная таблица цветов определяет все цвета, включая цвет по умолчанию, цвет по наведению и т.п., если все цвета могут редактироваться.

Как уже говорилось, РНР не выводит постоянно эти цвета в блок стилей на странице, этого не надо, из этих цветов формируется подключаемый CSS файл, который изменяется только тогда, когда происходит добавление/изменение цвета в административном разделе. В простейшем случае, при подключении этого файла указывает и GET параметр, как время последнего изменения файла. Поэтому браузер и будет его загружать только тогда, когда добавлен/изменен цвет, иначе он будет использовать ранее кешированный CSS.

Это всё классы управляющие стилями элементов (цветом), а селектор, по которому можно выбрать все элементы (места) к цвету отношения не имеет, он описывает общие для всех стили. В примере это класс seats_hall.

Таблица описывающая объекты (места) не содержит цветов, по умолчанию это поле таблицы (color) имеет значение NULL. Если же месту цвет определен, то в это поле пишется идентификатор соответствующего цвета из таблицы цветов. При выводе объектов на страницу по этому идентификатору вложенным запросом из таблицы цветов получается имя цвета (значение поля color_name). Эти значения (NULL или color_name) добавляются как имя класса элементу, то есть элементы имеют составной класс - один из них, это общий селектор, а второй (если не NULL, иначе цвет по умолчанию) определяет цвет элемента установленный администратором.

Это и все по сути, что требуется для того, чтобы иметь цветовую схему, управлять ею и определять ее элементам на странице. Огромных CSS портянок методично перечисляющих все элементы использующие ее совсем не требуется.

Пример будет работать на РНР не ниже версии 5.4.

<?
//преобразование десятичного значения цвета в HEX значение
function dec_to_hex($d) {
    $d = base_convert($d, 10, 16);
    return '#' . str_repeat(0, 6 - strlen($d)) . $d;
}
//массив наименований стилей цвета и их значений
//как имитация полученного из базы, редактируемой таблицы цветов
//где ключ - имя цвета из поля color_name и определяющего имя класса,
//а значение - значение цвета из поля color_value
//только в примере они выводятся постоянно
//в реальности, это должен быть подключаемый файл, изменяемый при добавлении/редактировании цвета 
$color = [
    'color_default' => 10066329, //значение по умолчанию - id в таблице базы = 1
    'color_hover' => 12235289, //значение по наведению - id в таблице базы = 2
    'color_2' => 16711680, //красный - id в таблице базы = 3
    'color_3' => 65280, //зеленый - id в таблице базы = 4
    'color_4' => 255 //синий - id в таблице базы = 5
];
//класс цвета для обработки по условию
//который в реальности может определятся через управление
//каким либо флагом 
$bonus = 'color_2';

//это имитация объектов полученных из базы
$objects = [
    ['id'=> 23, 'text'=> 'Text 1', 'price'=> 340, 'color'=> null],
    ['id'=> 12, 'text'=> 'Text 2', 'price'=> 400, 'color'=> 'color_2'],
    ['id'=> 22, 'text'=> 'Text 3', 'price'=> 300, 'color'=> null],
    ['id'=> 33, 'text'=> 'Text 4', 'price'=> 400, 'color'=> 'color_3'],
    ['id'=> 34, 'text'=> 'Text 5', 'price'=> 500, 'color'=> 'color_2'],
    ['id'=> 56, 'text'=> 'Text 6', 'price'=> 420, 'color'=> 'color_4']
];
?>
<!DOCTYPE HTML> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>
.seats_hall {
    font: 14px Tahoma, sans-serif;
    color: <?=dec_to_hex($color['color_default'])?>;
}
.seats_hall:hover {
    color: <?=dec_to_hex($color['color_hover'])?>;
}
<?
//определенные стили цвета в зависимости от цены/ряда
foreach(array_slice($color, 2) as $k=>$v) echo '.' . $k . '{color:' . dec_to_hex($v) . '}'
?>
</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
var color_ctrl = "<?=$bonus?>"; 
$(function() {
    //обработчик на все объекты
    $('.seats_hall').click(function() {
        //с индивидуальной обработкой элементов с классом color_2
        alert($(this).hasClass(color_ctrl) ? 'Bonus color' : 'Work color')
    });
    //обработчик на указанный цвет
    $('.'+color_ctrl).mouseenter(function() {
        alert('Bonus color')
    })
});
</script>     
</head> 

<body>
<?
//вывод объектов
echo implode('<br>', array_map(function($v) {
    return '<span id="obj-' .$v['id']. '" class="seats_hall '.$v['color'].'">' . $v['text'] . ', $' . $v['price'] . '</span>';
}, $objects))
?>
</body> 
</html>

Последний раз редактировалось laimas, 30.11.2015 в 05:40.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При клике на ссылку ничего не происходит gurg0n Элементы интерфейса 2 24.06.2013 11:11
Изменение цвета кнопки при активном поле paradox989 jQuery 7 08.06.2013 10:08
Кратное увеличение при клике на кнопку vabus Элементы интерфейса 2 15.04.2013 20:42
Запись cookes при клике pavdin Общие вопросы Javascript 3 06.02.2012 17:19
Закрыть элемент при клике вне его masterm Общие вопросы Javascript 3 31.07.2009 11:27