2016-10-29 18 views
0

以下の例をthe Bokeh Docsから考えてみましょう.TopToolを調整してサークルをクリックすると、新しいタブを開くのではなく同じタブのURLに移動しますタブ? docstringは、新しいタブを開くのが唯一の動作だと示唆していますが、おそらくCustomJSの回避策やこれを回避するためのいくつかのハックがありますか?OpenURL in bokeh - 同じタブで開く

from bokeh.models import ColumnDataSource, OpenURL, TapTool 
from bokeh.plotting import figure, output_file, show 

output_file("openurl.html") 

p = figure(plot_width=400, plot_height=400, 
     tools="tap", title="Click the Dots") 

source = ColumnDataSource(data=dict(
    x=[1, 2, 3, 4, 5], 
    y=[2, 5, 8, 2, 7], 
    color=["navy", "orange", "olive", "firebrick", "gold"] 
    )) 

p.circle('x', 'y', color='color', size=20, source=source) 

url = "http://www.colors.commutercreative.com/@color/" 
taptool = p.select(type=TapTool) 
taptool.callback = OpenURL(url=url) 

show(p) 

私は(this questionからの借入が、一種の無知、それを実装する方法を正確に)成功せず、いくつかのJavaScriptを包みます。これは、リンクなしの開口部につながる:

callback = CustomJS(args=dict(source=source), code="""   
     url = data['url'] 
     window.open(url,"_self"); 
    """)  

taptool = p.select(type=TapTool) 
taptool.callback = callback 

私もOpenURLのためtagキーワードを使用して<a>タグのようなリンクを処理しようとしました。このtagの用語を正しく使用する方法については何も見つかりませんでしたので、これは盲目的な試みです。ここでは運がない。

url = "http://www.colors.commutercreative.com/@color/" 
taptool = p.select(type=TapTool) 
taptool.callback = OpenURL(url=url, tags=["_self"]) 

私はBokehがまだかなり新しくなっていると理解しています。この機能はまだ利用できません。私はまだ十分なjavascriptを知っていれば回避策があると思う(明らかにそうではない)。

答えて

1

tagsはほこりの多い機能であり、これとは関係ありません。 Bokeh Modelに任意の情報を添付するだけで、特定のモデルを後で検索するオブジェクトグラフに役立つ場合があります。ボケ0.12.3のよう


OpenURLがこれをサポートしていない、それは単にwindow.openを呼び出します。

https://github.com/bokeh/bokeh/blob/master/bokehjs/src/coffee/models/callbacks/open_url.coffee#L18

window.opennameパラメータの新しいプロパティを追加すると、ラインの夫婦のみになりますコードのissue trackerで機能リクエストの問題を開くことをおすすめします。この機能を実装するためにPRを進めることに興味がある場合は、新しい寄稿者のご協力をよろしくお願いいたします。


これはCustomJSコールバックでも実行できます。円がクリックされるたびに、ちょうど常に一定のURLを開きたい場合は、完全なURLを持っているデータソースの列がある場合には、

callback = CustomJS(args=dict(source=source), code="""   
    window.open("http://foo.com" ,"_self"); 
    """)  

のようなものだとあなたが選択されたインデックスに基づいたものを選択したいですOpenURLコールバックのようなものを実行する必要があります。選択したインデックスをデータソースから取得し、選択したインデックスを使用してデータソースの列からURLを取得し、次にコールwindow.openを呼び出します。ここでは完全な例である:、output_fileは、bokeh.models輸入CustomJSから を示し、輸入姿をbokeh.plottingから

ColumnDataSource、TapTool

source = ColumnDataSource(data=dict(
    x = [1, 2], 
    y = [3, 4], 
    url = ["http://google.com", "http://bing.com"], 
)) 

p = figure(tools="tap") 
p.circle('x', 'y', size=15, source=source) 

code = """ 
selection = require("core/util/selection") 
indices = selection.get_indices(source) 
for (i = 0; i < indices.length; i++) { 
    ind = indices[i] 
    url = source.data['url'][ind] 
    window.open(url, "_self") 
} 
""" 

taptool = p.select(type=TapTool) 
taptool.callback = CustomJS(args=dict(source=source), code=code) 

output_file("/tmp/foo.html") 

show(p) 
+0

ありがとうございました。寄付を始めたいと思いますので、リンクに感謝します。何らかの理由であなたの完全な例は私がドットをクリックするとどこにでも私を送りません。また、 'window.open()'コマンドに "_self"引数が必要ですか? – benten

+0

ああ、はい、申し訳ありませんが、JSコンソールの出力を見ていて、それが難しくなってしまったので、削除しました。私は答えに戻します。 – bigreddot

+0

もう一度ありがとうございます。私はこれ以後、あなたにあまりバグしないことを望みます。外部の代わりにループ内に 'window.open()'がある理由はありますか?関係のない質問は、私がBokehの最新バージョンを持っている限り、私に "core/util/selection"があるかどうかです。固定URLスニペットは正常に機能します。完全な例の 'selection = require()'行だけを追加すると、何も動作しません。エラーが発生しないため、診断が難しい種類です。 – benten

関連する問題