Я хочу изменить фон/основной цвет многих символов с тем же классом CSS. Прямо сейчас я делаю его с jQuery — как $('back_COLORED').css('background-color', '#00FF00')
, но этот подход является медленным, когда существует много элементов с таким классом (> 900).
Кажется, что это - потому что jQuery не изменяется, CSS управляет собой, но находит все элементы один за другим и применяет встроенные стили к ним. По крайней мере, это - то, что я вижу в инспекторе. Так, вопрос:
UPD: я пытаюсь сделать некоторого редактора цветовой схемы. Источник по http://github.com/kurokikaze/cinnabar/. Не возражайте против вещей PHP, редактор является полностью клиентским (только с некоторыми библиотеками, выбранными от сети).
UPD2: Испытанный подход холста, все еще замедлитесь. Ответвление холста по http://github.com/kurokikaze/cinnabar/tree/canvas.
Если вы можете выбрать родительский div по id, может быть, вы можете выбрать по тегу внутри него? Или есть элементы одного типа, которые должны менять цвет и которые не должны, внутри родительского?
Было бы неплохо иметь представление о том, что вы здесь создаете. 900+ объектов кажется многовато... может быть, можно использовать совершенно другой подход? Canvas, SVG?
Самый удобный для разных браузеров способ переопределить определение класса - это написать новое правило и добавить его в конец последней таблицы стилей в документе. Вы можете редактировать существующее правило стиля, но даже некоторые недавние браузеры могут затруднить это.
function newRule(selector, csstext){
var SS= document.styleSheets, S= SS[SS.length-1];
// this example assumes at least one style or link element
if(S.rules){
S.addRule(selector,csstext,S.rules.length);
}
else if(S.cssRules){
S.insertRule(selector+'{'+csstext+'}'),S.cssRules.length)
}
}
newRule('.someclass','background-color:#0f0');
Вы можете добавить столько 'property: value;' биты в csstext по мере необходимости. Не забудьте поставить префикс '.' к имени класса или '#' к идентификатору, и CSS должны быть записаны как правило стиля (с-дефисами, а не camelCase).
Конечно, он не переопределяет встроенные стили, и это избыточно для небольших локальных изменений. Это также может сделать перерисовку страницы более очевидной, чем изменение одного элемента за раз, {{1 }} но это может быть именно то, что вам здесь нужно.
Попробуйте скрыть элементы, которые хотите изменить перед их изменением внесите изменения, а затем снова отобразите их. Это обычная практика для ускорения работы, поскольку вы минимизируете события перерисовки в области просмотра. В этом случае, когда вы устанавливаете только одно свойство css, это может быть бесполезно, но я говорю, что стоит попробовать.
Попробуйте:
$('back_COLORED').hide();
$('back_COLORED').css('background-color', '#00FF00');
$('back_COLORED').show();
или
$('back_COLORED').hide().css('background-color', '#00FF00').show();
В соответствии с JLS он называется:
-121--2145739-7,4,2 Безымянные пакеты
Модуль компиляции, не имеющий объявления пакета, является частью безымянного пакета.
Если Chrome не распознает схему URL, по умолчанию выполняется поиск.
Вот что я вижу в Safari: alt text http://img62.imageshack.us/img62/6792/clipboard02oh.jpg
и в Firefox:
alt text http://img138.imageshack.us/img138/9986/clipboard04xk.jpg
Я считаю, что причина, по которой Chrome по умолчанию выполняет поиск, заключается в том, что существуют специальные поиски Google, которые используют двоеточие.
E.g:
Это одно из неприятностей, которые я испытываю с Firefox, я должен перейти в «поле поиска», а не адресную строку для выполнения этих типов поиска. Поскольку Chrome не имеет отдельного поля поиска, как Firefox, IE и Safari, эта функциональность необходима.
Запросы Ajax не смогут вас обойти.
-121--1530544- Вместо анализа DOM я бы попытался изменить свойство CSS.
Здесь речь идет о движке CSS против DOM + JS, и победитель ясен.
Бывает, что я только что загрузил крошечную библиотеку, которая заменяет CSS на Javascript: jstyle
Это может быть переполнение, но вы найдете в исходном коде jstyle.js весь код, который вам нужен для обновления свойств CSS вашей страницы.
Я думаю, что лучшим решением было бы написать более конкретное правило CSS (которое переопределило бы нормальный цвет), которое можно активировать, просто изменив класс css одного элемента.
Так, например, если у вас была следующая структурная разметка:
<div id="container">
<span class="colored">Test 1</span>
<span class="colored">Test 2</span>
</div>
И CSS: -
.colored { background-color: red; }
.newcolor .colored { background-color: blue; }
Затем в вашем jquery вы добавляете класс .newcolor в контейнер div: -
$('#container').addClass('.newcolor');
Когда вы это делаете, второй CSS правило переопределит первое, потому что оно более конкретное.
Вставьте код css в тег стиля
:
var style = $('style').attr({
type:"text/css",
media:"screen",
id:'changeStyle'
}).html('.tempClass { color:red } .tempClass p { background:blue }').prependTo('body');
и при каждом изменении вашего цвета с помощью в палитре цветов вы только переписываете html внутри тега #changeStyle
.
Не знаю, работает ли это (не проверял), но стоит попробовать.
Есть разные способы в зависимости от того, с каким браузером вы имеете дело. Это документировано в Quirks Mode.
Некоторые библиотеки предоставляют слой абстракции, например утилита StyleSheet от YUI.
Должен быть значительный прирост производительности, поскольку вы не используете JS/DOM для циклического перебора всех элементов.
Другим подходом может быть предопределение стилей:
body.foo .myElements { … }
А затем редактирование document.body.className
Это плагин jQuery для работы с правилами css: http://flesler.blogspot.com/2007/11/jqueryrule.html
не уверен в его производительности, но попробовать стоит.