Быстро перекрасьте массив unicode символов в JavaScript

Я хочу изменить фон/основной цвет многих символов с тем же классом CSS. Прямо сейчас я делаю его с jQuery — как $('back_COLORED').css('background-color', '#00FF00'), но этот подход является медленным, когда существует много элементов с таким классом (> 900).

Кажется, что это - потому что jQuery не изменяется, CSS управляет собой, но находит все элементы один за другим и применяет встроенные стили к ним. По крайней мере, это - то, что я вижу в инспекторе. Так, вопрос:

  • Как я могу измениться, CSS управляет собой?
  • Это будет намного быстрее?
  • Я могу сделать это перекрестным браузером (IE6 не рассчитывает)?

UPD: я пытаюсь сделать некоторого редактора цветовой схемы. Источник по http://github.com/kurokikaze/cinnabar/. Не возражайте против вещей PHP, редактор является полностью клиентским (только с некоторыми библиотеками, выбранными от сети).

UPD2: Испытанный подход холста, все еще замедлитесь. Ответвление холста по http://github.com/kurokikaze/cinnabar/tree/canvas.

8
задан Kuroki Kaze 27 February 2010 в 14:12
поделиться

8 ответов

Если вы можете выбрать родительский div по id, может быть, вы можете выбрать по тегу внутри него? Или есть элементы одного типа, которые должны менять цвет и которые не должны, внутри родительского?

Было бы неплохо иметь представление о том, что вы здесь создаете. 900+ объектов кажется многовато... может быть, можно использовать совершенно другой подход? Canvas, SVG?

1
ответ дан 5 December 2019 в 20:15
поделиться

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

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 }} но это может быть именно то, что вам здесь нужно.

3
ответ дан 5 December 2019 в 20:15
поделиться

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

Попробуйте:

$('back_COLORED').hide();
$('back_COLORED').css('background-color', '#00FF00');
$('back_COLORED').show();

или

$('back_COLORED').hide().css('background-color', '#00FF00').show();
1
ответ дан 5 December 2019 в 20:15
поделиться

В соответствии с JLS он называется:

7,4,2 Безымянные пакеты

Модуль компиляции, не имеющий объявления пакета, является частью безымянного пакета.

-121--2145739-

Если 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:

  • определить: словарь
  • filetype: pdf google chromium

Это одно из неприятностей, которые я испытываю с Firefox, я должен перейти в «поле поиска», а не адресную строку для выполнения этих типов поиска. Поскольку Chrome не имеет отдельного поля поиска, как Firefox, IE и Safari, эта функциональность необходима.

Запросы Ajax не смогут вас обойти.

-121--1530544-

Вместо анализа DOM я бы попытался изменить свойство CSS.
Здесь речь идет о движке CSS против DOM + JS, и победитель ясен.

Бывает, что я только что загрузил крошечную библиотеку, которая заменяет CSS на Javascript: jstyle

Это может быть переполнение, но вы найдете в исходном коде jstyle.js весь код, который вам нужен для обновления свойств CSS вашей страницы.

1
ответ дан 5 December 2019 в 20:15
поделиться

Я думаю, что лучшим решением было бы написать более конкретное правило 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 правило переопределит первое, потому что оно более конкретное.

0
ответ дан 5 December 2019 в 20:15
поделиться

Вставьте код css в тег стиля :

var style = $('style').attr({
    type:"text/css",
    media:"screen",
    id:'changeStyle'
}).html('.tempClass { color:red } .tempClass p { background:blue }').prependTo('body');

и при каждом изменении вашего цвета с помощью в палитре цветов вы только переписываете html внутри тега #changeStyle .

Не знаю, работает ли это (не проверял), но стоит попробовать.

0
ответ дан 5 December 2019 в 20:15
поделиться

Есть разные способы в зависимости от того, с каким браузером вы имеете дело. Это документировано в Quirks Mode.

Некоторые библиотеки предоставляют слой абстракции, например утилита StyleSheet от YUI.

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

Другим подходом может быть предопределение стилей:

body.foo .myElements { … }

А затем редактирование document.body.className

2
ответ дан 5 December 2019 в 20:15
поделиться

Это плагин jQuery для работы с правилами css: http://flesler.blogspot.com/2007/11/jqueryrule.html

не уверен в его производительности, но попробовать стоит.

0
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: