2011-07-19 17 views
13

Tengo un programa y funciona bien. Ver HERE.

Este es el código:

<div id="round"></div> 

<style> 
#round{ 
position: absolute; 
width: 200px; 
height: 200px; 
border-radius: 50%; 
left: 400px; 
top: 200px; 
background-color: #e1e1e1; 
} 
</style> 

<script src="jquery.js"></script> 
<script src="jquery.easing.1.3.js"></script> 
<script> 
$(document).ready(function(){ 
    $("#round").click(function(){ 
     setInterval(function(){ 
      $("#round").animate(
       {height: 250, 
       width: 150, 
       top:150, 
       left: 425}, 
       {duration: 300} 
       ). 
      animate(
       {height: 200, 
       width: 200, 
       top:200, 
       left: 400}, 
       {duration: 300} 
      ); 
     }, 0); 
    }); 
}); 
</script> 

Pero cuando cambio "#round" a "este". No funcionará ¿por qué? (en realidad funciona, pero cuando me los puse en setInterval(), no va a funcionar) el cambio

$(document).ready(function(){ 
    $("#round").click(function(){ 
     setInterval(function(){ 
      $("#round").animate(
       {height: 250, 
       width: 150, 
       top:150, 
       left: 425}, 
       {duration: 300} 
       ). 
      animate(
       {height: 200, 
       width: 200, 
       top:200, 
       left: 400}, 
       {duration: 300} 
      ); 
     }, 0); 
    }); 
}); 

a "este", no va a funcionar.

$(document).ready(function(){ 
    $("#round").click(function(){ 
     setInterval(function(){ 
      $(this).animate(
       {height: 250, 
       width: 150, 
       top:150, 
       left: 425}, 
       {duration: 300} 
       ). 
      animate(
       {height: 200, 
       width: 200, 
       top:200, 
       left: 400}, 
       {duration: 300} 
      ); 
     }, 0); 
    }); 
}); 
+2

Ver [Javascript _this_ gotchyas] (http://www.sitepoint.com/javascript-this-gotchas /) –

+3

[Más de lo que siempre quiso saber sobre 'esto'] (http://stackoverflow.com/questions/133973/how-does-this-keyword-work-within-a-javascript-object-literal/134149 # 134149) – andyb

+0

@andyb: Es curioso, solo estaba buscando esa publicación ... –

Respuesta

20

this es una referencia al miembro que invoca la función actual ...

continuación, se puede envolver en la función jQuery $() para seleccionarlo como lo haría con otro selector.

Así que setInterval llama a una función anónima por lo que no es invocada por un miembro referenciable, por lo que se predetermina al objeto window.

guardar el contexto this en una variable y luego lo utilizan internamente como esto ...

$(document).ready(function(){ 
    $("#round").click(function(){ 
     var clicked = this; //<----store the click context outside setInterval 
     setInterval(function(){ 
      $(clicked).animate( //<----------use it here 
       {height: 250, 
       width: 150, 
       top:150, 
       left: 425}, 
       {duration: 300} 
       ). 
      animate(
       {height: 200, 
       width: 200, 
       top:200, 
       left: 400}, 
       {duration: 300} 
      ); 
     }, 0); 
    }); 
}); 
+0

+1 básicamente la misma respuesta que la mía, ¡pero tú me ganas! – JAAulde

2

$(this) es context sensitive. Cada función [anónima, en este caso] que ingresa, cambia el valor de $(this). Por ejemplo:

$('#round').click(function(){ 
    alert($(this).attr('id')) // alerts round 
    setInterval(function(){ 
     alert($(this).attr('id')) // alerts undefined 
    }); 
}); 
+4

Para el registro, no es '$ (esto) 'específicamente, pero' this'. '$()' simplemente está envolviendo (o intentando) la referencia en un objeto jQuery. –

+0

Buena adición. Eso es importante notar. – wanovak

1

Puesto que está utilizando una función de devolución de llamada que se dispara por setInterval en un contexto diferente ...

puede manejar esta copiando 'esto' a otro ex variables:

var that = this: 

Y en la devolución de llamada

$(that).animate... 
5

Dentro de una función de evento jQuery unido, this se refiere al elemento DOM actual de la colección que está siendo operado. Como es un elemento DOM, pasarlo a jQ como $(this) lo convierte en una colección jQuery para que pueda hacer más cosas jQuery en él.

En su código modificado que no funciona, sin embargo, lo movió a una nueva función anónima. Dentro de esa función, this ahora se refiere al nuevo alcance.

que necesita para obtener una referencia a this antes de que su función:

$(document).ready(function(){ 
    $("#round").click(function(){ 
     var jQuerizedElement = $(this); 
     setInterval(function(){ 
      jQuerizedElement.animate(
       {height: 250, 
       width: 150, 
       top:150, 
       left: 425}, 
       {duration: 300} 
       ). 
      animate(
       {height: 200, 
       width: 200, 
       top:200, 
       left: 400}, 
       {duration: 300} 
      ); 
     }, 0); 
    }); 
}); 
+0

Ten en cuenta que jondavidjohn y yo hemos dado la misma solución, pero él optó por sotrar solo una referencia a 'this' en' self', mientras que yo elegí almacenar una referencia a jQuerized 'this' en' jQuerizedElement' . O está bien en este caso. – JAAulde

1

esto es básicamente contexto relacionado. Cuando dice $ (this) si se trata de un elemento dom, le dará un objeto jquery asociado con este elemento dom.

0

Si entiendo bien parece que $(this) es sólo el nodo que era triggerd.

Por ejemplo, cuando tiene un clic evento en un botón. En la devolución de llamada del evento, puede usar $ (esto) que representa el nodo del botón ...

Cuestiones relacionadas