我有一个页面打开一个弹出窗口(一个新的浏览器窗口,即window.open - 而不是一个dijit弹出窗口)。在这个新弹出窗口中创建的对象中,我想连接到位于该打开窗口中的对象触发的事件。
以下代码在我测试的所有浏览器中都能正常运行,除了IE8(以及可能的其他IE版本)之外,它会抛出错误“JScript object expected”:
this.parentObject = dojo.global.opener.parentObject;
dojo.connect(this.parentObject, "onUpdate", function() { alert('hello!'); });
我希望这只是一个范围问题而且可以很容易地解决,但是还没有任何运气。或者,我对如何处理这个问题持开放态度(我也使用了发布和订阅,但似乎遇到了同样的问题)。
提前致谢!
编辑:添加了一些代码来演示问题(无法创建一个jsfiddle,因为需要多个页面)。要复制问题,在通过index.html打开弹出窗口后,尝试并放大地图。
的index.html
<!DOCTYPE html>
<html>
<head>
<script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.4/"></script>
<script>
dojo.require("esri.map");
function initClass()
{
dojo.declare("test.map", esri.Map, {
constructor: function() { },
init: function() {
this.layer = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer");
this.addLayer(this.layer);
},
showLegend: function() {
this.legend = dojo.global.open('popup.html','legend','left=10, top=10, height=700, width=290, status=no, resizable=yes, scrollbars=no, toolbar=no,location=no, menubar=no');
}
});
}
function init() { initClass(); MapHandler = new test.map("map"); MapHandler.init(); }
dojo.addOnLoad(init);
</script>
</head>
<body>
<input type="button" id="showLegend" onclick='MapHandler.showLegend();' value="Legend" /><br />
<br />
<div id="map" style="width:600px; height:400px; border:1px solid #000;"></div>
</body>
</html>
popup.html
<!DOCTYPE html>
<html>
<head>
<script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.4/"></script>
<script>
dojo.require("esri.dijit.Legend");
function initClass()
{
dojo.declare("test.legend", null, {
map: null,
legend: null,
constructor: function(divid) {
this.map = dojo.global.opener.MapHandler;
},
init: function() {
this.legend = new esri.dijit.Legend({map: this.map},"legend");
this.legend.startup();
dojo.connect(this.map, "onUpdateEnd", function() { alert('hello!'); });
}
});
}
function init() { initClass(); MapLegend = new test.legend(); MapLegend.init(); }
dojo.addOnLoad(init);
</script>
</head>
<body>
<div id="legend"></div>
</body>
</html>