Как удалить внедренный ресурс CSS в GWT?

Я хочу удалить внедренный CSSResource в приложении GWT.

Я использовал следующий код MyClass.INSTANCE.ensureInjected();

Мне нужен указанный выше CSSResource только для определенной страницы. Таким образом, остальные страницы должны работать в соответствии с фактическим css/темой.

Как только я введу это, оно применимо для всего приложения. Как я могу преодолеть это?


person Rajaa    schedule 17.08.2013    source источник


Ответы (3)


Вы можете внедрить свой пакет css, используя непосредственно служебный класс StyleInjector вместо метода ensureInjected()

Затем у вас будет ссылка на введенный элемент, который вы можете удалить, когда захотите.

// Equivalent to MyClass.INSTANCE.ensureInjected()
StyleElement e  = StyleInjector.injectStylesheet(MyClass.INSTANCE.css().getText());


// Remove the injected css element
e.removeFromParent();
person Manolo Carrasco Moñino    schedule 19.08.2013

Теоретически вы можете попытаться удалить внедренный блок стилей из DOM, но это будет довольно сложно (и, возможно, не очень надежно).

Гораздо лучше организовать вашу «специальную» таблицу стилей CSS по-другому:

Поверните селекторы, как

.some {
  color: green;
}

.other {
  color: red;
}

в

.special .some {
  color: green;
}

.special .other {
  color: red;
}

а затем добавить/удалить «специальный» класс, например. в/из вашего элемента тела, чтобы активировать/деактивировать специальные стили.

person Chris Lercher    schedule 18.08.2013
comment
Мне нравится это решение, оно сделало бы создание скинов довольно чистым и простым. - person Christian Achilli; 19.08.2013

Если вы встроили одно и то же приложение GWT более чем на 1 страницу и хотите, чтобы поведение было другим на основе данной страницы, вы можете, например, вызвать метод

MyClass.INSTANCE.ensureInjected();

если установлен параметр начальной загрузки. На главной странице установите параметр, например YourGwtApp.nocahe.js?css=inject, и прочитайте его, как это объяснено здесь В onLoadMethod вызовите ensureInjected в соответствии с вашим параметром начальной загрузки.

person Christian Achilli    schedule 17.08.2013
comment
В приложении AJAX (или GWT) вы обычно не загружаете другую страницу (которая перестраивает DOM), поэтому внедренный CSS остается на странице. - person Chris Lercher; 18.08.2013
comment
@ChrisLercher, если вы не завернете его (it = MyClass.INSTANCE.ensureInjected()) в блок GWT.runAsynch - person Christian Achilli; 19.08.2013
comment
Блок runAsync просто означает, что код javascript для этого блока может быть загружен позже. Но как только этот код выполнен, введенный элемент стиля остается в DOM - до тех пор, пока вы не удалите его явно (см., например, ответ @Manolo). - person Chris Lercher; 19.08.2013
comment
@ChrisLercher, это правда. В сценарии вопроса блок runAsync будет либо вызываться, либо вообще не вызываться для данной страницы. Таким образом, код будет находиться в DOM только для той страницы, которая ему действительно нужна. Я согласен, что это не очень чисто для желаемой функции. ИМХО, это просто прекрасно подходит для данной реализации в вопросе, который сам по себе не очень чист. - person Christian Achilli; 19.08.2013