Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Problém s Javascriptem kod (náhled)

Dobrý den chtěl jsem se zeptat dělám si takovej kod (kopirovano a upraveno z Interval) a potřeboval bych poradit .Snažim se udělat takový náhled na vložené údaje z inputu.Jakmile zmáčknu písmeno(znak) a pustím klávesu má se provést funkce která tento znak zapíše do <div>.
Ale nějak mi to nejede . Nevíte někdo co s tím ?

<html>
<head>
<script type="text/javascript">

var data;
function Update(form,todiv)
{
data+=form.clanek.value +"\n"; //prida obsah inputu clanek do promenne data
todiv.nadpis1.innerHTML= data;
}

</script>
</head>
<body>

<form method="POST" name="form1"> 
<input type="text" id="clanek" onKeyUp="Update(this.form,nahled)" name="clanek" size="30">
</form>

<br><br>
<div id="nahled" name="nahled"> 
ZDE:<div id="nadpis1"></div>
</div>

</body>
</html> 

Když tak to zkouším zde : http://www.w3schools.com/js/tryit.asp?filename=try js_events

Díky moc za rady.

Předmět Autor Datum
function Update(form,todiv) { data=form.clanek.value +"\n"; nadpis1.innerHTML= data; }
Wikan 27.10.2011 16:33
Wikan
ty je to je hustý dík. Radši to ještě necháme otevřené možná že budu potřebovat ještě něco. Ale každ…
Vasekdvor 27.10.2011 16:39
Vasekdvor
Ještě jeden dotaz . Mám pomocí php uděláno to že když napíšu do inputu "číslo počtu obrázků" a klikn…
Vasekdvor 27.10.2011 19:37
Vasekdvor
Otázka nie je, prečo ti to nefunguje, ale prečo by to malo fungovať. :-) 1. form.getElementById - m…
los 27.10.2011 22:48
los
No dík. TO je přesně ono co jsem chtěl. Ale ještě bych tě chtěl poprosit.Jelikož na ten tvůj kod čum…
Vasekdvor 28.10.2011 13:15
Vasekdvor
Zkus u tagu img použít místo ostrých šipek <> odpovídající entity a případně escapovat uvozovky pomo…
host 28.10.2011 18:50
host
Takéto niečo? <form method="get" action=""> Počet obrázků : <input id="count" size="2" maxlength="2…
los 29.10.2011 00:13
los
jj to je přesně ono, ještě malý dotaz nemáš tento kod s komentářema (kde co je) ? Mě by se to hodilo…
Vasekdvor 29.10.2011 22:53
Vasekdvor
// uložíme si count, inputs a images elementy do premenných, aby sme k nim mohli jednoducho pristupo…
los 30.10.2011 10:22
los
To se často nevidí, ale komentáře byly delší než kód samotný. ;-):-p Něco pro pobavení (+komentáře…
host 30.10.2011 10:26
host
Dik moc a ty komentáře fakt dobrý :-D:-D značim jako vyřešené poslední
Vasekdvor 30.10.2011 14:22
Vasekdvor
Zkoušej to přímo v prohlížeči a zapni si chybovou konzoli...
host 27.10.2011 19:42
host
No to jsem udělal jak si řekl ale jak mám dostat místní proměnnou "z" z funkce Update_2 do funkce Up…
Vasekdvor 27.10.2011 19:56
Vasekdvor
Nevíte ?
Vasekdvor 27.10.2011 20:24
Vasekdvor
Asi dneska nemám den, ale pořád jsem nepochopil, čeho vlastně chceš dosáhnout.
Wikan 27.10.2011 21:51
Wikan

Ještě jeden dotaz . Mám pomocí php uděláno to že když napíšu do inputu "číslo počtu obrázků" a kliknu na OK php mi vypíše x inputů dle zadaného čísla. A já bych chtěl udělat to samé jako výše pro tyto obrázky.To co jsem zkoušel je níže.

Popis: Napíšu číslo do inputu s id="cislo_obr" poté kliknu na OK, php mi vytvoří příslušný počet inputů dle zadaného čísla.
Do těchto inputu pak zadávám odkazy na obrázky.Zároveň javascript zjistí toto číslo (pomocí funkce Update_2) a uloží ho do proměnné "z".Poté (pomocí funkce Update) s použitím for navyšuje hodnotu proměnné y dokavaď se nerovná z , při tomto navyšování provádí (výše uvedený skript):

1)Zjistí input s číslem obrázku a hodnotu ulozi do promenne "data_obr".
2)Zjistí element s id= cislo + promenna y a zapíše do něj promennou "data_obr".

Kdybyste nepochopily ještě přidávám skript.Otázka je proč mi to nefunguje , či jak to mám udělat .
Mockrát děkuji za rady a za váš čas.

<script language="JavaScript" type="text/javascript">

function Update_2(form,todiv)
{
var z;
form.getElementById("cislo_obr").value = z; // Zjistí počet obrázků a uloží hodnotu do proměnné "z"

}


function Update(form,todiv)
{
var y;

for (y=1;y<=z;y++) // Navyšuje hodnotu "y" dokavaď není rovna "z" (počtu obrázků).
{
data_obr=form.cislo+y.value; // Zjistí input s číslem obrázku a hodnotu ulozi do promenne "data_obr"
document.getElementById('cislo'+y).innerHTML= data_obr; // Zjistí element s id= cislo + promenna y a zapíše do něj promennou //"data_obr"
}

}

</script>


$z = $_POST ['z'];

<form method="POST" name="form1">
Počet obrázků :
<input type="text" size="2" maxlength="2" name="z" id="cislo_obr" value="" > //Uzivatel zada pocet obrazku
<input type="submit" name="pocet" value="OK" onclick="Update_2(this.form,nahled)"> (max.: 6) // Po kliknuti se spusti funkce Update_2

<input type="button" onclick="Update(this.form,nahled)" value="Ukázat">
</form>



<div id="nahled" name="nahled">

<span id="cislo1"></span>
<span id="cislo2"></span>
<span id="cislo3"></span>
..
..
..
<span id="cislo6"></span> 
</div>

Otázka nie je, prečo ti to nefunguje, ale prečo by to malo fungovať. :-)

1. form.getElementById - myslel si document.getElementById?
2. Vo funkcii Update_2 máš v komentári napísané, že niečo priraďuješ do premennej z. Faktom je, že premennú z priraďuješ do niečoho. Keďže si do nej nepriradil žiadnu hodnotu, tak je tam undefined.
3. Vo funkcii Update pracuješ s premennou z, ktorú si nikde nedeklaroval. Môžeš premennú z deklarovať globálne - potom by to možno niečo spravilo. Ale keďže nikde nič do nej nepriraďuješ, tak je to jedno.
4. Používaš premennú data_obr, ako keby to bola globálna premenná, pritom ti stačí lokálna.
5. form.cislo+y.value - chcel si napísať form['cislo' + y].value?
6. Si si istý, že chceš použiť innerHTML, t.j. ak niekto zadá HTML, má sa v náhľade vyrenderovať HTML alebo text?
7. Používaš globálnu premennú nahled, aby si získal prístup k prvku s id=nahled. Takéto niečo bolo odpustiteľné možno pred 10 rokmi.

To boli tie väčšie chyby, ešte si rýpnem do tých menších:

1. Atribút language="JavaScript" - to je z minulého storočia?
2. Názvy funkcií Update, Update_2 - okrem toho, že nedodržiavaš konvencie sú tie názvy dosť ničnehovoriace. Vstupný prvok name="z", srsly?
3. Komentáre typu "i = 1; // priradí jednotku do premennej i" - ::facepalm::
4. Inline zápis JS v HTML kóde sa dá prirovnať inline zápisu štýlov v HTML kóde - funguje to, ale nie je to dobre.
5. Ak plánuješ, že ten náhľad bude fungovať len s JavaScriptom, tak do toho nemiešaj server. Buď to sprav najprv tak, aby to fungovalo čisto serverovo, alebo to sprav rovno len s využitím JS.

Aby to nebolo, že len frflem, tak tu je nejaký nástrel čisto JS verzie toho, čo si myslím, že chceš dosiahnuť:

<form method="post">
Počet obrázků : <input id="count" size="2" maxlength="2"> (max.: 6)
</form>
<script>
var count = document.getElementById('count');
var preview = document.createElement('div');
var inputs = [];
var spans = [];
document.body.appendChild(preview);
count.form.onsubmit = function() {
	return false;
};
var bindInput = function(input, fn) {
	input.oninput = function(e) {
		this.onkeydown = null;
		fn.call(this, e);
	};
	input.onkeydown = function(e) {
		fn.call(this, e);
	};
};
var onInput = function(e) {
	e = e || window.event;
	var target = e.target || e.srcElement;
	for (var i = 0, n = inputs.length; i < n; ++i)
		if (inputs[i] == target) {
			spans[i].firstChild.data = target.value;
			break;
		}
};
bindInput(count, function() {
	var cnt = Math.max(0, Math.min(6, this.value));
	if (!isNaN(cnt)) {
		if (cnt < inputs.length) {
			for (var i = cnt, n = inputs.length; i < n; ++i) {
				this.form.removeChild(inputs[i]);
				preview.removeChild(spans[i]);
			}
			inputs.length = cnt;
			spans.length = cnt;
		}
		for (var i = inputs.length, n = cnt; i < n; ++i) {
			var input = document.createElement('input');
			bindInput(input, onInput);
			this.form.appendChild(input);
			inputs.push(input);
			var span = document.createElement('span');
			span.appendChild(document.createTextNode(''));
			preview.appendChild(span);
			spans.push(span);
		}
	}
});
</script>

No dík. TO je přesně ono co jsem chtěl. Ale ještě bych tě chtěl poprosit.Jelikož na ten tvůj kod čumim jak deb*l. Tak když napíšu text do těch vygenerovanejch inputů, tak se mi zobrazí ale tam příjde odkaz na obrázek tzn.:<img src=""> a ono to napíše jako text potřeboval bych to jako HTML.(aby se mi ten obrázek zobrazil).A ještě maličkost potřeboval bych každýmu inputu přiřadit name="cislo+y" (y je promenna, od 1-6 dle počtu obrázků.) .Vím že otravuju a že bych si to měl udělat sám já bych to zkusil ale ten tvůj kod funguje prefektně a já na něj jen valim oči (v javascriptu moc nedělám , spíš v php). :-)

Ještě jednou děkuji mnohokrát.

Takéto niečo?

<form method="get" action="">
Počet obrázků : <input id="count" size="2" maxlength="2"> (max.: 6)
<div id="inputs"></div>
<div id="images"></div>
<input id="submit" type="submit" />
</form>
<script>
var count = document.getElementById('count');
var inputs = document.getElementById('inputs');
var images = document.getElementById('images');
var bindInput = function(input, fn) {
	input.oninput = function(e) {
		this.onkeydown = null;
		fn.call(this, e);
	};
	input.onkeydown = function(e) {
		fn.call(this, e);
	};
};
var onInput = function(e) {
	e = e || window.event;
	var target = e.target || e.srcElement;
	if (target.timer) {
		clearTimeout(target.timer);
		target.timer = null;
	}
	for (var input = inputs.firstChild, i = 0; input; input = input.nextSibling, ++i)
		if (input == target) {
			target.timer = setTimeout(function() {
				images.childNodes[i].src = target.value;
				target.timer = null;
			}, 500);
			break;
		}
};
var onCountInput = function(e) {
	var count = Math.max(1, Math.min(6, this.value));
	if (isNaN(count))
		count = 1;
	var actual = inputs.childNodes.length;
	while (count < actual--) {
		inputs.removeChild(inputs.lastChild);
		images.removeChild(images.lastChild);
	}
	while (++actual < count) {
		var input = document.createElement('input');
		input.name = 'cislo' + (actual + 1);
		bindInput(input, onInput);
		inputs.appendChild(input);
		var image = new Image();
		images.appendChild(image);
	}
}
bindInput(count, onCountInput);
onCountInput.call(count);
</script>

jj to je přesně ono, ještě malý dotaz nemáš tento kod s komentářema (kde co je) ?
Mě by se to hodilo abych poznal kde se co mění atd...
Chci se do toho dostat abych to pak uměl.

Jinak fakt moc dík, takovou odezvu jsem nečekal. Je vidět že jsou i lidi kteří velmi rádi pomůžou.
Díky moc.

// uložíme si count, inputs a images elementy do premenných, aby sme k nim mohli jednoducho pristupovať
var count = document.getElementById('count');
var inputs = document.getElementById('inputs');
var images = document.getElementById('images');
// pomocná funkcia, ktorá naviaže obsluhu stlačenia klávesy na vstupný prvok formulára
// využíva oninput z HTML5 (ktorý sa volá po každej zmene hodnoty) s fallbackom pre staršie prehliadače na onkeydown (ktorý sa volá po každom stlačení klávesy)
var bindInput = function(input, fn) {
	input.oninput = function(e) {
		this.onkeydown = null;
		fn.call(this, e);
	};
	input.onkeydown = function(e) {
		fn.call(this, e);
	};
};
// táto funkcia sa bude volať pri zmene hodnoty vo vygenerovaných textových poliach
// používame časovač, aby sa obrázok začal načítavať až po nejakom čase nečinnosti
var onInput = function(e) {
	// fallback pre staršie prehliadače (e = udalosť, target = prvok, ktorý danú udalosť vyvolal)
	e = e || window.event;
	var target = e.target || e.srcElement;
	// ak časovač čaká, aby mohol načítať obrázok, ...
	if (target.timer) {
		// ...tak ho zrušíme, pretože hodnota sa zmenila a budeme načítavať iný obrázok
		clearTimeout(target.timer);
		target.timer = null;
	}
	// zistíme index textového prvku, v ktorom sa zmenila hodnota, aby sme mohli zmeniť adresu obrázka s rovnakým indexom
	// prebehneme cez všetky deti prvku so vstupnými prvkami
	for (var input = inputs.firstChild, i = 0; input; input = input.nextSibling, ++i)
		// ak sme našli vstupný prvok, v ktorom sa zmenila hodnota, ...
		if (input == target) {
			// ...nastavíme časovač, ...
			target.timer = setTimeout(function() {
				// ...aby nastavil adresu obrázka...
				images.childNodes[i].src = target.value;
				target.timer = null;
			// ...po pol sekunde nečinnosti 
			}, 500);
			// našli sme, čo sme chceli, tak ukončíme cyklus
			break;
		}
};
// táto funkcia sa volá pri zmene hodnoty v textovom poli s počtom prvkov
var onCountInput = function(e) {
	// z hodnoty v poli prečítame počet a obmedzíme ho na hodnoty 1 až 6
	var count = Math.max(1, Math.min(6, this.value));
	// ak v poli nebola číselná hodnota, ...
	if (isNaN(count))
		// ...použijeme predvolenú hodnotu 1
		count = 1;
	// zistíme aktuálny počet vstupných polí
	var actual = inputs.childNodes.length;
	// pokiaľ je požadovaný počet menší ako aktuálny počet (ktorý postupne zmenšujeme), ...
	while (count < actual--) {
		// ...odstránime posledné vygenerované vstupné pole...
		inputs.removeChild(inputs.lastChild);
		// ...a jemu prislúchajúci obrázok
		images.removeChild(images.lastChild);
	}
	// pokiaľ je aktuálny počet menší ako požadovaný počet (aktuálny počet vždy zväčšujeme), ...
	while (++actual < count) {
		// vygenerujeme nové textové pole...
		var input = document.createElement('input');
		// ...s požadovaným názvom...
		input.name = 'cislo' + (actual + 1);
		// ...a naviazanou obslužnou funkciou,...
		bindInput(input, onInput);
		// ktoré pridáme za ostatné vstupné polia,...
		inputs.appendChild(input);
		// ...spolu s obrázkom, ...
		var image = new Image();
		// ...ktorý pridáme za ostatné obrázky
		images.appendChild(image);
	}
}
// naviažeme obslužnú funkciu, aby sa vykonala po každej zmene hodnoty v poli s požadovaným počtom obrázkov
bindInput(count, onCountInput);
// zavoláme funkciu manuálne, aby sa vygenerovali polia podľa aktuálnej hodnoty
onCountInput.call(count);

Zpět do poradny Odpovědět na původní otázku Nahoru