2011-06-10 25 views
7

tengo este evento click jQuery

$('#sidebar .nav a span').click(function() { 
    var sidebar_nav = $(this); 
    $("#main").load("type_change.php?id="+id, successCallback); 

y luego tengo la devolución de llamada para hacer el

vinculante
var successCallback = function(responseText, textStatus, XMLHttpRequest) { 
    //doing all the binding in here 
} 

¿Hay una manera de pasar $(this) o sidebar_nav o a la función successCallback para que pueda hacer algo con ella

+0

Pregúntese, ¿qué sucede cuando se hace clic en segundo lapso antes de la primera carga evento se levanta? creo que necesita una reconsideración del diseño. no puedo proponer uno porque no estoy seguro de lo que realmente necesitas. pero su error es que tiene enlaces de navegación que quiere pasar al evento asincrónico de un solo elemento. el evento de carga puede no aumentar en el orden exacto que asume. – venimus

Respuesta

7

Puede usar $.proxy:

$("#main").load("type_change.php?id="+id, $.proxy(successCallback, $(this))); 

Esto establecerá this dentro successCallback a lo que se pasa como segundo parámetro.

Si desea this todavía para referirse a $("#main"), entonces se podría cambiar la devolución de llamada para aceptar un parámetro más:

var successCallback = function(responseText, textStatus, XMLHttpRequest, target) { 
    //doing all the binding in here 
} 

y lo llaman así:

var sidebar_nav = $(this); 
$("#main").load("type_change.php?id="+id, function() { 
    var args = $.makeArray(arguments); 
    args.push(sidebar_nav); 
    successCallback.apply(this, args); 
}); 

target se referirá a sidebar_nav.

+0

Buen punto para retener el elemento '# main' como' this'. Eso puede ser lo que OP pretendía. +1 – user113716

4

lo envuelve en una función, y utilizar .apply() para invocar su función:

$('#sidebar .nav a span').click(function() { 
    var sidebar_nav = this; 
    $("#main").load("type_change.php?id="+id, function() { 
     successCallback.apply(sidebar_nav, arguments); 
    }); 

Ahora, this en su devolución de llamada será el elemento que se ha hecho clic, y se pasarán los demás argumentos de la load() devolución de llamada a lo largo también.

+0

¿No sería más apropiado algo como 'successCallback.apply (sidebar_nav, arguments)'? 'this' en tu ejemplo está llamando' # main'. – buzzedword

+0

@Bruzzword: Sí, ya lo entendí. Estaba centrado en el elemento equivocado. Gracias por el heads-up sin embargo. : o) – user113716

1

¿Hay alguna razón por la que no pueda usar una función anónima en la devolución de llamada? Por ejemplo:

$('#sidebar .nav a span').click(function() { 
    var sidebar_nav = $(this); 
    main.load("/shop_pos/includes/business_type_change.php?industry_category_id="+industry_category_id+"&business_type_id="+business_type_id+"&class_id="+class_id+"&quantity="+quantity, '', function (responseText, textStatus, XMLHttpRequest) { 
     // Function can read sidebar_nav here 
     if (textStatus == 'success') { 
      // Do stuff here, including that $.post that you might want to do. 
     } 
    }); 
2

Otra solución sería la de generar la función de devolución de llamada y proporcionar this como un argumento para el generador:

var genSuccessCallback = function (element) { 
    return function(responseText, textStatus, XMLHttpRequest) { 
    // use "element" here 
    } 
} 

$("#main").load("type_change.php?id="+id, genSuccessCallback(this)); 
+0

+1 Otro buen enfoque. – user113716

Cuestiones relacionadas