- 1. 首先修改 OpenLayers Events.js
定位到下面代码段,添加右键菜单事件:
View Code
OpenLayers.Events = OpenLayers.Class({
/**
* Constant: BROWSER_EVENTS
* {Array(String)} supported events
*/
BROWSER_EVENTS: [
"mouseover", "mouseout",
"mousedown", "mouseup", "mousemove",
"click", "dblclick", "rightclick", "dblrightclick",
"resize", "focus", "blur",
"touchstart", "touchmove", "touchend"
//添加右键菜单事件2011 11 02
, "contextmenu"
],
……
})
现在OpenLayers可以捕捉右键了,只是Handler还没有处理;
- 2. 修改OpenLayers Handler Feature.js
修改Handler能够处理的事件:
View Code
OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
/**
* Property: EVENTMAP
* {Object} A object mapping the browser events to objects with callback
* keys for in and out.
*/
EVENTMAP: {
'click': { 'in': 'click', 'out': 'clickout' },
'mousemove': { 'in': 'over', 'out': 'out' },
'dblclick': { 'in': 'dblclick', 'out': null },
'mousedown': { 'in': null, 'out': null },
'mouseup': { 'in': null, 'out': null },
'touchstart': { 'in': 'click', 'out': 'clickout' },
//添加Handler处理事件 2011 11 02
'contextmenu': {'in';'click','out':'clickout'}
},
})
这里的in和out可以理解为选中和取消选中;到此Handler可以处理comntexmenu事件了,可是谁来处理我们的事件呢?添加contextmenu方法,将事件处理交给Handler,如下所示:
View Code
/**
* Method: contextmenu
* Handle click. Call the "contextmenu" callback if click on a feature,
* or the "clickout" callback if click outside any feature.
*
* Parameters:
* evt - {Event}
*
* Returns:
* {Boolean}
*/
contextmenu: function (evt) {
return this.handle(evt) ? !this.stopClick : true;
},
OpenLayers中触发选中默认操作方式为:左键单击和双击(touchstart暂没关注是什么操作),我们需要添加右键单击操作类型:
var click = (type == "click" || type == "dblclick" || type == "touchstart"||type=="contextmenu");
另外,我们需要在触发的事件中添加一个参数,来区分是左键还是右键
View Code
if (this.geometryTypeMatches(this.feature)) {
// in to a feature
if (previouslyIn && inNew) {
// out of last feature and in to another
if (this.lastFeature) {
this.triggerCallback(type, 'out', [this.lastFeature]);
}
//原始:this.triggerCallback(type, 'in', [this.feature]);
this.triggerCallback(type, 'in', [this.feature,type]);
} else if (!previouslyIn || click) {
//原始: this.triggerCallback(type, 'in', [this.feature]);
// in feature for the first time
this.triggerCallback(type, 'in', [this.feature,type]);
}
Handler只是为Control服务的,下面我们修改Control中的操作;
- 3. 修改OpenLayers Control SelectFeature.js
原始:
View Code
clickFeature: function(feature) {
if(!this.hover) {
var selected = (OpenLayers.Util.indexOf(
feature.layer.selectedFeatures, feature) > -1);
if(selected) {
if(this.toggleSelect()) {
this.unselect(feature);
} else if(!this.multipleSelect()) {
this.unselectAll({except: feature});
}
} else {
if(!this.multipleSelect()) {
this.unselectAll({except: feature});
}
this.select(feature);
}
}
},
修改(添加一个参数)后:
View Code
clickFeature: function(feature,triggertype) {
if(!this.hover) {
var selected = (OpenLayers.Util.indexOf(
feature.layer.selectedFeatures, feature) > -1);
if(selected) {
if(this.toggleSelect()) {
this.unselect(feature);
} else if(!this.multipleSelect()) {
this.unselectAll({except: feature});
}
} else {
if(!this.multipleSelect()) {
this.unselectAll({except: feature});
}
this.select(feature,triggertype);
}
}
},
原始:
View Code
select: function(feature) {
var cont = this.onBeforeSelect.call(this.scope, feature);
var layer = feature.layer;
if(cont !== false) {
cont = layer.events.triggerEvent("beforefeatureselected", {
feature: feature
});
if(cont !== false) {
layer.selectedFeatures.push(feature);
this.highlight(feature);
// if the feature handler isn't involved in the feature
// selection (because the box handler is used or the
// feature is selected programatically) we fake the
// feature handler to allow unselecting on click
if(!this.handlers.feature.lastFeature) {
this.handlers.feature.lastFeature = layer.selectedFeatures[0];
}
layer.events.triggerEvent("featureselected", {feature: feature});
this.onSelect.call(this.scope, feature);
}
}
},
修改后:
View Code
select: function (feature, triggertype) {
var cont = this.onBeforeSelect.call(this.scope, feature);
var layer = feature.layer;
if (cont !== false) {
cont = layer.events.triggerEvent("beforefeatureselected", {
feature: feature
});
if (cont !== false) {
layer.selectedFeatures.push(feature);
this.highlight(feature);
// if the feature handler isn't involved in the feature
// selection (because the box handler is used or the
// feature is selected programatically) we fake the
// feature handler to allow unselecting on click
if (!this.handlers.feature.lastFeature) {
this.handlers.feature.lastFeature = layer.selectedFeatures[0];
}
layer.events.triggerEvent("featureselected", { feature: feature });
//添加类型选择 2011 11 02
switch (triggertype) {
case "click":
this.onSelect.call(this.scope, feature);
break;
case "contextmenu":
this.onRightSelect.call(this.scope, feature);
break;
default:
this.onSelect.call(this.scope, feature);
}
}
}
},
提供一个调用的接口
View Code
/**
* APIProperty: onRightSelect
* {Function} Optional function to be called when a feature is selected.
* The function should expect to be called with a feature.
*/
onRightSelect: function () { },
示例:
selectFeatureControl=new OpenLayers.Control.SelectFeature([layer],
{
onSelect:onFeatureSelect,
onUnSelect:onFeatureUnselect,
onRightSelect:onFeatureRightSelect
}
);
map.addControl(selectFeatureControl);
selectFeatureControl.activate();
至此,右键扩展完成。