How to Rewrite an onclick() Function in my Javascript to Call a Function
I created a map using Leaflet with clusters. I wanted to add a popup when you click the cluster and it will show a popup list of names of the markers inside the cluster. I found a code and it does exactly what I’m looking for: a list popup showing the names of the markers inside the cluster and when you click on the different names on the popup list the related marker popup appears. But when I added the code to my project, I get the error, “reference error onclick is not defined” and the function won't run. I research this error and I found it’s not good practice to use the onclick function in my javascript/HTML in the way the code is written. My question is, how do I rewrite the script to work the way the example I’m using. Here’s a link to the example I’m using to show what I’m trying to accomplish (and this example works when I download it and run it…no error) - http://www.digital-geography.com/working-with-clusters-in-leaflet-increasing-useability/. And I also included my script. Any help on how to make this work will greatly be appreciated. Or, I’m open to achieve this in a different way. Thanks in advance!
function openPopUp(id, clusterId){
map.closePopup(); //which will close all popups
map.eachLayer(function(layer){ //iterate over map layer
if (layer._leaflet_id == clusterId){ // if layer is markerCluster
layer.spiderfy(); //spiederfies our cluster
}
});
map.eachLayer(function(layer){//iterate over map rather than clusters
if (layer._leaflet_id == id){// if layer is marker
layer.openPopup();
}
});
markers.on('clusterclick', function(a){
if(a.layer._zoom == 6){
var myText = '<ul>';
for (feat in a.layer._markers){
myText += '<li><u onclick="openPopUp"(' + a.layer._markers[feat]._leaflet_id + ',' + a.layer._leaflet_id + ')>' + a.layer._markers[feat].feature.properties['cityName2'] + ',' + a.layer._markers[feat].feature.properties['cityName2'] + '</u></li>';
}
myText += '</u>';
var popup = L.popup().setLatLng([a.layer._cLatLng.lat,a.layer._cLatLng.lng]).setContent(myText).openOn(map);
}
})
javascript leaflet
add a comment |
I created a map using Leaflet with clusters. I wanted to add a popup when you click the cluster and it will show a popup list of names of the markers inside the cluster. I found a code and it does exactly what I’m looking for: a list popup showing the names of the markers inside the cluster and when you click on the different names on the popup list the related marker popup appears. But when I added the code to my project, I get the error, “reference error onclick is not defined” and the function won't run. I research this error and I found it’s not good practice to use the onclick function in my javascript/HTML in the way the code is written. My question is, how do I rewrite the script to work the way the example I’m using. Here’s a link to the example I’m using to show what I’m trying to accomplish (and this example works when I download it and run it…no error) - http://www.digital-geography.com/working-with-clusters-in-leaflet-increasing-useability/. And I also included my script. Any help on how to make this work will greatly be appreciated. Or, I’m open to achieve this in a different way. Thanks in advance!
function openPopUp(id, clusterId){
map.closePopup(); //which will close all popups
map.eachLayer(function(layer){ //iterate over map layer
if (layer._leaflet_id == clusterId){ // if layer is markerCluster
layer.spiderfy(); //spiederfies our cluster
}
});
map.eachLayer(function(layer){//iterate over map rather than clusters
if (layer._leaflet_id == id){// if layer is marker
layer.openPopup();
}
});
markers.on('clusterclick', function(a){
if(a.layer._zoom == 6){
var myText = '<ul>';
for (feat in a.layer._markers){
myText += '<li><u onclick="openPopUp"(' + a.layer._markers[feat]._leaflet_id + ',' + a.layer._leaflet_id + ')>' + a.layer._markers[feat].feature.properties['cityName2'] + ',' + a.layer._markers[feat].feature.properties['cityName2'] + '</u></li>';
}
myText += '</u>';
var popup = L.popup().setLatLng([a.layer._cLatLng.lat,a.layer._cLatLng.lng]).setContent(myText).openOn(map);
}
})
javascript leaflet
"reference error onclick is not defined"
Is that really the exact error text? Sounds very strange
– CertainPerformance
Nov 13 '18 at 1:26
Sorry, it say "ReferenceError: openPopUp is not defined[Learn More]"
– TonyT
Nov 13 '18 at 1:28
add a comment |
I created a map using Leaflet with clusters. I wanted to add a popup when you click the cluster and it will show a popup list of names of the markers inside the cluster. I found a code and it does exactly what I’m looking for: a list popup showing the names of the markers inside the cluster and when you click on the different names on the popup list the related marker popup appears. But when I added the code to my project, I get the error, “reference error onclick is not defined” and the function won't run. I research this error and I found it’s not good practice to use the onclick function in my javascript/HTML in the way the code is written. My question is, how do I rewrite the script to work the way the example I’m using. Here’s a link to the example I’m using to show what I’m trying to accomplish (and this example works when I download it and run it…no error) - http://www.digital-geography.com/working-with-clusters-in-leaflet-increasing-useability/. And I also included my script. Any help on how to make this work will greatly be appreciated. Or, I’m open to achieve this in a different way. Thanks in advance!
function openPopUp(id, clusterId){
map.closePopup(); //which will close all popups
map.eachLayer(function(layer){ //iterate over map layer
if (layer._leaflet_id == clusterId){ // if layer is markerCluster
layer.spiderfy(); //spiederfies our cluster
}
});
map.eachLayer(function(layer){//iterate over map rather than clusters
if (layer._leaflet_id == id){// if layer is marker
layer.openPopup();
}
});
markers.on('clusterclick', function(a){
if(a.layer._zoom == 6){
var myText = '<ul>';
for (feat in a.layer._markers){
myText += '<li><u onclick="openPopUp"(' + a.layer._markers[feat]._leaflet_id + ',' + a.layer._leaflet_id + ')>' + a.layer._markers[feat].feature.properties['cityName2'] + ',' + a.layer._markers[feat].feature.properties['cityName2'] + '</u></li>';
}
myText += '</u>';
var popup = L.popup().setLatLng([a.layer._cLatLng.lat,a.layer._cLatLng.lng]).setContent(myText).openOn(map);
}
})
javascript leaflet
I created a map using Leaflet with clusters. I wanted to add a popup when you click the cluster and it will show a popup list of names of the markers inside the cluster. I found a code and it does exactly what I’m looking for: a list popup showing the names of the markers inside the cluster and when you click on the different names on the popup list the related marker popup appears. But when I added the code to my project, I get the error, “reference error onclick is not defined” and the function won't run. I research this error and I found it’s not good practice to use the onclick function in my javascript/HTML in the way the code is written. My question is, how do I rewrite the script to work the way the example I’m using. Here’s a link to the example I’m using to show what I’m trying to accomplish (and this example works when I download it and run it…no error) - http://www.digital-geography.com/working-with-clusters-in-leaflet-increasing-useability/. And I also included my script. Any help on how to make this work will greatly be appreciated. Or, I’m open to achieve this in a different way. Thanks in advance!
function openPopUp(id, clusterId){
map.closePopup(); //which will close all popups
map.eachLayer(function(layer){ //iterate over map layer
if (layer._leaflet_id == clusterId){ // if layer is markerCluster
layer.spiderfy(); //spiederfies our cluster
}
});
map.eachLayer(function(layer){//iterate over map rather than clusters
if (layer._leaflet_id == id){// if layer is marker
layer.openPopup();
}
});
markers.on('clusterclick', function(a){
if(a.layer._zoom == 6){
var myText = '<ul>';
for (feat in a.layer._markers){
myText += '<li><u onclick="openPopUp"(' + a.layer._markers[feat]._leaflet_id + ',' + a.layer._leaflet_id + ')>' + a.layer._markers[feat].feature.properties['cityName2'] + ',' + a.layer._markers[feat].feature.properties['cityName2'] + '</u></li>';
}
myText += '</u>';
var popup = L.popup().setLatLng([a.layer._cLatLng.lat,a.layer._cLatLng.lng]).setContent(myText).openOn(map);
}
})
javascript leaflet
javascript leaflet
asked Nov 13 '18 at 1:25
TonyTTonyT
8211
8211
"reference error onclick is not defined"
Is that really the exact error text? Sounds very strange
– CertainPerformance
Nov 13 '18 at 1:26
Sorry, it say "ReferenceError: openPopUp is not defined[Learn More]"
– TonyT
Nov 13 '18 at 1:28
add a comment |
"reference error onclick is not defined"
Is that really the exact error text? Sounds very strange
– CertainPerformance
Nov 13 '18 at 1:26
Sorry, it say "ReferenceError: openPopUp is not defined[Learn More]"
– TonyT
Nov 13 '18 at 1:28
"reference error onclick is not defined"
Is that really the exact error text? Sounds very strange– CertainPerformance
Nov 13 '18 at 1:26
"reference error onclick is not defined"
Is that really the exact error text? Sounds very strange– CertainPerformance
Nov 13 '18 at 1:26
Sorry, it say "ReferenceError: openPopUp is not defined[Learn More]"
– TonyT
Nov 13 '18 at 1:28
Sorry, it say "ReferenceError: openPopUp is not defined[Learn More]"
– TonyT
Nov 13 '18 at 1:28
add a comment |
1 Answer
1
active
oldest
votes
Because .setContent
can accept an HTMLElement
rather than just an HTML string, all you need to do is pass in an element with the listener attached, instead of the HTML string - construct the elements explicitly with createElement
, and use addEventListener
on the element you want to attach the listener to:
markers.on('clusterclick', function(a) {
if (a.layer._zoom !== 6) return;
const ul = document.createElement('ul');
a.layer._markers.forEach(({ _leaflet_id, feature }) => {
const { cityName2 } = feature.properties;
const li = ul.appendChild(document.createElement('li'));
const u = li.appendChild(document.createElement('u'));
u.addEventListener('click', () => openPopUp(_leaflet_id, a.layer._leaflet_id));
u.textContent = cityName2 + ',' + cityName2;
});
const popup = L
.popup()
.setLatLng([a.layer._cLatLng.lat, a.layer._cLatLng.lng])
.setContent(ul)
.openOn(map);
})
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Oops, looks like you have to go through theproperties
sub-object as well.const { cityName2 } = feature.properties;
, see edit
– CertainPerformance
Nov 13 '18 at 2:51
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272438%2fhow-to-rewrite-an-onclick-function-in-my-javascript-to-call-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Because .setContent
can accept an HTMLElement
rather than just an HTML string, all you need to do is pass in an element with the listener attached, instead of the HTML string - construct the elements explicitly with createElement
, and use addEventListener
on the element you want to attach the listener to:
markers.on('clusterclick', function(a) {
if (a.layer._zoom !== 6) return;
const ul = document.createElement('ul');
a.layer._markers.forEach(({ _leaflet_id, feature }) => {
const { cityName2 } = feature.properties;
const li = ul.appendChild(document.createElement('li'));
const u = li.appendChild(document.createElement('u'));
u.addEventListener('click', () => openPopUp(_leaflet_id, a.layer._leaflet_id));
u.textContent = cityName2 + ',' + cityName2;
});
const popup = L
.popup()
.setLatLng([a.layer._cLatLng.lat, a.layer._cLatLng.lng])
.setContent(ul)
.openOn(map);
})
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Oops, looks like you have to go through theproperties
sub-object as well.const { cityName2 } = feature.properties;
, see edit
– CertainPerformance
Nov 13 '18 at 2:51
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
add a comment |
Because .setContent
can accept an HTMLElement
rather than just an HTML string, all you need to do is pass in an element with the listener attached, instead of the HTML string - construct the elements explicitly with createElement
, and use addEventListener
on the element you want to attach the listener to:
markers.on('clusterclick', function(a) {
if (a.layer._zoom !== 6) return;
const ul = document.createElement('ul');
a.layer._markers.forEach(({ _leaflet_id, feature }) => {
const { cityName2 } = feature.properties;
const li = ul.appendChild(document.createElement('li'));
const u = li.appendChild(document.createElement('u'));
u.addEventListener('click', () => openPopUp(_leaflet_id, a.layer._leaflet_id));
u.textContent = cityName2 + ',' + cityName2;
});
const popup = L
.popup()
.setLatLng([a.layer._cLatLng.lat, a.layer._cLatLng.lng])
.setContent(ul)
.openOn(map);
})
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Oops, looks like you have to go through theproperties
sub-object as well.const { cityName2 } = feature.properties;
, see edit
– CertainPerformance
Nov 13 '18 at 2:51
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
add a comment |
Because .setContent
can accept an HTMLElement
rather than just an HTML string, all you need to do is pass in an element with the listener attached, instead of the HTML string - construct the elements explicitly with createElement
, and use addEventListener
on the element you want to attach the listener to:
markers.on('clusterclick', function(a) {
if (a.layer._zoom !== 6) return;
const ul = document.createElement('ul');
a.layer._markers.forEach(({ _leaflet_id, feature }) => {
const { cityName2 } = feature.properties;
const li = ul.appendChild(document.createElement('li'));
const u = li.appendChild(document.createElement('u'));
u.addEventListener('click', () => openPopUp(_leaflet_id, a.layer._leaflet_id));
u.textContent = cityName2 + ',' + cityName2;
});
const popup = L
.popup()
.setLatLng([a.layer._cLatLng.lat, a.layer._cLatLng.lng])
.setContent(ul)
.openOn(map);
})
Because .setContent
can accept an HTMLElement
rather than just an HTML string, all you need to do is pass in an element with the listener attached, instead of the HTML string - construct the elements explicitly with createElement
, and use addEventListener
on the element you want to attach the listener to:
markers.on('clusterclick', function(a) {
if (a.layer._zoom !== 6) return;
const ul = document.createElement('ul');
a.layer._markers.forEach(({ _leaflet_id, feature }) => {
const { cityName2 } = feature.properties;
const li = ul.appendChild(document.createElement('li'));
const u = li.appendChild(document.createElement('u'));
u.addEventListener('click', () => openPopUp(_leaflet_id, a.layer._leaflet_id));
u.textContent = cityName2 + ',' + cityName2;
});
const popup = L
.popup()
.setLatLng([a.layer._cLatLng.lat, a.layer._cLatLng.lng])
.setContent(ul)
.openOn(map);
})
edited Nov 13 '18 at 2:51
answered Nov 13 '18 at 1:32
CertainPerformanceCertainPerformance
79.3k143865
79.3k143865
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Oops, looks like you have to go through theproperties
sub-object as well.const { cityName2 } = feature.properties;
, see edit
– CertainPerformance
Nov 13 '18 at 2:51
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
add a comment |
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Oops, looks like you have to go through theproperties
sub-object as well.const { cityName2 } = feature.properties;
, see edit
– CertainPerformance
Nov 13 '18 at 2:51
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Got a quick question, I thought I could fix it but I can't figure it out. When the list pop up it's showing undefined for the information that goes in that are (cityName2). Any ideas? Everything else work perfect.
– TonyT
Nov 13 '18 at 2:46
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Sorry, not undefined. It say, [object Object],. It reading in the data from a csv file.
– TonyT
Nov 13 '18 at 2:48
Oops, looks like you have to go through the
properties
sub-object as well. const { cityName2 } = feature.properties;
, see edit– CertainPerformance
Nov 13 '18 at 2:51
Oops, looks like you have to go through the
properties
sub-object as well. const { cityName2 } = feature.properties;
, see edit– CertainPerformance
Nov 13 '18 at 2:51
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
I wanted to let you know your fix worked! I'm sorry I missed adding that comment letting you know. Thanks again for your help!
– TonyT
Nov 17 '18 at 23:35
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53272438%2fhow-to-rewrite-an-onclick-function-in-my-javascript-to-call-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
"reference error onclick is not defined"
Is that really the exact error text? Sounds very strange– CertainPerformance
Nov 13 '18 at 1:26
Sorry, it say "ReferenceError: openPopUp is not defined[Learn More]"
– TonyT
Nov 13 '18 at 1:28