[21] expression()
は、引数として指定された
JavaScript コードを実行し、その結果を返すCSSの関数でした。
IE が実装していました。
expression()
が評価されるのはいつか→マズー[3] /my/misbehaviors/ http://dean.edwards.name/my/misbehaviors/
WinIE の CSS の拡張の expression 関数は便利ですが、事あるごとに再評価されるので動作が遅くなります。そういう時は、この文書で紹介されているように expression の中で自分自身の指定を別のもので上書きしてしまう手法が使えるかもしれません。というわけでメモ。 (名無しさん 2005-03-26 03:07:34 +00:00) (名無しさん)
html{behavior:expression(function(element){ // do something // trash this expression runtimeStyle.behavior = "none"; }(this))}
(名無しさん)
[5] Windows XP の SP 2 で WinIE に意味があるのかないのかよくわからない変な安全対策が入ったのは有名な話です。 Local file を開いた時に中にスクリプトが含まれていれば、ブラウザ上部に情報バーとやらが出てきて、そこからスクリプトを実行することを選べば、従来通り (その文書をその時に限って) 実行します・・・とされています。
CSS 内の expression()
と HTC も影響を受けます。
expression
は情報バーから指示すればちゃんと評価されるようですが、
HTC はなぜか動きません。
というのは HTML文書の話で、
XML文書だと情報バーが再度表示されて、
expression
や
HTC はまったく実行されません。
(名無しさん 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 url
は XML文書には使えません
(MS は SP2 から使えるようにしたと言っていますが、実際には機能しないようです)。
MHT ではなぜか HTC が動きません
(expression
は動きます)。
MHT 内では CSS の処理がおかしいような気がしますが、詳しい症状や再現条件はよくわかりません。
MHT の
multipart/related
の type
引数と根部分の媒体型は
text/html
でなければなりません。
実際には XML文書でも、
text/html
にします
(それが MS クオリティ)。
HTA は安全上の制限が全然無いようですが、
本当に expression
や
HTC が完全に動くのかは未確認です。
それ以前に名前通り HTML文書しか使えないので、
XML文書のスクリプトの問題の解決にはなりません。
meta
Refresh
を使って XML文書を開かせると、
text/plain
として扱うようです。
(ちなみに a
や
location.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 上の表現はなんか変です。
CSSStyleDeclaration
に現れる値は、
expression()
が使われている宣言が存在しないとした場合のものになります。red
cssText
に現れる値は、expression()
が使われていない妥当な宣言が存在する場合、
PROP-NAME: NO-EXPRESSION-VALUE; ; PROP-NAME: expression(...)
となります。expression()
を使った宣言が複数ある場合、最後のものになります。
(レンダリング時に評価されるのも最後のものだけです。最後のものがエラーになるか、
特性に関して妥当な値にならない場合には、 expression()
を使わない値があればそれでレンダリングされます。)expression()
が使われていない妥当な宣言が存在しない場合、
何もなくなります。(名無しさん)
[16]
>>4 のように runtimeStyle
で上書きできるということは、
expression()
の評価値は runtimeStyle
に入っているのかなあと思って確かめてみましたが、違いました。 (よく考えると、
もしそうだったら次に expression()
が評価された結果の
runtimeStyle
とスクリプトから直接指定された
runtimeStyle
の区別が必要になって面倒ですね。)
currentStyle
は expression()
の評価結果になっているみたいです。
[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
になっています。
[22] Dynamic Properties, InetSDK, , https://web.archive.org/web/20001208193800/http://msdn.microsoft.com/workshop/Author/dhtml/overview/recalc.asp
[23] Web Workshop - Be More Dynamic, Michael Wallent, , https://web.archive.org/web/20001031062055/http://msdn.microsoft.com/workshop/Author/dhtml/dude061198.asp
[24] Dynamic Properties, InetSDK, , https://web.archive.org/web/20001109163100/http://msdn.microsoft.com/workshop/Author/dhtml/overview/recalc.asp