Pasar parámetros en función referenciada javascript

archienemigo

Buenas!

La pregunta es simple, ¿se pueden pasar parámetros cuando referencias una función?

Por ejemplo cuando a un elemento le ligas un evento:

document.getElementById("elemento").onchange = función;

¿Hay alguna manera?

MTX_Anubis

#1 Lo que quieres se llama currying y javascript se puede hacer. Un ejemplo aquí

http://www.dustindiaz.com/javascript-curry/

O mejor de esta forma:

Function.method('curry',function() {
  var args = arguments, self = this;
  return function() {
    return self.apply(null,args.concat(arguments));
  }:
});

De esta forma puedes hacer lo siguiente

var add = function(a1,a2) { return a1 + a2 };

var add1 = add.curry(1);

add1(5);
-> 6

Si lo que quieres es otra cosa entonces es que no te he entendido :P

1 respuesta
eXtreM3

Por qué no usas jQuery? Facilita muchísimo todo (lo del input file del otro hilo y esto)

function tu_funcion(p1,p2){
      //cosas
{

$("#elemento").onChange(function(){
      tu_funcion(param1,param2);
});
1 respuesta
mry00

Quizas callback de JQuery te venga bien:
http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_callback

1 respuesta
archienemigo

#2 Gracias! Voy a mirarlo por que no lo entiendo del todo.

#3 La idea es empaparme bien JS y entenderlo todo. Tengo pensado rehacerla luego usando jQuery.

#4 Gracias!

He hecho esta clase para usar Ajax.

function ajaxRequest(url,httpmethod,query_string){	
	this.url = url;
	this.httpmethod = httpmethod;
	this.query_string = query_string;	
	this.xhr = this.ini_xhr();	
}
ajaxRequest.prototype.ini_xhr = function(funct){
	if(window.XMLHttpRequest){
		return new XMLHttpRequest();		
	}else if(window.ActiveXObject){
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
}
ajaxRequest.prototype.sendRequest = function(funct){
	this.xhr.open(this.httpmethod,this.url,true);
	this.xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");	
	this.xhr.onreadystatechange = function(){funct(this);}
	this.xhr.send(this.query_string);	
}

La función(que la envio como parámetro) que ejecuta la respuesta envía a su vez como parámetro el objeto xhr.

this.xhr.onreadystatechange = function(){funct(this);}

El código inicial era con una referencia, osea, así.

this.xhr.onreadystatechange = funct;

Pero así no tengo ni idea de como enviarle parámetros y necesitaba al menos el objeto xhr para procesar la respuesta. Iba a explicarlo todo pero me va a quedar un tocho infumable, la cosa es que lo que me devuelve PHP es un numero.

La cuestión, la función que procesa la respuesta es esta.

function setRef(xhr){
	if(xhr.readyState == 4){		
		if(xhr.status == 200){
			var product_type = document.getElementById("product_type").value;
			var type = new ajaxRequest("php_scripts/get_type.php","POST","&typeid=" + product_type);
			type.sendRequest(getType);
			/*RESOLVER*/
			ajare = xhr.responseText;
		}
	}	
}

En responseText tengo el numero. El numero lo quiero concatenar con una letra. Recojo de un <select> el value, que corresponde en la BD a un tipo de producto. Vuelvo a consultar en la BD mediante ajax que producto es, ya que lo que tengo es la ID de este. PHP me devuelve la primera letra del producto cuando llamo a:

type.sendRequest(getType);

Entonces, a la función getType, quiero enviarle como parametro el responseText para poder concatenarlos luego. Al final lo he hecho con una variable global (ajare) pero no es lo suyo.

function getType(xhr){	
	if(xhr.readyState == 4){
		if(xhr.status == 200){
			document.getElementById("ref").value = xhr.responseText + ajare.toString();
		}
	}
}

No se si me he explicado ni si tenéis ganas de leer esto xD Probaré lo de #2 a ver si es lo que busco.

1 respuesta
MTX_Anubis

#5 Lo puedes hacer con currying (de hecho existe para ese tipo de cosas xD), pero yo lo haría de esta forma, aunque te podríamos dar más consejos si pusieras todo sobre todo de diseño ;) Pero centrandonos en el tema:

en la función setRef() esto:

type.sendRequest(getType);

lo cambiaria por esto:

var responseText = xhr.responsetText;
type.sendRequest(function(xhr) {
  getType(xhr,responseText);
});

Esto hace lo mismo que tu quieres de forma algo más elegante (con callbacks) y sin necesidad de usar variables globales que son el jodido mal xD

1 1 respuesta
archienemigo

#6 Funciona perfectamente. No había pensado en mandar la función de esta manera. Muchas gracias! Si pudiera te invitaba a una birra.

¿A que refieres con diseño? Yo pongo lo que quieras si quieres que lo veamos, encantado de recibir consejos.

1

Usuarios habituales

  • archienemigo
  • MTX_Anubis
  • mry00
  • eXtreM3