Hatena::Diary

御玉杓子スパイラル

お品書き

20081218

Opera の cssText

firefox とかで, cssText に += して更新したとき, 更新した内容をパースして一旦プロパティを更新してから, 取得するときには再び自身のプロパティより構築するようなのだけれど, opera の場合, cssText は,保存されていて, 取得するときにはそれがそのまま使われるらしい.

いや, そのままと言うのもちょっとヘン. なんかよくわからないけれど, 末尾のセミコロンは消されてしまうし. ともかく cssText に += を繰り返すと, opera の場合はどんどん追加されていってしまう.

その結果どうなるかと言えば, cssText 用に割当てられたバッファを使い切り, オーバーフローはしないけれど, それ以降の cssText への追加は, 奇妙に途切れた cssText によるスタイルの変更と見做されるようになるらしい.

試しに

var div = document.createElement('div');
var s = div.style;
s.cssText="";

for(var i=0;i<274;i++){
  s.cssText += ';width: 1000px;';
}
document.write(s.cssText);
alert(s.cssText.length);

こんなのを走らせてみた. エラーコンソールから, cssの警告がでることが確認できた. ダイアログに表示された数字は, 4093 だけれど, 画面上に表示された cssText の内容はエラーコンソールに出たエラー部分は消えていたので, バッファの大きさは終端文字を抜いて 4096バイトらしい.

しかし, この問題, 強制的にプロパティをセットしなおしたらなんとかなるんじゃないかしらと, document.write の直前に, s.width = s.width ; としても結果は変わらず. また, s.width = '0px' としてみたら, くそ長い cssText の一番最後の width だけが置きかわっていた.

どうも, opera でスタイルを操作するのがクソのろいのだけれど, もしかして, opera の style って cssText を管理する為のもので要素の視覚情報を操作するものとはオブジェクトプロパティを介してではなく cssText を介して値を渡してるのじゃないかしら……

ともかく, 再フローを防ぐ為に, cssText に += するってのはあまり使えないらしく, 正規表現やらでちゃんと内容を管理してやるか, 属性を一気に更新するようにしたほうがいいらしい.

トラックバック - http://d.hatena.ne.jp/lieutar/20081218/1229628271
おとなり日記
あわせて読みたい
フィードメーター - 御玉杓子スパイラル アクセス解析 survive SNS
id:lieutar
去年の年末もいろんなものをリセットしてそこから再スタートしたのだけれど……またリセットするのもちょっとなぁ.
id:lieutar
なんか, いろいろとチラ裏にうもれて収拾がつかん……困った!
本名でググると
ちびっ子健康マラソンで二位だったり, 京都で和風の雑貨を販売してたり, 土木学会でなんか研究発表してたりした
オノヨーコの個展で、ジョンが天井の穴を覗き込んだら、「Yes」じゃなくて何が書いてあった?
違うよことえりの仕業だよ
今日の脳内会議の議題
ある個人の力に頼った活動が、その個人が突然不幸に逢い中止されたとする。その刹那発火しやすい思考のパターンを、個人の信用や活動内容、不幸の種類等からいくつか考える。
ひらがなで日本語以外の歌をくちずさむ
ばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃばっじゃまっしゅるーまっしゅるー
オノヨーコの個展で、ジョンが天井の穴を覗き込んだら、「Yes」じゃなくて何が書いてあった?
http://media.tumblr.com/Xkjn5bAiFgrpi1yoTPvwF7iHo1_400.jpg
バカだと思いながらやる行為
中学時代は届いたよ