« 俺と毎年恒例、海!! | メイン | 俺と財布とウォレットチェーン »

MovableTypeのエントリー高速検索WidgetとSafari MovableType

前に書いた「エントリー高速検索Widget
実は、最初はJSONの読み込み部分

<script type="text/javascript" src="<$MTBlogURL$>data.js"></script>

これを

var s = document.getElementsByTagName("head")[0].appendChild(document.createElement("script"));
s.type = "text/javascript";
s.charset = "utf-8";
s.src = "<$MTBlogURL$>data.js";

こうやって書いていた。

で、さーて日記にでも書こうかなと思って
動作確認したらSafariで動かない・・・orz

調べてたら
Safari JavaScript ファイルを動的ロードできない件
このページを発見・・・

一年以上前のページだけど
あぁ、Safariは出来ないんだなぁって
諦めていた・・・

ところが、

今日、仕事でちょと調べ物してたら
こんなページを発見。

何気なくjavascriptのソースを読んでたらコメント部分に・・・

// Gotcha: set attribute and src BEFORE appending, or Safari won't work

ん・・・・( ・д⊂ヽ゛ゴシゴシ

// Gotcha: set attribute and src BEFORE appending, or Safari won't work
(超訳:わかった!!!attribute srcは追加する前にセットしとかないとSafariじゃ動かないぜ!!!)

工エエェェ(´д`)ェェエエ工工
とりあえずSafariのバージョン2.0.4で動作することを確認。
(1系は確認する環境無いので未確認)

と言うわけで
以下、修正版ソース。

<style>
#result{
    border:solid 1px #666; 
    background: #1f2d3a;
    text-align:left;
}
#result .item{
    border:solid 1px #666; 
}
#result .item a{
    color:#f93;
}
#result .item .date{
        text-align:right;
        font-style: italic;
        font-size:95%;
}
</style>
<script type="text/javascript">
<!--
var s = document.createElement("script");
s.type = "text/javascript";
s.charset = "utf-8";
s.src = "<$MTBlogURL$>data.js";
document.getElementsByTagName("head")[0].appendChild(s);

var resultElement = document.getElementById('result');

function search(queryElement){
	var query = queryElement.value;
	var naviElement = document.getElementById("navi");
	if(!resultElement){
		var div = document.createElement('div');
		div.setAttribute('id', 'result');
		div.style.position='absolute';
		div.style.left=xPageX(queryElement)+"px";
		div.style.top=xPageY(queryElement) + queryElement.offsetHeight+"px";
		document.body.appendChild(div);
		resultElement = div;
	}
	var result = "";
	if(query.length == 0){
		resultElement.innerHTML = "";
		resultElement.style.visibility = "hidden";
		naviElement.innerHTML="";
		return;
	}
	var result = "";
	var resultCount = 0;
	for(var i=0;i<data.length;i++){
		if(data[i].body.toUpperCase().indexOf(query.toUpperCase()) >= 0){
			result +='<div class="item">';
			result +='<a href="'+ data[i].link + '">';
			result +='<div class="title">'+ data[i].title + "</div>";
			result +='<div class="date">'+ data[i].date + "</div>";
			result +='</a></div>';
			naviElement.innerHTML=++resultCount + "/" + data.length;
		}
	}
	resultElement.style.visibility = "visible";
	resultElement.innerHTML = result;
}
function xPageX(e){
	var x = 0;
	while (e) {
		if (xDef(e.offsetLeft)) x += e.offsetLeft;
		e = xDef(e.offsetParent) ? e.offsetParent : null;
	}
	return x;
}
function xDef(){
  	for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  	return true;
}
function xPageY(e){
	var y = 0;
	while (e) {
		if (xDef(e.offsetTop)) y += e.offsetTop;
		e = xDef(e.offsetParent) ? e.offsetParent : null;
	}
	return y;
}
//-->
</script>
<div class="module-search module">
   <h2 class="module-header">検索</h2>
   <div class="module-content">
       <input type="text" onkeyup="search(this);" autocomplete="off" size="15"/><span id="navi"></span>

   </div>
</div>

あ、ちなみに何でこんな事してるかというと、
読み込み処理をバックグラウンドでさせたかったから・・・

元のやつだと最初のページ読み込み時に
<scrpit>タグ部分でもたつくから・・・

ところでみんな何でSafariには文句言わないんだろう?
IEがOSに組み込まれたときは
あんなに文句行ってたのに・・・
(と言うかMacはOS自体も専用ハードじゃないと動かないけど・・・)

トラックバック

このエントリーのトラックバックURL:

TBスパムを弾く為、言及の無いTBは受け付けていません。

この一覧は、次のエントリーを参照しています: :

» MovableTypeのエントリー高速検索Widget from Yoshioriの日記
MovableTypeのエントリー高速検索WidgetとSafari MovableTypeにデフォルトでついてる検索は遅い・・・ もう、これでもか... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

人気のエントリー

▼すべて表示
generated by レビュー・ポスター

あわせて読みたい

あわせて読みたい