WebKit とアンカータグ

Cocoaに関するヌマタメモ
2009年3月 9日 23:57

WebKit は文字や画像を簡単かつ綺麗にレイアウトできるので、Mac OS X アプリケーションでも iPhone アプリケーションでも、非常によく使います。

たとえばこんな HTML を表示しているとします。ちなみに見た目は適当に CSS でいい感じにします。

<dl>
    <dt><a name="method1"></a>fetchDataAtOnce()</dt>
    <dd>メソッドの説明。うんたらかんたら</dd>

    <dt><a name="method2"></a>removeAllCaches()</dt>
    <dd>メソッドの説明。うんたらかんたら</dd>
</dl>

ところで、プログラム的に removeAllCaches() にスクロールしたいと思ったときにどうすればいいだろう、と考えたのが今回のお題。この例だと、「method1」とか「method2」とかのフラグメントにジャンプさせたいワケです。HTML のリンクで書く分には「http://localhost/~numata/mysite/index.html#method1」などと書ければいい訳ですが、HTML がプログラム的に生成されたものの場合には URL 自体がないですし、読み直さずにスクロールだけさせたい場合には(別ウィンドウでアンカーの一覧を表示してクリックに対応させるなど)、ひと工夫必要になります。

で、ファイルパスを除いた NSURL を読み込ませてみたりしたのですが、うまくいかない。結論としては、

WebView *webView = ...;

NSString *anchorName = @"method2";

WebScriptObject *wso = [webView windowScriptObject];
[wso evaluateWebScript:[NSString stringWithFormat:@"location.hash = \"%@\";", anchorName]];

のようにして、JavaScript を使うことで実現できました。

WebKit ではこの他、ボタンが押されたときの挙動をプログラム側で受け取るなどのワザも使えます。

コメントを書く


トラックバックはありません。

トラックバックURL: http://numata.designed.jp/mt-tb.cgi/189