2010-09-20 18 views
5

this.remove() no es una función. ¿Cómo?Alcance variable: este.remove no es una función

var vehicle = function() { 
    return { 
     init: function() { 
      jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
       e.preventDefault(); 
       this.remove(); 
      }); 
     }, 
     remove: function() { 
      alert('test'); 
     } 
    } 
}(); 

jQuery().ready(vehicle.init); 

Disculpa las confusión. Intento llamar a mi propia función "eliminar". Esta es simplemente una clase para administrar vehículos en mi página. Este es el comienzo y tendrá muchas más funciones que solo init/remove.

+2

¿Desea llamar al método de eliminación de jQuery para eliminar un elemento DOM o su evento personalizado que alerta 'prueba'? – Harmen

Respuesta

0

ya que dijo que está tratando de llamar a su propia función remove, aquí está cómo hacerlo:

var vehicle = (function() { 
    return { 
     init: function() { 
      var that = this; // step one 
      jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
       e.preventDefault(); 
       that.remove(); 
      }); 
     }, 
     remove: function() { 
      alert('test'); 
     } 
    } 
}()); // step zero - wrap the immediate invocation in parens 

jQuery(function() { 
    vehicle.init(); // step two 
); 
+0

¡Funciona, gracias! – Webnet

+1

Funciona sin envolverse en() entonces ¿por qué hacer eso? – Webnet

+0

¿Es esto diferente de la respuesta de @ Pointy? Además, ¿por qué ajustar la función en '()'? Si solo está asignando el valor de retorno a una variable, funcionará de cualquier manera. – user113716

5

this es un elemento DOM. Para usar el método .remove() de jQuery, debe envolverlo en un objeto jQuery.

$(this).remove(); 

EDIT: Si usted estaba esperando para llamar a la función remove() en el objeto vehicle, a continuación, llamar:

vehicle.remove(); 

Además, si usted estaba esperando para acortar su llamada .ready(), usted puede hacer esto:

jQuery(vehicle.init); 

Desde el jQuery 1.4 release notes:

La técnica jQuery().ready() todavía funciona en 1.4 pero ya no se utiliza. Utilice jQuery(document).ready() o jQuery(function(){}).

+0

Umm No creo que ese sea el problema: quiere llamar a esa función "eliminar" en el objeto literal allí. – Pointy

+0

estoy tratando de llamar a mi propia función Remove – Webnet

+1

@Webnet - Sólo puede llamar 'vehicle.remove' si lo desea, o puede utilizar la respuesta de @ puntiagudo para retener el valor de' 'this' en su función init', pero no importa qué, dentro del controlador de eventos, 'this' hará referencia al elemento DOM que recibió el evento. – user113716

0
var vehicle = function() { 
    return { 
     init: function() { 
      var self = this; 
      jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
       e.preventDefault(); 
       self.remove(); 
      }); 
     }, 
     remove: function() { 
      alert('test'); 
     } 
    } 
}(); 

jQuery().ready(function() { 
    vehicle.init(); 
}); 
+0

No creo que eso funcione. – Pointy

+0

Sin duda, esto no va a funcionar, 'puntos self' a la función init – Harmen

+1

No, @Harmen, "auto" no apuntar a la función "init", que va a apuntar al "este" valor obligado cuando esa función se llama. El problema aquí es que la configuración "lista" sigue siendo incorrecta. – Pointy

2

Nota - estamos todos un poco confundido porque no es claro qué "eliminar" la función que desea llamar.

El problema es que está pasando en la referencia a la función "init", pero cuando se llama "esta" variable se referirá al objeto ventana, no al valor de "vehículo". ¿Por qué? Porque en Javascript, el valor "this" depende únicamente de cómo se llama una función. El hecho de que dos funciones estén definidas en el mismo objeto no tiene absolutamente nada que ver con eso.

trate de hacer esto en su lugar:

jQuery(function() { 
    vehicle.init(); 
}); 

Cuando se llama a la función "init" de esa manera — haciendo referencia explícitamente como una propiedad del "vehículo" objeto — continuación Javascript se unirán "esto" a la valor de "vehículo".

edición esperar oh Sólo se dio cuenta de que eres también va a tener que revisar su función "init", debido a que el código dentro de la "clic" manipulador va a ser llamado por jQuery de tal manera como unir "esto" en ese contexto al elemento afectado. Por lo tanto, si desea mantener el "vehículo" de referencia en todo, que haría esto:

init: function() { 
     var originalThis = this; 
     jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
      e.preventDefault(); 
      originalThis.remove(); 
     }); 
    }, 
+0

puntiaguda: no creo que sea correcto. 'Vehicle' es una función de auto ejecución que devuelve un objeto que tiene una propiedad' init' que es una función, por lo que 'jQuery() listo (vehicle.init);.' Se pasa una referencia a la 'función init' sea usar en 'listo()'. – user113716

+1

Sí veo que, @patrick, pero creo que (adivinando por supuesto) que lo que quiere es llamar a que "retire" la función en ese mismo objeto, no el jQuery "eliminar". – Pointy

+1

'this' está vinculado al elemento, no a la ventana, porque se usa dentro de una función que se usa para un detector de eventos. Tendría que hacer una combinación de esta y la solución I.devries para que funcione. –

2

Tal vez usted está buscando algo como esto?

var vehicle = new function() { 

    var self = this; 

    this.init = function() { 
    jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
     e.preventDefault(); 
     self.remove(); 
    }); 
    }; 

    this.remove = function() { 
    alert('test'); 
    }; 

}; 

... o como esto tal vez? Es un poco difícil decir para qué vas ...

var vehicle = new function() { 

    function remove() { 
    alert('test'); 
    } 

    this.init = function() { 
    jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
     e.preventDefault(); 
     remove.call(this); 
    }); 
    }; 

}; 
+0

¿Por qué 'nueva función'? – Harmen

+1

por lo que el 'esto' dentro de él se referirá al objeto construido por 'nuevo'. –

+0

No use 'var foo = new function() {...};'. Use 'var foo = function() {...};' o simplemente 'function foo() {...};' –

0

Cuando se invoca una función como un método "este" se refiere al objeto que es invocándolo. En jQuery, la función pasada se invoca como un método del elemento html, por lo que "this" se convierte en el elemento.

Para asegurarse de que usted se refiere al objeto correcto que necesita para crear una referencia al objeto original.

var vehicle = function() { 
     var that = { 
     init: function() { 
      jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
       e.preventDefault(); 
       that.remove(); 
      }); 
     }, 
     remove: function() { 
      alert('test'); 
     } 
    } 
    return that; 
    }(); 

jQuery().ready(vehicle.init); 
Cuestiones relacionadas