Been dealing with this myself -- and it's different between jsapi 2.x and 3.x. Only what's showing on map will be identified on. Note the checking of subLayerIds for null, scale checking, etcSolution is for jaspi 3.x
var referenceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(referenceMapServiceName, {
* * id: 'referenceLayer'
});
var layersInScale;
if (referenceLayer.visible === true && !(referenceLayer.visibleLayers.length === 0 || referenceLayer.visibleLayers[0] === -1)) {
layersInScale = [];
dojo.foreach(referenceLayer.createDynamicLayerInfosFromLayerInfos(), function (v) {
if (v.subLayerIds === null &&
(v.minScale === undefined || v.minScale === 0 || currentScale <= v.minScale) &&
(v.maxScale === undefined || v.maxScale === 0 || currentScale >= v.maxScale)) {
layersInScale.push(v.id);
}
});
var identifyParams = new esri.tasks.IdentifyParameters(),
identifyTask = new esri.tasks.IdentifyTask(referenceLayer.url);
identifyParams.geometry = geom;
identifyParams.mapExtent = map.extent;
identifyParams.tolerance = 3;
identifyParams.returnGeometry = true;
identifyParams.layerIds = aLayerIds;
//only refers to default visible layers as defined on the server
identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
identifyParams.width = map.width;
identifyParams.height = map.height;
return identifyTask.execute(identifyParams);
Bonus: Identifies on multiple services at once and return as one array using dojo.DeferredList(using some jQuery loops just change to for or dojo.foreach)
dojo.require("dojo.DeferredList");
referenceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(referenceMapServiceName, {
id: 'referenceLayer'
});
//Operational layers
operationalLayer = new esri.layers.ArcGISDynamicMapServiceLayer(operationalMapServiceName, {
id: 'operationalLayer'
});
function executeIdentify(geom, serviceName, aLayerIds) {
var identifyParams = new esri.tasks.IdentifyParameters(),
identifyTask = new esri.tasks.IdentifyTask(serviceName);
identifyParams.geometry = geom;
identifyParams.mapExtent = map.extent;
identifyParams.tolerance = 3;
identifyParams.returnGeometry = true;
identifyParams.layerIds = aLayerIds;
//only refers to default visible layers as defined on the server
identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
identifyParams.width = map.width;
identifyParams.height = map.height;
return identifyTask.execute(identifyParams);
}
function doIdentify(evt) {
var geom = evt.mapPoint,
layersInScale,
aDeferreds = [],
defList,
currentScale = map.getScale(),
layersToIdentify = [referenceLayer, operationalLayer];
map.graphics.clear();
identifyLayerKeyPrevious = undefined;
$.each(layersToIdentify, function (key, value) {
if (value.visible === true && !(value.visibleLayers.length === 0 || value.visibleLayers[0] === -1)) {
layersInScale = [];
$.each(value.createDynamicLayerInfosFromLayerInfos(), function (k, v) {
if (v.subLayerIds === null &&
(v.minScale === undefined || v.minScale === 0 || currentScale <= v.minScale) &&
(v.maxScale === undefined || v.maxScale === 0 || currentScale >= v.maxScale)) {
layersInScale.push(v.id);
}
});
if (layersInScale.length > 0) {
aDeferreds.push(executeIdentify(evt.mapPoint, value.url, layersInScale));
}
}
});
// create a deferred list to aggregate the state for all identify queries
defList = new dojo.DeferredList(aDeferreds);
defList.then(function (res) {
// "res" is 2D array of results
// array[0] indicates success or failure
// array[1] is the array of identity results returned
formatIdentifyResults(res);
});
}