openstreetmap-website/app/assets/javascripts/id.js
Martin Raifer 1ba5b7fef0
iD: listen to manual hashchanges from iframe parent
Pan to the new `map` location when the hash change was not not triggered by map interaction from inside iD itself.

This mirrors the behaviour when manually editing the `map` hash parameter on osm.org outside of iD.

This also fixes https://github.com/openstreetmap/iD/issues/10592 (error in js console when iD is opened outside of an iframe by directly navigating to osm.org/id).
2024-12-11 14:59:57 +01:00

80 lines
2.4 KiB
JavaScript

//= require iD
/* globals iD */
document.addEventListener("DOMContentLoaded", function () {
var container = document.getElementById("id-container");
if (typeof iD === "undefined" || !iD.utilDetect().support) {
container.innerHTML = "This editor is supported " +
"in Firefox, Chrome, Safari, Opera and Edge. " +
"Please upgrade your browser or use JOSM to edit the map.";
container.className = "unsupported";
} else {
var idContext = iD.coreContext();
idContext.connection().apiConnections([]);
var url = location.protocol + "//" + location.host;
idContext.preauth({
url: url,
apiUrl: url === "https://www.openstreetmap.org" ? "https://api.openstreetmap.org" : url,
access_token: container.dataset.token
});
var id = idContext
.embed(true)
.assetPath("iD/")
.assetMap(JSON.parse(container.dataset.assetMap))
.locale(container.dataset.locale)
.containerNode(container)
.init();
if (parent === window) {
// iD not opened in an iframe -> skip setting of parent handlers
return;
}
var hashChangedAutomatically = false;
id.map().on("move.embed", parent.$.throttle(250, function () {
if (id.inIntro()) return;
var zoom = ~~id.map().zoom(),
center = id.map().center(),
llz = { lon: center[0], lat: center[1], zoom: zoom };
parent.updateLinks(llz, zoom);
// Manually resolve URL to avoid iframe JS context weirdness.
// https://gist.github.com/jfirebaugh/5439412
var hash = parent.OSM.formatHash(llz);
if (hash !== parent.location.hash) {
hashChangedAutomatically = true;
parent.location.replace(parent.location.href.replace(/(#.*|$)/, hash));
}
}));
function goToLocation(data) {
// 0ms timeout to avoid iframe JS context weirdness.
// https://gist.github.com/jfirebaugh/5439412
setTimeout(function () {
id.map().centerZoom(
[data.lon, data.lat],
Math.max(data.zoom || 15, 13));
}, 0);
}
parent.$("body").on("click", "a.set_position", function (e) {
e.preventDefault();
var data = parent.$(this).data();
goToLocation(data);
});
parent.addEventListener("hashchange", function (e) {
if (hashChangedAutomatically) {
hashChangedAutomatically = false;
return;
}
e.preventDefault();
var data = parent.OSM.mapParams();
goToLocation(data);
});
}
});