Tengo esta llamada ajax a un doop.php.

    function doop(){
        var old = $(this).siblings('.old').html();
        var new = $(this).siblings('.new').val();

        $.ajax({
            url: 'doop.php',
            type: 'POST',
            data: 'before=' + old + '&after=' + new,
            success: function(resp) {
                if(resp == 1) {
                    $(this).siblings('.old').html(new);
                }
            }
        });

        return false;
    }

Mi problema es que la $(this).siblings('.old').html(new); línea no está haciendo lo que se supone que debe hacer.

gracias..
todos los comentarios/respuestas se votó hasta.

Actualización: parece que la mitad del problema fue el alcance (gracias por las respuestas que me ayudaron a aclarar eso), pero la otra mitad es que estoy tratando de utilizar ajax en forma sincrónica. He creado un nuevo post

InformationsquelleAutor Chris | 2009-10-15

3 Comentarios

  1. 26

    Primero de todos new es una palabra reservada. Usted necesita para cambiar el nombre de esa variable.

    Para responder a su pregunta, Sí, usted necesita para guardar this en una variable fuera el éxito de devolución de llamada, y hacer referencia a él en el interior de su éxito el código de controlador:

    var that = this;
    $.ajax({
        //...
        success: function(resp) {
            if(resp == 1) {
                $(that).siblings('.old').html($new);
            }
        }
    })

    Esto se llama un cierre.

    • Mmm, raro, he intentado algo muy similar a lo que has hecho, pero me hizo var saveit = $(this); no funciona. Voy a probar esto ahora.. También no se preocupe de nuevo, se llama algo más en mi código.
    • re: new, me imaginé que tanto. 🙂
    • re el cierre no funciona, asegúrese de doop es en sí mismo, refiriéndose a la espera this. Si usted acaba de llamar doop() por ejemplo, this se acaba de apuntar a la window objeto.
    • Ok, después del cierre, soy capaz de orientar el derecho de este/que (he probado con mostrar/ocultar y sé que es la orientación de la cosa derecha). Sin embargo, no se actualiza el html.. yo estoy haciendo algo de solución de problemas y actualizar mi respuesta anterior, por favor, vuelva cuando te dan una oportunidad, gracias.
    • Ahora que he hecho mi de solución de problemas, he llegado a la conclusión de que la segunda mitad del problema es que yo debería ser el uso sincrónico de ajax. no asincrónica. Updaing mi pregunta anterior y la publicación de una nueva pregunta.
    • Usted está en lo correcto en el new palabra clave, pero esto se añade demasiado código hinchazón en una larga lista en la que se añade dinámicamente, cada var tendría que ser único, donde como en la respuesta a continuación, utilizando context: this hace una vez y tiene mucho más flexible que los casos de uso.

  2. 48

    Debe utilizar el contexto configuración como en http://api.jquery.com/jQuery.ajax/

    function doop(){
        var old = $(this).siblings('.old').html();
        var newValue = $(this).siblings('.new').val();
    
        $.ajax({
            url: 'doop.php',
            type: 'POST',
            context: this,
            data: 'before=' + old + '&after=' + newValue,
            success: function(resp) {
                if(resp == 1) {
                    $(this).siblings('.old').html(newValue);
                }
            }
        });
    
        return false;
    }

    «esto» va a ser la transferencia para el éxito en el alcance y la voluntad de actuar como se espera.

    • Usted realmente no debe usar palabras reservadas como new como nombres de variables.
    • De acuerdo con Nick – este es el enfoque correcto. Considere la posibilidad de que el «guardarlo en otra variable» enfoque no funcionará si usted tiene la función de «doop» llama cuando uno de varios botones de clic o algún tipo de duplicación.
    • +1 Mucho más flexible de respuesta de la seleccionada, en nuestro caso, el var tendría que ser único para cada ítem en una lista muy larga de los elementos de la adición de código de exceso, esto es, unos pocos personajes y le da mucho uso más flexible de los casos.
  3. 6

    this está enlazado con el objeto de que la ejecución de la función se aplica. Que podrían ser algunas de las respuesta de AJAX objeto o el objeto global (window), o algo más (dependiendo de la implementación de $.ajax.

    Necesito para capturar $(this) en una variable antes de entrar en el $.llamada ajax, y luego pasarla como parámetro a los us $.llamada de ajax? o tengo que pasar a la anónima éxito de la función? Si que va a resolver el problema, donde puedo pasar a la $.ajax?

    Usted realmente necesita una manera de capturar el valor de this antes de definir el success función. La creación de un cierre a la manera de hacer esto. Es necesario definir una variable independiente (por ejemplo,self):

    function doop() {
        var old = $(this).siblings('.old').html();
        var new = $(this).siblings('.new').val();
    
        var self = this;
    
        $.ajax({
            url: 'doop.php',
            type: 'POST',
            data: 'before=' + old + '&after=' + new,
            success: function(resp) {
                if(resp == 1) {
                    $(self).siblings('.old').html(new);
                }
            }
        });
    
        return false;
    }

    La success función de conservar el valor de self cuando se invoca, y debe comportarse como se espera.

    • Gracias +1. Este es el mismo como crescentfresh la respuesta de los que resuelve «parte del problema».. va a actualizar a la pregunta con más de solución de problemas.

Dejar respuesta

Please enter your comment!
Please enter your name here