[mapguide-users] OnSelectionChanged in AJAX viewer?
Kenneth, GEOGRAF A/S
ks at geograf.dk
Mon Apr 28 09:00:44 EDT 2008
I made a small mistake.
The retry condition should not be:
if (mapFrame == null)
window.setTimeout("RetryInit();", 500);
but
if (originalMapFrameOnSelectionChanged == null)
{
mapFrame = null;
window.setTimeout("RetryInit();", 500);
}
Because the frame may exist, but the function might be missing.
Regards, Kenneth, GEOGRAF A/S
Kenneth, GEOGRAF A/S skrev:
> You must safeguard against timing problems.
> It is very likely that your frame will load completely before the
> iframe does.
> In that case, you cannot get the OnSelectionChanged method reference.
> You can add an "onload" to the iframe, but it is still possible that
> it will break, because the internal frames do not load in the expected
> order.
> A simple fix is to wrap your "InitDocument" with a timer.
>
> Also, using the "frames[0].frames[1]" is relying on the order of your
> page, and the order of the viewer frames.
> A more reliable method, is to use the ID if the frame element, and
> then use the built-in method GetMapFrame().
>
> I have applied the above to your example:
>
> <!-- Javascript part -->
> <script type="text/javascript">
> var mapFrame = null; // A reference to the map frame
> var originalMapFrameOnSelectionChanged = null // storage for the
> original onSelectionChanged function
> function OnSelectionChanged() // when something is selected on the map
> {
> alert('Your handler works perfectly');
> originalMapFrameOnSelectionChanged();
> }
>
> function InitDocument()
> {
> var win = document.getElementById('viewerFrame');
> if (win.contentWindow) //FF returns the actual tag, IE returns
> the iframe
> win = win.contentWindow;
> mapFrameRef = win.GetMapFrame();
> originalMapFrameOnSelectionChanged =
> mapFrameRef.parent.OnSelectionChanged;
> mapFrameRef.parent.OnSelectionChanged =
> OnSelectionChanged;
> }
>
> function RetryInit()
> {
> if (mapFrame != null)
> return;
>
> try
> {
> InitDocument();
> }
> catch (e)
> {
> mapFrame = null;
> }
>
> if (mapFrame == null)
> window.setTimeout("RetryInit();", 500);
> }
> </script>
>
> <!-- HTML part -->
> <html>
> <body>
> <iframe id="viewerFrame" frameborder="yes" width="100%"
> height="60%" src="
> src="../mapviewernet/dwfviewer.aspx?SESSION=<%=sessionId%>&WEBLAYOUT=<%=webLayout%>""
> onload="RetryInit()"></iframe>
> </body>
> </html>
>
>
>
> Regards, Kenneth, GEOGRAF A/S
>
>
>
> Kimmo Kotajärvi skrev:
>>
>> Here's my solution (simplified):
>>
>>
>>
>> <!-- Javascript part -->
>>
>>
>>
>> <script type="text/javascript">
>>
>> var mapFrame = null; // A reference to the map frame
>>
>> var originalMapFrameOnSelectionChanged = null // storage for the
>> original onSelectionChanged function
>>
>>
>>
>> function OnSelectionChanged() // when something is selected on
>> the map
>>
>> {
>>
>> alert('Your handler works perfectly');
>>
>> originalMapFrameOnSelectionChanged();
>>
>> }
>>
>>
>>
>> function InitDocument()
>>
>> {
>>
>> mapFrameRef = frames[0].frames[1];
>>
>> originalMapFrameOnSelectionChanged =
>> mapFrameRef.parent.OnSelectionChanged;
>>
>> mapFrameRef.parent.OnSelectionChanged =
>> OnSelectionChanged;
>>
>> }
>>
>> </script>
>>
>>
>>
>> <!-- HTML part -->
>>
>>
>>
>> <html>
>>
>> <body onload="javascript:InitDocument()">
>>
>> <iframe id="viewerFrame" frameborder="yes" width="100%"
>> height="60%" src="
>> src="../mapviewernet/dwfviewer.aspx?SESSION=<%=sessionId%>&WEBLAYOUT=<%=webLayout%>""></iframe>
>>
>> </body>
>>
>> </html>
>>
>>
>>
>>
>>
>> So, body onload calls InitDocument which registers the new
>> OnSelectionChanged event handler. The new handler only pops up a
>> dialog box and then calls the old function. The MG Viewer is embedded
>> in an iframe.
>>
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> *Lähettäjä:* mapguide-users-bounces at lists.osgeo.org
>> [mailto:mapguide-users-bounces at lists.osgeo.org] *Puolesta *Tanja
>> Suikkanen
>> *Lähetetty:* 28. huhtikuuta 2008 14:10
>> *Vastaanottaja:* mapguide-users at lists.osgeo.org
>> *Aihe:* Re: [mapguide-users] OnSelectionChanged in AJAX viewer?
>>
>>
>>
>> My map is embedded in my own page.
>>
>> When a user selects one or more features on the map, I want my own
>> function to be executed.
>>
>> But doesn't parent.parent.mapFrame still get me the map frame..?
>>
>> And this works but only when I click some button.
>>
>>
>>
>> Tanja
>>
>>
>>
>>
>>
>> *From:* Kenneth, GEOGRAF A/S [mailto:ks at geograf.dk]
>> *Sent:* 28. huhtikuuta 2008 13:57
>> *To:* tanja.suikkanen at dimenteq.fi; MapGuide Users Mail List
>> *Subject:* SPAM-LOW: Re: [mapguide-users] OnSelectionChanged in AJAX
>> viewer?
>>
>>
>>
>> Are you issuing the script from a command?
>>
>> If you want to do this all the time (regardless of what the user has
>> done), you must load the script with the solution.
>> If your map is embedded in another page, you can load the script
>> there, and change "var map = parent.parent.mapFrame;" to point to the
>> correct frame.
>> If it is just the basic layout, you can try to put it in the page
>> that loads in the taskpane (but beware that the document gets
>> unloaded if the user navigates).
>> As a last resort, you can embed the script in the viewerfiles.
>>
>> In case you can use the embedded map approach, you should place the
>> following line after the "try {":
>> map = document.getElementById('<insert iframe/frame id>').GetMapFrame()
>>
>> Regards, Kenneth, GEOGRAF A/S
>>
>>
>>
>> Tanja Suikkanen skrev:
>>
>> Ok, I sent my code snippet earlier today, but here it is again.
>>
>> I got this example from
>> http://trac.osgeo.org/mapguide/wiki/CodeSamples/JavaScript/AJAXViewerEventHooking.
>>
>>
>>
>> var map = parent.parent.mapFrame;
>>
>>
>>
>> var origOnSelectionChanged = null;
>>
>>
>>
>> function MySelectionHandler()
>>
>> {
>>
>> origOnSelectionChanged();
>>
>>
>>
>> var selCount = map.GetSelectedCount();
>>
>> if(selCount > 0)
>>
>> {
>>
>> My function() {}
>>
>> }
>>
>> }
>>
>>
>>
>> window.onload = function() {
>>
>>
>>
>> var timer;
>>
>>
>>
>> var watch = function() {
>>
>>
>>
>> try {
>>
>> if(map.mapInit) {
>>
>>
>>
>> clearInterval(timer);
>>
>>
>>
>> origOnSelectionChanged = map.OnSelectionChanged;
>>
>>
>>
>> map.OnSelectionChanged = MySelectionHandler;
>>
>> }
>>
>> }
>>
>> catch(e) {
>>
>> }
>>
>> };
>>
>>
>>
>> timer = setInterval(watch, 200);
>>
>> };
>>
>>
>>
>> Window.onload function is executed only, if I press a button.
>>
>> I want to have the functionality I was telling you about without any
>> button clicks.
>>
>> Please ask if I don't tell you enough.
>>
>>
>>
>> Tanja
>>
>>
>>
>>
>>
>> *From:* Ivan Milicevic [mailto:Ivan.Milicevic at supranet.hr]
>> *Sent:* 28. huhtikuuta 2008 12:04
>> *To:* tanja.suikkanen at dimenteq.fi
>> <mailto:tanja.suikkanen at dimenteq.fi>; MapGuide Users Mail List
>> *Subject:* RE: [mapguide-users] OnSelectionChanged in AJAX viewer?
>>
>>
>>
>> Feature doesn't get highlighted?
>>
>>
>>
>> Of course that you can add this functionality in your own code, the
>> logic is same. Allwas call mapFrame functions (via JavaScript) or
>> count selection from C# or PHP.
>>
>>
>>
>> If you want to get some help over here, be more specific.
>>
>>
>>
>> Ivan.
>>
>>
>>
>> *From:* mapguide-users-bounces at lists.osgeo.org
>> <mailto:mapguide-users-bounces at lists.osgeo.org>
>> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of *Tanja
>> Suikkanen
>> *Sent:* Monday, April 28, 2008 10:46 AM
>> *To:* mapguide-users at lists.osgeo.org
>> <mailto:mapguide-users at lists.osgeo.org>
>> *Subject:* RE: [mapguide-users] OnSelectionChanged in AJAX viewer?
>>
>>
>>
>> Ok, now it worked but some functionality had been removed?
>>
>> When I first select a feature, everything goes fine but when I select
>> another feature, that doesn't get highlighted...
>>
>> Also I wouldn't like to change the original files, just add my own
>> functionality in my own code files.
>>
>> But thanks anyway!
>>
>>
>>
>> Tanja
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> mapguide-users mailing list
>> mapguide-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>
> ------------------------------------------------------------------------
>
> _______________________________________________
> mapguide-users mailing list
> mapguide-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapguide-users/attachments/20080428/583c7544/attachment.html
More information about the mapguide-users
mailing list