MovableTypeのエントリー高速検索WidgetとSafari
前に書いた「エントリー高速検索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自体も専用ハードじゃないと動かないけど・・・)