こんばんは。v1.7.5になってだいぶ安定した気はしますが・・・と言いつつアップデートです。
ひとつは、自動モブログを有効にしてると、アクセス解析の画面などでエラーが出る場合があると思うので、それに対処するためのutils.phpと(後、ソーシャルブックマークのAPIが変わったのがあるようでそれは今回見送り)、後は、JavaScript関連です。oParts.js に関してですが、サーバーのセキュリティーの設定によっては、IEでの外部HTCファイルの読み込みが出来なくなる可能性もあるので、それに対処しました(うちのところがそうだったんですが)。具体的には、外部HTCファイルの読み込みを止めました。代わりに、みんなが使っているdoScrollメソッドを利用することにしました。もともとは、Diego Perini氏 が見つけた手法です。右に倣えは好きではないけど、この場合、デメリットが見あたらない。
if(client.MSIE){ // IE向けDOMContentLoaded
(function(){
try {
document.documentElement.doScroll("left");
} catch(e){
setTimeout(arguments.callee, 1); return;
}
F(); // 発火!
})();
}
後は、IE8やらSafari3で使えるdocument.querySelectorAllを利用できるなら、そうするようにしました。Firefox3.1でも使えるようになるでしょうし。Nativeな実装なので、ずっと速いです。oParts.query()関数の中で指定しています。
次。エディタ用のスクリプトeditor.jsです。テキストエリアの高さ(縦幅)を文章の長さにフィットさせる関数をブラッシュアップして、結構正確に高さを合わせるようにしました。
function resizeTextArea(e){
var MSIE = /*@cc_on!@*/false;
var cssValue = function(p){ // 実際の諸々のサイズやらを取得する関数
if(window.opera) e.style.lineHeight = "130%"; // Operaでは、1.3みたいな指定を読んでくれない
return MSIE ? e.currentStyle[p.replace(/-¥D/, function(m){ return m.charAt(1).toUpperCase()})]
: getComputedStyle(e, '').getPropertyValue(p);
}
var ruler = d.createElement("SPAN"); // テキストエリアのシャドウを作成
ruler.textData = function(data){ if(MSIE) ruler.innerText = data; else ruler.textContent = data; };
/* 以下でテキストエリアのサイズに関する情報を取得 */
ruler.style.cssText += "position: absolute; left: 0; visibility: hidden; white-space: pre;"
+ "padding: " + cssValue('padding') + ";"
+ "font-size:"+ cssValue('font-size') + ";"
+ "line-height:" + cssValue('line-height') + ";"
+ "font-family:" + cssValue('font-family') + ";";
document.body.appendChild(ruler);
var rows = 1, lines = e.value.split(/¥n/), lineHeight = 17, curWidth = e.clientWidth;
for (var i = 0, len = lines.length; i < len; i++){
ruler.textData(lines[i]);
if(ruler.offsetWidth > curWidth) rows += parseInt(ruler.offsetWidth / curWidth);
}
ruler.textData("A¥nZ"); // テキストエリア1行分の高さを知りたい
lineHeight = ruler.offsetHeight/2; /* これでゲット*/
document.body.removeChild(ruler);
e.style.height = lineHeight * (rows + len + 1) + "px"; // rows+lenが見た目のほぼ正確な行数。遊びのために1行足す
}
挙動に関して、どういうのが使い勝手が良いかは、各人の好みによりますが、文字入力に応じてテキストエリアのサイズを自動的に変えたい場合は、editor.jsの778行目にあるコメントアウトを外して
ed.on('keyup', function(){
resizeTextArea(ed);
});
として下さい。一応、このデモサイト を挙げておきます。
例によって、最新版との差分を添付しておきます。単なる上書きで良いです。最新版のjs/oParts.jsにしたら、もはやjs/ie.htcは不要ですので削除して下さい。
JavaScript
Comments