<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Travellers Tales</title>
<link>http://travel-lab.info/tech/pblog/index.php</link>
<pubDate>Fri, 01 Jun 2007 23:37:31 +0900</pubDate>
<description>
Travellers Tales - RSS 2.0 (Really Simple Syndication).
</description>
<item>
<title>P_BLOG での JavaScript 関連の問題を改善</title>
<link>http://travel-lab.info/tech/pblog/article.php?id=116</link>
<guid>http://travel-lab.info/tech/pblog/article.php?id=116</guid>
<pubDate>Fri, 01 Jun 2007 23:37:31 +0900</pubDate>
<description>P_BLOG の scripts.js の不具合
P_BLOG のフォーラムで、JavaScript 絡みと思われる問題が散見されます。


Commentのスマイリー機能がおかしいです。
「サイト管理」のログインが反応しない
lightb...</description>
<content:encoded>
<![CDATA[<h4>P_BLOG の scripts.js の不具合</h4>
<p><a href="http://pbx.homeunix.org/p_blog/forum/">P_BLOG のフォーラム</a>で、JavaScript 絡みと思われる問題が散見されます。</p>
<div class="exref">
<ul>
<li><a href="http://pbx.homeunix.org/p_blog/forum/topic.php?tid=329" title="P_BLOG Project : フォーラム - Commentのスマイリー機能がおかしいです。">Commentのスマイリー機能がおかしいです。</a></li>
<li><a href="http://pbx.homeunix.org/p_blog/forum/topic.php?tid=169" title="P_BLOG Project : フォーラム - 「サイト管理」のログインが反応しない">「サイト管理」のログインが反応しない</a></li>
<li><a href="http://pbx.homeunix.org/p_blog/forum/topic.php?tid=348" title="P_BLOG Project : フォーラム - lightbox2を組み込むと表示がおかしくなります">lightbox2を組み込むと表示がおかしくなります</a></li>
</ul>
</div>
<p>原因になりそうなことに心当たりがあったので、先日、この JavaScript 関連の問題を修正してみました。他の方にも有益だと思いますので、公開することにします。</p>
<p>P_BLOG ver.1.2β2 以降を導入している方が対象です。ver.1.2β1 以前に導入すると整合性が取れず、絶対おかしくなるので、やめておいてください。</p>
<ul class="ref">
<li><a href="http://travel-lab.info/tech/pblog/files/article.php?id=5">P_BLOG JavaScript Refurbishment</a></li>
</ul>
<p>原理的には解決していると思うのですが、実際に確認していない部分もありますので、これで直ったよ！とか、相変わらずだよ〜とか、フィードバックがあれば、よろしくお願いします。
<!-- more --></p>
<h4>何を修正したのか</h4>
<h5>window.onload 問題</h5>
<p><code>scripts.jp</code> の <code>clickableCite</code> 関数のすぐ次に</p>
<pre><code>window.onload = clickableCite;
</code></pre>
<p>という記述があります。</p>
<p><code>clickableCite</code> 関数そのものは、P_BLOG で blockquote タグに cite 属性を付けて引用を行った場合に、引用元へのリンクを「→ Source」として付け加えてくれるものです。</p>
<p>しかし、<code>window.onload</code> で関数を呼び出してしまうと、他に load イベントでスクリプトを実行しようとするものがあった場合に、イベントがかち合ってしまい、正しく動かなくなります。</p>
<p>これを回避するために、Firefox や Safari では <code>addEventListener</code>、<abbr title="Internet Explorer">IE</abbr> では <code>attachEvent</code> を使うのが定石なようです。</p>
<p>実装方法はいろいろあるのですが、今回は <a href="http://www.sitepoint.com/article/structural-markup-javascript" title="Enhancing Structural Markup with JavaScript [JavaScript &amp; AJAX Tutorials]">JavaScript &amp; AJAX Tutorials</a> に載っていたコードを使わせてもらいました。</p>
<p><a href="http://www.huddletogether.com/projects/lightbox2/" title="Lightbox 2 - a simple, unobtrusive script used to overlay images on the current page.">Lightbox</a> や<a href="http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/ArekorePopup.html" title="あれこれポップアップ [ArekorePopup]">あれこれポップアップ</a>などを P_BLOG に導入した際に起こっていた問題は、これで解決されるはずです。（私はこれらを使っていませんので、要確認なのですが…。）</p>
<h5>Internet Explorer や JavaScript 無効時の挙動を改善</h5>
<p>コメント記入欄のスマイリーをクリックすると、コメントを書いている最中にも関わらず、いきなり画面遷移が起こり、いきなりページが読み込まれてしまう問題があります。また、同様のことが IE 以外のウェブブラウザでも、JavaScript が無効であるときには起こります。</p>
<p>この現象が起こっているのには2つの要因がありました。</p>
<ol>
<li><p><em>JavaScript が無効だと、ダミーのリンクが実際に動作してしまう</em></p>
<p>JavaScript が有効でないときに、スマイリーをクリックしてページ遷移が起こってしまうのは、各スマイリーにリンクが設定されているからです。</p>
<p>これを修正するのに一番簡単な方法は、単に <code>a</code> タグをなくして、リンクを外してしまうことです。リンクを外した後に、代わりにどこかに <code>onclick</code> 属性を設定してやれなければいけません。各スマイリーを <code>input type="image"</code> とか、イメージを用いた <code>button</code> に変更しようかと思ったのですが、そこまではやらず、直接画像の <code>img</code> 要素に <code>onclick</code> を設定してみました。</p></li>
<li><p><em>IE の getElementByID のバグ</em></p>
<p>JavaScript が有効であるはずの IE で同じ現象が起こっていたのは、JavaScript がエラーで機能していなかったからです。なぜエラーが起こっていたかというと、IE のバグだったのです。</p>
<p><code>scripts.jp</code> の <code>smiley</code> 関数に <code>getElementByID("comment")</code> でコメント欄の DOM オブジェクトを取得している箇所があります。一見なんの変哲もない処理ですが、ここに問題が潜んでいました。</p>
<p>P_BLOG ver.1.2β2 以降では、フォームに <code>name="comment"</code> になっている要素と、<code>id="comment"</code> になっている要素があります。これらは本来別のものなのですが、IE は <code>getElementByID</code> でなぜか <code>id</code> 属性だけでなく <code>name</code> 属性にも反応して、両方が存在すると、<code>getElementByID</code> がエラーを起こしてしまうのです。これがなかなかわからずに、問題解決に苦労しました。</p>
<p>この IE の不具合は、よく知られている問題なのでしょうか。ざっと検索した感じでは、話題にはなっていないようでした。なお、IE7 では検証していません。IE6 の話です。ただ、IE7 でもこのスマイリーの不具合が起こるという報告があったので、それから推測すると、IE7 でも修正されていないのではないでしょうか。（それとも私が何か勘違いしているだけ？）</p>
<p>このやっかいな問題を避けるために、<code>form</code> に含まれる要素の名前を変更しています。今のところ、このブログではきちんと動作しているようですが、思わぬ副作用がないとも限りませんので、P_BLOG JavaScript Refurbishment 導入後に不可解な現象が起こったときは、ぜひ報告して下さい。</p></li>
</ol>
<p>みなさま、フィードバックお待ちしています。</p>
]]>
</content:encoded>
</item>
</channel>
</rss>