D3によってレンダリングされたSVGグラフィックで、米国の州と郡の地図を持っています。各パスには、mouseover、mouseout、clickイベントがバインドされており、パスIDとしてFIPS郡コードが設定されています。
ユーザーが州または郡の名前を入力できるjQueryオートコンプリート入力があります。対応するFIPS IDを使用可能にする入力が与えられた場合、プログラムでマウスオーバーイベントをトリガーするにはどうすればよいですか?
私は答えを見つけました。主な問題は、jQueryのようにD3に明示的なtrigger
関数がないことです。ただし、それをシミュレートすることはできます。
経由で構築されたD3パスがあるとします
d3.json("us-counties.json", function(json){
thisObj._svg.selectAll("path")
.data(json.features)
.enter().append("path")
.attr("d", thisObj._path)
.attr("class", "states")
.attr("id", function(d){
return d.id; //<-- Sets the ID of this county to the path
})
.style("fill", "gray")
.style("stroke", "black")
.style("stroke-width", "0.5px")
.on("dblclick", mapZoom)
.on("mouseover", mapMouseOver)
.on("mouseout", mapMouseOut);
});
塗りと線の色を変更するマウスオーバーイベントハンドラー
var mapMouseOver(d){
d3.selectAll($("#" + d.id))
.style("fill", "red")
.style("stroke", "blue");
}
通常、ほとんどのチュートリアルでは、
d3.select(this)...
しかし、実際に値を使用することも同様に機能します。ノードのIDを取得するイベントハンドラーがあり、それをトリガーする場合
$("#someDropdownSelect").change(someEventHandler)
function someEventHandler(){
//get node ID value, sample
var key = $(this)
.children(":selected")
.val();
//trigger mouseover event handler
mapMouseOver({id : key});
}
ドロップダウンの選択に基づいてマウスオーバーイベントを実行します
これは、目的の要素にイベントを直接ディスパッチすることで実現できます。
var event = document.createEvent('SVGEvents');
event.initEvent(eventName,true,true);
element.dispatchEvent(event);
詳細については、こちらをご覧ください ブログ投稿
Steve Greatrexのソリューションは、iOS 9までは機能しましたが、iOS10では機能しませんでした。
私のコードといくつかの調査をデバッグした後、問題はcreateEvent関数とinitEvent関数が次のように非推奨になったということだったようです documentation 。
これを書く新しい方法は次のとおりです。
var event = new MouseEvent('SVGEvents', {});
element.dispatchEvent(event);
イベントコンストラクターを使用してイベントを作成およびトリガーする新しい方法の詳細については、 ここ を参照してください。
Mouseoverイベントがjavascript関数を呼び出すようにjavascriptを構造化すると、いつでも同じ関数を呼び出すことができます。