IE и Firefox содержат способы выполнения JavaScript из CSS. Как отмечает Паоло, одним из способов в IE является метод expression
, но есть и более неясное поведение HTC , при котором отдельный XML, содержащий ваш скрипт, загружается через CSS. Подобная техника для Firefox существует, используя XBL . Эти методы не извлекают JavaScript из CSS напрямую , но эффект тот же.
HTC с IE
Используйте правило CSS примерно так:
body {
behavior:url(script.htc);
}
и в этом файле script.htc есть что-то вроде:
<PUBLIC:COMPONENT TAGNAME="xss">
<PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/>
</PUBLIC:COMPONENT>
<SCRIPT>
function main()
{
alert("HTC script executed.");
}
</SCRIPT>
Файл HTC выполняет функцию main()
для события ondocumentready
(в отношении готовности документа HTC.)
XBL с Firefox
Firefox поддерживает аналогичный хак, выполняющий XML-сценарии, с использованием XBL.
Используйте правило CSS примерно так:
body {
-moz-binding: url(script.xml#mycode);
}
и внутри вашего script.xml:
<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml">
<binding id="mycode">
<implementation>
<constructor>
alert("XBL script executed.");
</constructor>
</implementation>
</binding>
</bindings>
Будет выполнен весь код в теге конструктора (хорошая идея для переноса кода в раздел CDATA.)
В обоих методах код не выполняется, если селектор CSS не соответствует элементу в документе . Используя что-то вроде body
, оно будет выполнено немедленно при загрузке страницы.