django-debug-toolbarが動かない
django-debug-toolbarを導入してみたところ「サイドバーは表示されるにも関わらず、パネルをクリックした際、表示されるはずの詳細情報が表示されない」という謎現象に遭遇しました。
状況
設定は複数のサイトや公式のドキュメントを見て書いたので、特に問題があるような気はしません。
と言うことはHTMLの書き方に問題があったのでしょうか?
標準ではbodyタグの下に要素が追加されるらしいので、確認します。
<div id="djDebug" class="djdt-hidden" dir="ltr" data-store-id="c00edea49571430282da1d3a0fd71302"
data-render-panel-url="/render_panel/" style="display: block;">
<div class="djdt-hidden" id="djDebugToolbar" style="display: none;"></div>
<div class="djdt-hidden" id="djDebugToolbarHandle" style="display: block;"></div>
<div id="VersionsPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="TimerPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="SettingsPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="HeadersPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="RequestPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="SQLPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="StaticFilesPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="TemplatesPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="CachePanel" class="djdt-panelContent" style="display: none;"></div>
<div id="SignalsPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="LoggingPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="ProfilingPanel" class="djdt-panelContent" style="display: none;"></div>
<div id="djDebugWindow" class="djdt-panelContent" style="display: none;"></div>
</div>
ちゃんと入ってました。※全部貼り付けると長くなるので省略しています。
と、ここであることに気づきます。
ちゃんとdebug-toolbarが使えるページもあるのです。
使えるページと使えないページで何か違いはないかと確認したところ、使えないページではページ内リンクにスクロールアニメーションを付けていることが発覚しました。
という事は、恐らくこいつが原因…
原因
最終的に原因は予想通りページ内リンクに付けたスクロールアニメーションでした。
jQueryを使って以下のようなコードでスクロールアニメーションを付けていました。
function selectorEscape(val) {
return val.replace(/[ !"$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
}
$(function () {
$('a[href^="#"]').click(function () {
var time = 300;
var href = $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : selectorEscape(href));
var position = target.offset().top-60;
$("html,body").animate({ scrollTop: position }, time, "swing");
return false;
});
});
この時の要素の取得に用いたセレクタの書き方が問題で、
'a[href^="#"]'
がダメでした。
debug-toolbarのパネル要素も<a href="#~~">
だったのでその部分をスクロールアニメーションで上書きしまったがため使えない事態に陥っていました。
解決策
結果的にページ内リンクにはid
属性で"index~~"
というような名前をつけてセレクタもa[id^="index"]
とすることで、対応しました。
皆さんもページ内リンクにスクロールアニメーションをつけるときは注意してください。
まぁ、今回はレアケースだと思いますが…