expression

expression() 関数 (CSS)

[21] expression() は、引数として指定された JavaScript コードを実行し、その結果を返すCSSの関数でした。 IE が実装していました。

[3] /my/misbehaviors/ <http://dean.edwards.name/my/misbehaviors/>

WinIE の CSS の拡張の expression 関数は便利ですが、事あるごとに再評価されるので動作が遅くなります。そういう時は、この文書で紹介されているように expression の中で自分自身の指定を別のもので上書きしてしまう手法が使えるかもしれません。というわけでメモ。 (名無しさん 2005-03-26 03:07:34 +00:00) (名無しさん)

[4]

html{behavior:expression(function(element){
 // do something
 // trash this expression
 runtimeStyle.behavior = "none";
}(this))}

(名無しさん)

[5] Windows XPSP 2 で WinIE に意味があるのかないのかよくわからない変な安全対策が入ったのは有名な話です。 Local file を開いた時に中にスクリプトが含まれていれば、ブラウザ上部に情報バーとやらが出てきて、そこからスクリプトを実行することを選べば、従来通り (その文書をその時に限って) 実行します・・・とされています。

CSS 内の expression()HTC も影響を受けます。 expression情報バーから指示すればちゃんと評価されるようですが、 HTC はなぜか動きません。 というのは HTML文書の話で、 XML文書だと情報バーが再度表示されて、 expressionHTC はまったく実行されません。 (名無しさん 2005-04-23 05:40:56 +00:00)

[6] 回避策は2つあります。1つは saved from url という呪文を書く方法。もう1つは MHT を使う方法。実は更にもう1つ、 HTA を使う方法もあります。 最初の2つの方法は注釈宣言Content-Location を使って適当な URI参照を指定して、 local file でもインターネット ゾーン (など) として処理させます。

ただし saved from urlXML文書には使えません (MS は SP2 から使えるようにしたと言っていますが、実際には機能しないようです)

MHT ではなぜか HTC が動きません (expression は動きます)MHT 内では CSS の処理がおかしいような気がしますが、詳しい症状や再現条件はよくわかりません。 MHTmultipart/relatedtype 引数根部分媒体型text/html でなければなりません。 実際には XML文書でも、 text/html にします (それが MS クオリティ)

HTA は安全上の制限が全然無いようですが、 本当に expressionHTC が完全に動くのかは未確認です。 それ以前に名前通り HTML文書しか使えないので、 XML文書のスクリプトの問題の解決にはなりません。 meta Refresh を使って XML文書を開かせると、 text/plain として扱うようです。 (ちなみに alocation.href を使うと別の WinIE の窓が開きます (もちろん安全関係は通常の WinIE 通り)iframe を使うとその中身は通常の WinIE 通りになってしまいます (つまり安全上の制限がある)(iframe 内には情報バーが出ません。だから安全上の制限が掛かるとまったく解除できません。))

(名無しさん 2005-04-23 06:41:12 +00:00)

[7] >>6 MHT + expression でも、 removable disk drive にあるファイルだと例の安全制限で開けません。 (許可するとしても再び安全制限〜が出てくるパターン。) 単純に local disk drive に複製してそっちを開けば回避できます。 (名無しさん 2005-05-03 02:55:57 +00:00)

[8] expression() のまとめ <http://useyan.x0.com/s/html/expression/> (名無しさん)

[9] expression 内では丸括弧の対応がとれていることと、 逆斜線 (\) が最初に CSS として解釈された後に JavaScript として解釈されることに注意が必要です。 (名無しさん)

[10] [openmya:035806] IE における "expression" の過剰検出による XSS の 誘因 <http://archive.openmya.devnull.jp/2006.08/msg00369.html> (名無しさん 2006-09-08 12:02:58 +00:00)

[11] hoshikuzu | star_dust の書斎 <http://d.hatena.ne.jp/hoshikuzu/20061104#p1> (名無しさん 2006-11-05 23:45:37 +00:00)

[12] IE expressions ignore CSS media types | 456 Berea Street <http://www.456bereastreet.com/archive/200611/ie_expressions_ignore_css_media_types/> (名無しさん 2006-11-30 00:16:23 +00:00)

[13] IE expressions ignore CSS media types | 456 Berea Street <http://www.456bereastreet.com/archive/200611/ie_expressions_ignore_css_media_types/> (名無しさん 2006-11-30 00:16:40 +00:00)

[14] CSS Expression Optimization (WebFX) (2003-04-28 00:56:47 +09:00 版) <http://webfx.eae.net/dhtml/cssexpr/cssexpr.html> (名無しさん 2007-02-22 23:34:04 +00:00)

[15] expression() を使った場合の WinIE 7 における CSSOM 上の表現はなんか変です。

<http://suika.fam.cx/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 のように runtimeStyle で上書きできるということは、 expression() の評価値は runtimeStyle に入っているのかなあと思って確かめてみましたが、違いました。 (よく考えると、 もしそうだったら次に expression() が評価された結果の runtimeStyleスクリプトから直接指定された runtimeStyle の区別が必要になって面倒ですね。) currentStyleexpression() の評価結果になっているみたいです。

[17] IE の innerHTML や appendChild で要素が挿入された瞬間を取得する方法 - IT戦記 ( 版) <http://d.hatena.ne.jp/amachang/20080530/1212120953>

変異事象の代わりに使う。

[18] CSSセレクタの開発から得られたノウハウのフィードバック + IE8でメソッドをフックする(HTMLElementプロトタイピング) - uupaaの開発日記 ( 版) <http://d.hatena.ne.jp/uupaa/20081129/1227951320>

ところが、テキストを選択 + 選択範囲をドラッグすると、マウスが1px動くたびに DOMAttrModified が際限なく呼ばれてしまいます。

どうやらIEでは見えないノードが自動で追加され、何らかの属性値がマウスの動きにあわせて改変され続けるようです。

[19] setExpression と removeExpression について調べ物 - latest log ( 版) <http://d.hatena.ne.jp/uupaa/20090223/1235327839>

[20] expression 内で変数に代入すると、 CSS の外側から window オブジェクト特性として (つまり大域変数として) アクセスできます。ということは expression 内での scope オブジェクト大域オブジェクトであって、文書全体と共通の window オブジェクトであると推測されるわけですが (実際 alert とかもあるし)、 expression 内で b = this のようにしてそれを CSS の外から取ろうとしても、なぜか undefined になっています。