Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazywanie do nowej funkcji zmiennej z pętli for
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
glupik909
Mam taki skrypt (przykład):
Kod
var t = Object;
for(w=0;w<10;w++){
t[w] = function(w){ alert(w) }
}


Chciałbym aby t[w] sprawiało że wyskakuje alert z zmienną w z pętli (tj t[1] = alert(1), t[2] = alert(2) itd), tylko function bierze w za parametr do nowej funkcji a nie jako zmienną z for.
Próbowałem zrobić coś takiego:
Kod
var t = Object;
for(w=0;w<10;w++){
t[w] = "alert(" + w + ");";
}

Ale to nie działa sad.gif
Jak to zrobić? Jestem początkujący w JS
Jakby był już taki temat to prosiłbym o podanie w poście linku i zamknięcie tego

Szukałem na forum i znalazłem coś o callbackach ale nie wiem czy to rozwiązanie mojego problemu
werdan
http://jsfiddle.net/N7xR2/
freemp3
Nie potrzebnie przekazujesz "w" w parametrze:
Kod
var t = Object;
for(var w=0;w<10;w++){
t[w] = function(){ alert(w) }
}


Później tylko wystarczy się odwołać do odpowiedniego elementu tablicy jak do funkcji. Np dla elementu o kluczu "1":
Kod
tw[1]();
glupik909
Thx biggrin.gif
A możliwe byloby użycie tych rozwiązań do eventów w JS (np przypisywanie różnym formularzom na stronie jakiejś akcji onsubmit) czy tu już trzeba te callbacki?
freemp3
Wszystkim formularzom jedną funkcje czy każdy ma mieć inną? Coś więcej możesz napisać?
glupik909
Cytat(freemp3 @ 29.11.2013, 15:28:52 ) *
Wszystkim formularzom jedną funkcje czy każdy ma mieć inną? Coś więcej możesz napisać?


Sorry że tak mało biggrin.gif
Tak, wszystkim jedną (np odczyt danych z formularza i wyświetlenie w console.log), bo eksperymentuje z tym (nie chce kraść danych z formularzy) i mi nie wychodzi, a o to głównie mi chodziło, ten przykład z obiektem był nietrafiony biggrin.gif
freemp3
Możesz to zrobić dodając do każdego formularza wydarzenie onSubmit lub przy pomocy np jQuery dla wszystkich formularzy naraz.
glupik909
Cytat(freemp3 @ 29.11.2013, 16:27:59 ) *
Możesz to zrobić dodając do każdego formularza wydarzenie onSubmit lub przy pomocy np jQuery dla wszystkich formularzy naraz.


Właśnie próbuję przypisać onsubmit wartość funkcji odczytującej ale mam ten problem jaki opisałem na początku smile.gif

Kod
function odczytDanych(id){
//Moja funkcja odczytująca dane z formularza i wyświetlajace je za pomocą console.log
}
for(t=0;t<document.forms.length;t++){
document.forms[t].onsubmit = function(t){ odczytDanych(t);
}

Może te callbacki byłyby w tym pomocne? ^^
jQuery to dla mnie czarna magia wink.gif
freemp3
Ehh... Nie wyciągnąłeś wniosków z pierwszych dwóch odpowiedzi.
Pod co przekazujesz "t" jako parametr w "function(t)"? Zostaw samo "function()".
glupik909
Mam dwie wersje takiej funkcji ale obie zwracają undefined albo TypeError: document.forms[this.id] is undefined czy coś takiego thumbsdownsmileyanim.gif
Kod
function MyForm(id){
this.id = id;
}
MyForm.prototype.getChild = function(){
var string;
for(t=0;t<document.forms[this.id].length;t++){
if(document.forms[this.id].children[t].constructor == HTMLInputElement && document.forms[this.id].children[t].type == "text"){
string += "form_field[" + t + "]=" +  document.forms[this.id].children[t].value + "&";
}
}
return string.replace("undefined","");
}

function callIt(id){
t = new MyForm(id);
return t;
}
for(w=0;w<document.forms.length;w++){
document.forms[w].onsubmit = callIt(w).getChild;
}

function MyForm(id){
this.id = id;
}
MyForm.prototype.getChild = function(){
var string;
for(t=0;t<document.forms[this.id].length;t++){
if(document.forms[this.id].children[t].constructor == HTMLInputElement && document.forms[this.id].children[t].type == "text" ){
string += "form_field[" + t + "]=" +  document.forms[this.id].children[t].value + "&";
}
}
return string.replace("undefined","");
}

function callIt(id){
t = new MyForm(id);
return t;
}
var x = {}
for(w=0;w<document.forms.length;w++){
x[w] = callIt(w)
document.forms[w].onsubmit = x[w].getChild;
}


EDIT:
Tema do zamknięcia, znalazłem rozwiązanie biggrin.gif
Kod
function getChild(id){
var string;
for(t=0;t<document.forms[id].children.length;t++){
if(document.forms[id].children[t].constructor == HTMLInputElement && document.forms[id].children[t].type == "text")
string += "form_field[" + t + "]=" +  document.forms[id].children[t].value + "&";
}
}
console.log(string.replace("undefined",""));
}

function setHandler(n,callback){
return function(){ callback(n); }
}

for(w=0;w<document.forms.length;w++){
document.forms[w].onsubmit = setHandler(w,getChild);
}
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.