javascript - onmousemove-händelsen utlöses inte
Jag har sökt igenom svaren som ges i den här bloggen och andra utan någon lösning. Hjälp uppskattas mycket.
Jag har ett onmousemove-evenemang som utför det första objektet i listan av evenemang som ska köras men kommer inte att utföra det andra. document.getElementById("map_image_africa").onmousemove=maps.redraw; learnPanel.redraw;
Problemet verkar inte vara webbläsarspecifikt; det uppstår i Chrome och Safari. Har inte provat Firefox än.
I Chrome kan jag öppna webbläsarens konsol och köra learnPanel.redraw(); och det fungerar som förväntat. Dessutom, om jag lägger in ett alert-kommando mellan statements maps.redraw och learnPanel.redraw i onmouseover-händelsen, kommer alerten att köras som förväntat.
learnPanel-objektet skapas med koden nedan
LearnPanel.prototype = new Panel();
LearnPanel.prototype.constructor = LearnPanel;
function LearnPanel() {
}
LearnPanel.prototype.draw = function() {
var br_element = document.createElement("br");
/* country name */
if(this.isCountryNamesSelected === "yes") {
var temp_label;
temp_label = document.createElement("label");
temp_label.classList.add('quiz_question_heading_label');
temp_label.innerHTML = "Country: ";
this.flagColumnTab.appendChild(temp_label);
this.labelCountryName = document.createElement("label");
this.labelCountryName.id = "country_name";
this.labelCountryName.classList.add('quiz_question_label');
this.flagColumnTab.appendChild(this.labelCountryName);
this.flagColumnTab.appendChild(document.createElement("br"));
}
/* capital */
if(this.isCapitalNamesSelected === "yes") {
var temp_label;
temp_label = document.createElement("label");
temp_label.classList.add('quiz_question_heading_label');
temp_label.innerHTML = "Capital: ";
this.flagColumnTab.appendChild(temp_label);
this.labelCapitalName = document.createElement("label");
this.labelCapitalName.id = "capital";
this.labelCapitalName.classList.add('quiz_question_label');
this.flagColumnTab.appendChild(this.labelCapitalName);
this.flagColumnTab.appendChild(document.createElement("br"));
}
/* flag */
if(this.isCountryFlagsSelected === "yes") {
this.flagImage = document.createElement("img");
this.flagImage.id = "flag_image";
this.flagImage.src = "/images/flags/_flag.jpeg";
this.flagImage.alt = "flag logo";
this.flagColumnTab.appendChild(this.flagImage);
this.flagColumnTab.appendChild(document.createElement("br"));
this.flagColumnTab.appendChild(document.createElement("br"));
}
}
LearnPanel.prototype.redraw = function() {
alert('redrawing learnPanel');
/* country name */
if(learnPanel.isCountryNamesSelected === "yes") {
learnPanel.labelCountryName.innerHTML = maps.getCurrentDisplayCountryDown();
}
/* capital */
if(learnPanel.isCapitalNamesSelected === "yes") {
learnPanel.labelCapitalName.innerHTML = maps.getCurrentCountryCapitalDown();
}
/* flag */
if(learnPanel.isCountryFlagsSelected === "yes") {
learnPanel.flagImage.src = "/images/flags/" + maps.getCurrentFlagDown() + "_flag.jpeg";
learnPanel.flagImage.alt = "flag of " + maps.getCurrentFlagDown();
}
/* head of state */
/* famous landmark */
}
learnPanel = new LearnPanel();
Tack på förhand för hjälpen!
Svar #1
Välkommen till StackOverflow!
Vad du behöver här är en anonym funktion. När du tilldelar funktioner för mousemove-egenskapen på #map_large_africa vill du att två olika funktioner ska inträffa. Tyvärr, på grund av hur du har skrivit följande uttalande:
`document.getElementById("map_image_africa").onmousemove = maps.redraw; learnPanel.redraw;`
Det tolkas faktiskt på följande sätt:
document.getElementById("map_image_africa").onmousemove = maps.redraw;
learnPanel.redraw;
Ser du problemet? Semikolonet fungerar som slutet på ett kommando. Kartan ritas om vid musrörelse, men learnPanel.redraw är inte en del av onmousemove-tilldelningen, och den raden körs bara en gång, direkt efter att onmousemove-egenskapen tilldelats #map_image_africa. Genom att kapsla in det i en anonym funktion kan du köra fler än en rad JavaScript åt gången.
Prova följande:
document.getElementById("map_image_africa").onmousemove = function() {
maps.redraw(); // note that these lines have () after the method name.
learnPanel.redraw();
}
Medan jag har dig, vänligen notera att direkt ändring av egenskaper som onmousemove och onclick inte rekommenderas, och Events är det föredragna sättet att interagera med DOM-element, eftersom det separerar JavaScript från HTML.
Ovanstående onmousemove-tilldelning kan (och bör) skrivas om så här:
document.getElementById("map_image_africa").addEventListener('mousemove', function() {
maps.redraw();
learnPanel.redraw();
}, false);
