[21] [DFN[[CODE(CSS)@en[[[expression()]]]]]] は、[[引数]]として指定された
[[JavaScript]] [[コード]]を実行し、その結果を返す[[CSSの関数]]でした。
[[IE]] が実装していました。

- [1] ''JavaScript質問スレ'' <http://pc2.2ch.net/test/read.cgi/hp/1041701828/791-> [CODE(CSS)[expression()]] が評価されるのはいつか→マズー
- [2] ''About Dynamic Properties'' <http://msdn.microsoft.com/workshop/author/dhtml/overview/recalc.asp>

[3]
/my/misbehaviors/ <http://dean.edwards.name/my/misbehaviors/>

WinIE の CSS の拡張の expression 関数は便利ですが、事あるごとに再評価されるので動作が遅くなります。そういう時は、この文書で紹介されているように expression の中で自分自身の指定を別のもので上書きしてしまう手法が使えるかもしれません。というわけでメモ。 (名無しさん 2005-03-26 03:07:34 +00:00)
([[名無しさん]])

[4]

>
[PRE(CSS example code)[
html{behavior:expression(function(element){
 // do something
 // trash this expression
 runtimeStyle.behavior = "none";
}(this))}
]PRE]

([[名無しさん]])

[5]
[[Windows XP]] の [[SP]] 2 で [[WinIE]]
に意味があるのかないのかよくわからない変な安全対策が入ったのは有名な話です。
Local file を開いた時に中にスクリプトが含まれていれば、ブラウザ上部に[[情報バー]]とやらが出てきて、そこからスクリプトを実行することを選べば、従来通り (その文書をその時に限って) 実行します・・・とされています。

[[CSS]] 内の [CODE(CSS)[[[expression]]()]]
と [[HTC]] も影響を受けます。
[CODE(CSS)[expression]] は[[情報バー]]から指示すればちゃんと評価されるようですが、
[[HTC]] はなぜか動きません。
というのは [[HTML文書]]の話で、
[[XML文書]]だと[[情報バー]]が再度表示されて、
[CODE(CSS)[[[expression]]]] や
[[HTC]] はまったく実行されません。
([[名無しさん]] [WEAK[2005-04-23 05:40:56 +00:00]])

[6]
回避策は2つあります。1つは [CODE(HTML)[[[saved from url]]]] という呪文を書く方法。もう1つは [[MHT]]
を使う方法。実は更にもう1つ、 [[HTA]]
を使う方法もあります。
最初の2つの方法は[[注釈宣言]]や
[CODE(MIME)[[[Content-Location]]]] を使って適当な [[URI参照]]を指定して、 local file でも[[インターネット ゾーン]] (など) 
として処理させます。

ただし [CODE(HTML)[[[saved from url]]]]
は [[XML文書]]には使えません
[WEAK[(MS は SP2 から使えるようにしたと言っていますが、実際には機能しないようです)]]。

[[MHT]] ではなぜか [[HTC]] が動きません
[WEAK[([CODE(CSS)[[[expression]]]] は動きます)]]。
[[MHT]] 内では [[CSS]] の処理がおかしいような気がしますが、詳しい症状や再現条件はよくわかりません。
[[MHT]] の
[CODE(MIME)[[[multipart/related]]]]
の [CODE(MIME)[[[type]]]] [[引数]]と[[根部分]]の[[媒体型]]は
[CODE(MIME)[[[text/html]]]] でなければなりません。
実際には [[XML文書]]でも、 
[CODE(MIME)[[[text/html]]]] にします
[WEAK[(それが MS クオリティ)]]。

[[HTA]] は安全上の制限が全然無いようですが、
本当に [CODE(CSS)[[[expression]]]] や
[[HTC]] が完全に動くのかは未確認です。
それ以前に名前通り [[HTML文書]]しか使えないので、
[[XML文書]]のスクリプトの問題の解決にはなりません。
[CODE(HTMLe)[[[meta]]]] [CODE(HTTP)[[[Refresh]]]]
を使って [[XML文書]]を開かせると、
[CODE(MIME)[[[text/plain]]]] として扱うようです。
(ちなみに [CODE(HTMLe)[[[a]]]] や
[CODE(JS)[[[location]].[[href]]]]
を使うと別の [[WinIE]] の窓が開きます
[WEAK[(もちろん安全関係は通常の [[WinIE]] 通り)]]。
[CODE(HTMLe)[[[iframe]]]] を使うとその中身は通常の [[WinIE]]
通りになってしまいます
[WEAK[(つまり安全上の制限がある)]]。
[WEAK[([CODE(HTMLe)[[[iframe]]]] 内には[[情報バー]]が出ません。だから安全上の制限が掛かるとまったく解除できません。)]])

([[名無しさん]] [WEAK[2005-04-23 06:41:12 +00:00]])

[7]
>>6 [[MHT]] + [CODE(CSS)[[[expression]]]]
でも、 removable disk drive にあるファイルだと例の安全制限で開けません。
(許可するとしても再び安全制限〜が出てくるパターン。)
単純に local disk drive に複製してそっちを開けば回避できます。
([[名無しさん]] [WEAK[2005-05-03 02:55:57 +00:00]])

[8]
[CITE[expression() のまとめ]] <http://useyan.x0.com/s/html/expression/>
([[名無しさん]])

[9]
[CODE(CSS)[expression]] 内では丸括弧の対応がとれていることと、
逆斜線 ([CODE(char)[\]]) が最初に [[CSS]] として解釈された後に
[[JavaScript]] として解釈されることに注意が必要です。
([[名無しさん]])

[10]
[CITE[[openmya:035806] IE における "expression" の過剰検出による XSS の 誘因]] <http://archive.openmya.devnull.jp/2006.08/msg00369.html>
([[名無しさん]] [WEAK[2006-09-08 12:02:58 +00:00]])

[11]
[CITE[hoshikuzu | star_dust の書斎]] <http://d.hatena.ne.jp/hoshikuzu/20061104#p1>
([[名無しさん]] [WEAK[2006-11-05 23:45:37 +00:00]])

[12]
[CITE[IE expressions ignore CSS media types | 456 Berea Street]] <http://www.456bereastreet.com/archive/200611/ie_expressions_ignore_css_media_types/>
([[名無しさん]] [WEAK[2006-11-30 00:16:23 +00:00]])

[13]
[CITE[IE expressions ignore CSS media types | 456 Berea Street]] <http://www.456bereastreet.com/archive/200611/ie_expressions_ignore_css_media_types/>
([[名無しさん]] [WEAK[2006-11-30 00:16:40 +00:00]])

[14]
[CITE@en[CSS Expression Optimization (WebFX)]] ([CODE[2003-04-28 00:56:47 +09:00]] 版) <http://webfx.eae.net/dhtml/cssexpr/cssexpr.html>
([[名無しさん]] [WEAK[2007-02-22 23:34:04 +00:00]])

[15]
[CODE(CSS)@en[[[expression]]()]] を使った場合の [[WinIE 7]] における [[CSSOM]] 上の表現はなんか変です。

- [CODE(DOMi)@en[[[CSSStyleDeclaration]]]] に現れる値は、
[CODE(CSS)@en[[[expression]]()]] が使われている[[宣言]]が存在しないとした場合のものになります。
-- 例の場合、 [CODE(CSS)@en[[[red]]]]
- [CODE(DOMa)@en[[[cssText]]]] に現れる値は、
-- 他に [CODE(CSS)@en[[[expression]]()]] が使われていない[[妥当]]な[[宣言]]が存在する場合、
[CODE(CSS)@en[[VAR[PROP-NAME]]: [VAR[NO-EXPRESSION-VALUE]]; ; [VAR[PROP-NAME]]: expression([VAR[...]])]]
となります。
--- [CODE(CSS)@en[[[expression]]()]] を使った[[宣言]]が複数ある場合、最後のものになります。
([[レンダリング]]時に[[評価]]されるのも最後のものだけです。最後のものがエラーになるか、
[[特性]]に関して[[妥当]]な値にならない場合には、 [CODE(CSS)@en[[[expression]]()]]
を使わない値があればそれで[[レンダリング]]されます。)
-- 他に [CODE(CSS)@en[[[expression]]()]] が使われていない[[妥当]]な[[宣言]]が存在しない場合、
何もなくなります。

;; 
<http://suika.suikawiki.org/gate/2007/cssom/viewer.en.html?c=p%20%7B%0D%0A%20%20background-color%3Awhite%3B%0D%0A%20%20color%3Aexpression('green')%3B%0D%0A%20%20color%3Aexpression('yellow')%3B%0D%0A%20%20color%3Ared%3B%0D%0A%7D;h=%3Cp%3Exxxx;p=n;x=style-element;i=html-div>

([[名無しさん]])


[16]
>>4 のように [CODE(DOMa)@en[[[runtimeStyle]]]] で上書きできるということは、
[CODE(CSS)@en[[[expression]]()]] の評価値は [CODE(DOMa)@en[[[runtimeStyle]]]]
に入っているのかなあと思って確かめてみましたが、違いました。 (よく考えると、
もしそうだったら次に [CODE(CSS)@en[[[expression]]()]] が評価された結果の
[CODE(DOMa)@en[[[runtimeStyle]]]] と[[スクリプト]]から直接指定された
[CODE(DOMa)@en[[[runtimeStyle]]]] の区別が必要になって面倒ですね。)
[CODE(DOMa)@en[[[currentStyle]]]] は [CODE(CSS)@en[[[expression]]()]] の評価結果になっているみたいです。

[17] 
[CITE[IE の innerHTML や appendChild で要素が挿入された瞬間を取得する方法 - IT戦記]] ([TIME[2008-12-13 09:47:33 +09:00]] 版) <http://d.hatena.ne.jp/amachang/20080530/1212120953>

[[変異事象]]の代わりに使う。

[18] [CITE[CSSセレクタの開発から得られたノウハウのフィードバック + IE8でメソッドをフックする(HTMLElementプロトタイピング) - uupaaの開発日記]] ([TIME[2008-12-27 13:41:45 +09:00]] 版) <http://d.hatena.ne.jp/uupaa/20081129/1227951320>

>
ところが、テキストを選択 + 選択範囲をドラッグすると、マウスが1px動くたびに DOMAttrModified が際限なく呼ばれてしまいます。
>
どうやらIEでは見えないノードが自動で追加され、何らかの属性値がマウスの動きにあわせて改変され続けるようです。

[19] [CITE[setExpression と removeExpression について調べ物 - latest log]] ([TIME[2009-02-23 20:53:41 +09:00]] 版) <http://d.hatena.ne.jp/uupaa/20090223/1235327839>

[20] [CODE(CSS)@en[[[expression]]]] 内で変数に代入すると、 [[CSS]] の外側から [CODE(JS)@en[[[window]]]] [[オブジェクト]]の[[特性]]として (つまり[[大域変数]]として)
アクセスできます。ということは [CODE(CSS)@en[[[expression]]]] 内での
[[scope]] [[オブジェクト]]は[[大域オブジェクト]]であって、[[文書]]全体と共通の
[CODE(JS)@en[[[window]]]] [[オブジェクト]]であると推測されるわけですが (実際
[CODE(JS)@en[[[alert]]]] とかもあるし)、 [CODE(CSS)@en[[[expression]]]]
内で [CODE(JS)@en[b = this]] のようにしてそれを [[CSS]]
の外から取ろうとしても、なぜか [CODE(JS)@en[[[undefined]]]]
になっています。


[22] [CITE@EN-US[Dynamic Properties]], [[InetSDK]], [TIME[2024-08-17T03:56:01.000Z]], [TIME[2000-12-08T19:38:14.524Z]] <https://web.archive.org/web/20001208193800/http://msdn.microsoft.com/workshop/Author/dhtml/overview/recalc.asp>

[23] 
[CITE@EN-US[Web Workshop - Be More Dynamic]], [[Michael Wallent]], [TIME[2024-08-17T06:22:47.000Z]], [TIME[2000-10-31T06:30:42.377Z]] <https://web.archive.org/web/20001031062055/http://msdn.microsoft.com/workshop/Author/dhtml/dude061198.asp>


[24] 
[CITE@EN-US[Dynamic Properties]], [[InetSDK]], [TIME[2024-08-17T06:28:14.000Z]], [TIME[2000-11-09T16:36:35.038Z]] <https://web.archive.org/web/20001109163100/http://msdn.microsoft.com/workshop/Author/dhtml/overview/recalc.asp>


[25] 関連: [[スクリプトマクロ]]