Nun begann man heraus mit Erkennen, wo Sie das Problem haben, und das ist schon eine gute Sache :)
Um Ihren Code ein wenig kompakter zu machen, und so viele Dinge wie möglich aus dem lokalen Bereich zu bekommen, Sie könnte die folgende Implementierung überprüfen.
Es ist in gewisser Weise eine kleine Demo, wo ich versucht habe, so viele Kommentare wie möglich hinzuzufügen.
Ich habe ein bisschen mehr bearbeitet, nachdem Sie realisiert haben, dass Sie eher Klassennamen anstelle von IDs verwenden möchten :) Daher verwende ich jetzt eher die document.querySelectorAll
, die Ihnen ein bisschen mehr Freiheit gibt.
Jetzt können Sie die startPop-Funktion mit jedem gültigen Selektor aufrufen. Wenn Sie rein ID Pop möchten, können Sie verwenden:
startPop('#elementId');
oder wenn Sie für die Klassen
startPop('.className');
Das Beispiel gehen wollen selbst auch eine andere Funktion, nl Trigger hinzufügen ist, das zeigt, wie Sie kann die Funktionen starten/stoppen.
Ich entschied mich auch lieber die setInterval
Methode anstelle der setTimeout
Methode zu verwenden. Beide rufen eine Funktion nach einer bestimmten Anzahl von Millisekunden auf, jedoch müssen Sie setInterval nur einmal aufrufen.
Als zusätzliche Änderung, StopPop verwendet auch jetzt die document.querySelectorAll
, so dass Sie die gleiche Freiheit haben sie als startPop
Funktion aufrufen.
Ich habe 2 weitere optionale Parameter in der startPop-Funktion hinzugefügt, nämlich total
und callback
.
Insgesamt gibt die maximalen Zeiten, die Sie wünschen, das Element zu „blinken“ (s), und der Rückruf bietet Ihnen eine Möglichkeit, informiert werden, wenn das Knallen vorbei ist (zB potentielle Elemente zu aktualisieren, die das Knallen gestartet)
ich es geändert etwas mehr, damit Sie es mithilfe der this
Syntax für die Inline-Javascript
'use strict';
function getElements(className) {
// if it is a string, assume it's a selector like #id or .className
// if not, assume it's an element
return typeof className === "string" ? document.querySelectorAll(className) : [className];
}
function startPop(className, total, callback) {
// get the element once, and asign a value
var elements = getElements(className),
current = 0;
var interval = setInterval(function() {
var opacity = ++current % 2;
// (increase current and set style to the left over part after dividing by 2)
elements.forEach(function(elem) { elem.style.opacity = opacity });
// check if the current value is larger than the total or 10 as a fallback
if (current > (total || 10)) {
// stops the current interval
stopPop(interval, className);
// notifies that the popping is finished (if you add a callback function)
callback && callback();
}
}, 50);
// return the interval so it can be saved and removed at a later time
return interval;
}
function stopPop(interval, className) {
// clear the interval
clearInterval(interval);
// set the opacity to 1 just to be sure ;)
getElements(className).forEach(function(elem) {
elem.style.opacity = 1;
});
}
function trigger(eventSource, className, maximum) {
// get the source of the click event (the clicked button)
var source = eventSource.target;
// in case the attribute is there
if (!source.getAttribute('current-interval')) {
// start it & save the current interval
source.setAttribute('current-interval', startPop(className, maximum, function() {
// completed popping (set the text correct and remove the interval)
source.removeAttribute('current-interval');
source.innerText = 'Start ' + source.innerText.split(' ')[1];
}));
// change the text of the button
source.innerText = 'Stop ' + source.innerText.split(' ')[1];
} else {
// stop it
stopPop(source.getAttribute('current-interval'), className);
// remove the current interval
source.removeAttribute('current-interval');
// reset the text of the button
source.innerText = 'Start ' + source.innerText.split(' ')[1];
}
}
<div class="nav1">
test navigation
</div>
<div class="nav2">
Second nav
</div>
<div class="nav1">
second test navigation
</div>
<div class="nav2">
Second second nav
</div>
<a id="navigation-element-1"
onmouseover="this.interval = startPop(this)"
onmouseout="stopPop(this.interval, this)">Hover me to blink</a>
<button type="button" onclick="trigger(event, '.nav1', 100)">
Start nav1
</button>
<button type="button" onclick="trigger(event, '.nav2', 100)">
Start nav2
</button>
gut für einen, erkannte man bereits das Problem, die Tatsache, dass Sie "nav1" Parameter fest codierten. Nun gehe ich davon aus, dass Sie auch wissen, wie Sie Ihren Funktionen Parameter hinzufügen können, die Sie dann in Ihren Funktionen wiederverwenden können. Eine andere Sache, über die Sie nachdenken sollten, setTimeout mit einem String-Ansatz ist eine sehr veraltete Vorgehensweise, definieren Sie einfach eine anonyme Funktion und rufen Sie Ihre Pop-Funktion aus dieser anonymen Funktion heraus. Ein weiterer kleiner Punkt, wie dies Code funktioniert, [codereview] (http://codereview.stackexchange.com) könnte ein besserer Ort für Ihre Frage sein – Icepickle
Hinzufügen eines Parameters zu meiner Funktion würde es funktionieren (ich habe es versucht), aber Ich kann anscheinend nicht in der Lage sein, ElementById des Parameters zu erhalten. Versucht '"' + p1 + '"'. Wie für die setTimeout könnte funktionieren, aber ich würde die Funktions-ID für onmouseover, nein? – MrMeDo