我正在使用area select插件。默认情况下,它响应ctrlKey框拖动。默认情况下,Leaflet boxZoom响应shiftKey框拖动。到目前为止一切都很好。但是,使用ctrlKey + shiftKey框拖动将触发Leaflet boxZoom和区域选择插件。我希望它仅触发区域选择插件。有什么建议吗?
答案 0 :(得分:2)
如果您查看Leaflet's source code for the BoxZoom
map handler,则可以看到该行中检查按下的Shift键以及主(“左””)鼠标/指针按钮以开始框缩放的行:
_onMouseDown: function (e) {
if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
您想更改它以检查ctrlKey
,以便如果框缩放设置为true
,则框缩放不会开始,例如:
if (!e.shiftKey || e.ctrlKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
问题是如何在不重写或破坏所有内容的情况下执行此操作。一种方法是从BoxZoom
处理程序的prototype
猴子修补该方法,同时保留对旧方法的引用,例如像这样:
var oldBoxZoomMouseDown = L.Map.BoxZoom.prototype._onMouseDown;
L.Map.BoxZoom.prototype._onMouseDown = function(ev) {
// Worry only about ctrlKey...
if (ev.ctrlKey) { return false; }
// ...and let the previous event handler worry about shift and primary button
oldBoxZoomMouseDown.call(this, ev);
}
请注意,只有在实例化地图之前 ,它才会起作用。还有其他方法,例如在实例化映射后替换BoxZoom
实例的方法,并创建BoxZoom
处理程序的子类。建议此时阅读有关javascript的prototypal inheritance和Leaflet's way of dealing with OOP的信息。