Neo Inspiration

Avatar

中の人:jakkrokk (HN統一しました) がphp,javascript,air,flex などなど好き勝手書いてます。仕事は主にWEBシステムの設計と開発、SEO全般など。

js を使わずに PHPだけで、loading メッセージを出して終わったら消す

どうでもいい php tips

こんなことがあるので

管理画面を作っていて
長い処理とかでブラウザのタイムアウトとかを防ぐ為に
php だと

echo “Now Loading…”;

処理やってる間1ループごとに
echo “.”;

処理が終わってから
echo “End.”;

とか echo したりすると思うんですが、
それがお客にも見せるようなものだったりする特殊な場合
(ユーザがタイムアウトしそうな処理全部かもしれないけど)

echo した Now Loading… が画面にずっと残っちゃってうざいね

ってことで、 それを js を使わずに消してしまおうと。

魔法を使って解決します

魔法でも なんでもないんだけどw

こうする。

echo “<div id=’loading’>Now Loading…”;

処理やってる間1ループごとに
echo “.”;

処理が終わってから
echo “End.</div>”;

とPHPで書いておいて
CSS で

#loading {
display:none;
}

こう書けばOK。

これで、処理中は …. がどんどん増えていって
End が表示されて、
その後PHPの残りのプログラムが処理されて、
最後に html を生成して、display:none が当たって見えなくなるわけです。

HTMLの読み込み時間差を利用するかんじ。

応用するとこんなことが

PHPとCSSだけで可能です。

こんなこともできます。

ちなみにこれのソースはこんなかんじ。

<?php
ob_start();
echo "
<div id='loading' style='width:100%;margin:0;padding:0;height:100%;text-align:center;'>
<div style='position:absolute;top:50%;left:50%;margin-left:-7.5em;margin-top:-1em;'>
<div style='width:500px;'>
<ul id='loading' style='list-style-type: none;'>
";

for ($i=0;$i<10;$i++) {
echo "<li style='float:left;margin:0px;border:1px solid #eeeeee;background-color:#F03B58;color:#F03B58;'>|</li>\n";
ob_flush();
flush();
sleep(1);
}

echo " </ul>
</div>
</div>
</div>
";

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>ローディングテスト
<style>
#loading {
display:none;
}
</style>
</head>

<body>
全部完了したらこれだけが表示されます。
</body>
</html>
</pre>

javascript で style.display したらフォーカスが消えた

javascript で style.display したらフォーカスが消えました。

こんな感じのJSを作っていて

function clickable(){
    document.getElementById(’hidden’).style.display = “none”;
    document.getElementById(’visible’).style.display = “block”;
}

こんな感じのinput

<input type=text id=clickable onBlur=clickable() />

<input type=text id=hidden />
<input type=text id=visible />

みたいな設定になったときに
id=clickableでTABキーおすとフォーカスが消えます。
どこをクリックしてもフォーカスしません。(実際はしてるんだけどカーソルが見えない)

こんな感じ:テストHTML

たぶんhidden(描画しない設定)になったとこにフォーカスが当たってそっからでなくなる?
ような気がします。

描画しない display を 単に表示しない visiblity にすれば問題は解決するけど、
レイアウトの問題もあるので、display のままでなんとかならないかなーと試行錯誤したら
Tabを押したときに強制的にどっかをフォーカスするといいみたいです。

でもどっかフォーカスといって
document.getElementById(’visible’).focus();

ではだめみたいです。
処理の順番の関係かな。

この場合は
document.getElementById(’clickable’).focus();

を付け加えればうまくいきます。

CSSで il,ol をテーブルっぽくやるとき

別にいまさらなんだけど
SEOを気にしたらこうなりますっていうメモってことで。

(続きを読む…)

Continue

Twitter