激活控制键时禁用boxZoom

时间:2019-06-13 01:52:43

标签: leaflet

我正在使用area select插件。默认情况下,它响应ctrlKey框拖动。默认情况下,Leaflet boxZoom响应shiftKey框拖动。到目前为止一切都很好。但是,使用ctrlKey + shiftKey框拖动将触发Leaflet boxZoom和区域选择插件。我希望它仅触发区域选择插件。有什么建议吗?

1 个答案:

答案 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 inheritanceLeaflet's way of dealing with OOP的信息。