Wątek przeniesiony 2018-03-14 20:24 z Java przez Rev.

pomoc dla świeżaka

0

Hej,

od kilku dni uczę się JS, jestem totalnie zielony i znam tylko podstawy css i html-a. W każdym razie próbowałem zrobić ćwiczenie: stworzyć aplikację, która po wpisaniu liczby w pole formularza i kliknięciu przycisku zwróci komunikat, czy dana liczba jest dodatnia czy ujemna bądź wynosi 0. Z tym nie miałem większego problemu, ale spróbowalem sobie zadanie utrudnić i chciałem zrobić tak, żeby informacja zwrotna pojawiała się w tym samym polu formularza, a jednocześnie żeby wszystkie wpisane liczby pojawiały się na liście pod formularzem. Natrafiłem jednak na problem: po wyświetleniu się komunikatu np "liczba dodatnia" i ponownym kliknięciu oblicz fraza "liczba dodatnia" z formularza też wędrowała na listę, a tego nie chciałem. Jedyne co wymyśliłem to umieszczenie kodu dopisywania tej liczby pod każdym z warunków funkcji, ale czuję, że da się to zrobić jakoś krócej. Czy jest sposób, żeby ten skrypt tworzenia nowego elementu

w divie zapisać raz i odnosić się do niej skrótem? Bez powtarzania 3 razy?
Przepraszam za lekki bełkot, ale chciałem możliwie dokładnie opisać mój dylemat.
Poniżej kod, z góry dziękuję za pomoc.

<!DOCTYPE html>
<html>
<head>
	<title>Jaka to liczba?</title>

</head>
<body>

		<input type="text" name="liczba" id="liczba">
		<button onclick="oblicz()" id="przycisk">Oblicz</button> 
<div id="div1"></div>

<script>

function newPara() {}

	function oblicz() {
		var num = document.getElementById("liczba").value;
		if(num > 0) {
			var para = document.createElement("p");
			var node = document.createTextNode(num);
			para.appendChild(node);
			var element = document.getElementById("div1");
			element.appendChild(para);
		liczba.value = "liczba dodatnia";
	}
		if(num == 0) {
			var para = document.createElement("p");
			var node = document.createTextNode(num);
			para.appendChild(node);
			var element = document.getElementById("div1");
			element.appendChild(para);
		liczba.value = 0;
		}
		if (num < 0) {
			var para = document.createElement("p");
			var node = document.createTextNode(num);
			para.appendChild(node);
			var element = document.getElementById("div1");
			element.appendChild(para);
		liczba.value = "liczba ujemna";
		}
	}
				

</script>


</body>
</html>
0

Te
function newPara() {}
to zostało chyba z jakiegoś starego kodu, sorry

0

Cześć,

  1. Natrafiłem jednak na problem: po wyświetleniu się komunikatu np "liczba dodatnia" i ponownym kliknięciu oblicz fraza "liczba dodatnia" z formularza też wędrowała na listę, a tego nie chciałem.

Chodzi Ci o to, że wstawiłeś np. cyfrę 5, kliknąłeś oblicz, pojawiło Ci się "liczba dodatnia", a potem znowu kliknąłeś oblicz i "liczba dodatnia" wskoczyła na listę pod formularz? Czy po pierwszym kliknięciu oblicz, usunąłeś z formularza "liczba dodatnia", wstawiłeś jakąś nową cyfrę i kliknąłeś drugi raz oblicz, a mimo to tekst "liczba dodatnia" wskoczyło na listę? Zakładam, że pierwsza opcja tak :)?

Czy jest sposób, żeby ten skrypt tworzenia nowego elementu w divie zapisać raz i odnosić się do niej skrótem? Bez powtarzania 3 razy?

Utwórz sobie drugą funkcję dodajElement() i w parametrze przekaż wartość num, albo umieść num w zmiennej globalnej i kod:

        var para = document.createElement("p");
        var node = document.createTextNode(num);
        para.appendChild(node);
        var element = document.getElementById("div1");
        element.appendChild(para);

przerzuć do tej nowej funkcji i wywołuj tylko tę funkcję, zamiast trzy razy pisać to samo. Dodatkowo, zamiast używać wywołania eventu bezpośrednio w elemencie button, skorzystaj z funkcji addEventListener na zmiennej przechowującej element button i umieść to wszystko w <script></script>.

@Edit,
I jeżeli możesz to przenieś tematu z Javy bo Ci forumowicze łeb ukręcą, albo poproś szybko moda :P.

0

Hej,

dzięki za odpowiedź, ale jestem zbyt zielony chyba na tym etapie. Tzn utworzyć oddzielną funkcję pewnie potrafię, ale jak wywołać tę funkcję w funkcji obliczania? Będę wdzięczny za linijkę lub dwie kodu:)
Pozdrawiam

1

Ja bym to uprościł tak:

jako html dał:

<!DOCTYPE html>
<html>
<head>
    <title>Jaka to liczba?</title>

</head>
<body>

        <input type="text" name="liczba" id="liczba">
        <button id="przycisk">Oblicz</button> 
<div id="div1"></div>

<script src="js.js"></script>

</body>
</html>

natomiast w pliku js.js:

const button = document.getElementById('przycisk');

function dodajElement(numValue){
    var para = document.createElement("p");
    var node = document.createTextNode(numValue);
    para.appendChild(node);
    var element = document.getElementById("div1");
    element.appendChild(para);
};

function oblicz() {
    let num = document.getElementById('liczba').value;

    if(num > 0) {
        liczba.value = "liczba dodatnia";
    } else if(num == 0) {
        liczba.value = 0;
    } else {
        liczba.value = "liczba ujemna";
    }

    dodajElement(num);
};

button.addEventListener('click', oblicz);

Pewnie można to jeszcze uprościć :P

0

Sprawdziłem, jednak Twój skrypt nie spełnia wymogu, żeby na liście pojawiały się tylko liczby. Jeśli w formularzu pojawi się napis "Liczba dodatnia", a ja kliknę "Oblicz", wtedy ten napis wpada na listę. No i z jakiegoś powodu jak zamiast liczby wpiszę jakieś litery, to zwraca mi wynik "Liczba ujemna" :)

1

Wystarczy zmienić funkcję Oblicz:

function oblicz() {
    let num = document.getElementById('liczba').value;

    if(num > 0) {
        liczba.value = "liczba dodatnia";
        dodajElement(num);
    } else if(num == 0) {
        liczba.value = 0;
        dodajElement(num);
    } else if(num < 0){
        liczba.value = "liczba ujemna";
        dodajElement(num);
    }
};

W poprzedniej wersji, nie było ostatniego warunku ****else if(num < 0) **** tylko zwykłe else, także wszystko co nie było większe lub równe 0 wskakiwało w ostatni warunek, a więc również i litery. Przeniosłem również funkcję dodajElement do warunków if, tak żeby nie wpadały "Liczba dodadnia" itp.

Myślałem, że sam pogłówkujesz :P

1

Istotnie powinienem pogłówkować:)
W każdym razie o to mi właśnie chodziło:

dodajElement(num);

czyli jak wywołać funkcję w funkcji. Teraz już wiem.
Dzięki!

0

Hej,
mam znów zagwozdkę, więc postuję w tym samym temacie, może ktoś zechce pomóc.
Czy mogę w tej pętli sprawić, żeby wszystkie eventListenery działały tylko raz, czyli po jednym kliknięciu przestawały "słuchać"?

var winner = Math.floor((Math.random() * 6)); 

var button = document.getElementsByClassName("square");

for (i=0; i<button.length; i++) {
 button[i].addEventListener("click", function() {
 if (this === button[winner]) {
    console.log("winner");
    }
    else {
    console.log("loser");
    }
    });
}

Próbowałem wpleść metodę jquery .one, ale wszystko się wykrzacza

0

Tak, poczytaj o removeEventListener()

0
adhed napisał(a):

Tak, poczytaj o removeEventListener()

Tak, wiem, ale w jaki sposób zastosować to w tej konkretnie pętli? Z tym mam problem...

0

Hej,

W pierwszej kolejności skorzystaj sobie z wbudowanej funkcji forEach do iteracji po buttonach, zamiast wrzucać to w pętlę for, a następnie możesz skorzystać z opisanego powyżej removeListener:

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener

albo wewnątrz funkcji, która jest wywoływana po evencie, ustawić sobie jakąś zmienną bool na true, która będzie decydowała czy kod pod eventem ma się dalej wywoływać czy nie (ustaw ją na true na końcu funkcji)

1 użytkowników online, w tym zalogowanych: 0, gości: 1