2010-09-20 15 views
5

this.remove() nie jest funkcją. Dlaczego?Zmienna Zakres: this.remove nie jest funkcją

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); 

Przepraszamy za zamieszanie. Próbuję wywołać moją własną funkcję "usuń". Jest to po prostu klasa do zarządzania pojazdami na mojej stronie. To jest początek tego i będzie miał dużo więcej funkcji niż tylko init/remove.

+2

Czy chcesz wywołać metodę usuwania jQuery w celu usunięcia elementu DOM lub niestandardowego zdarzenia, które alarmuje "test"? – Harmen

Odpowiedz

0

Ponieważ powiedziałeś próbujemy nazwać swoją remove funkcji, oto jak to zrobić:

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

Działa, dzięki! – Webnet

+1

Działa bez pakowania w(), więc dlaczego to zrobić? – Webnet

+0

Czy to coś innego niż odpowiedź @ Pointy? Dlaczego warto zawijać funkcję w '()'? Jeśli po prostu przypisujesz wartość zwracaną do zmiennej, zadziała ona w dowolny sposób. – user113716

5

this jest elementem DOM. Aby skorzystać z metody jQuery: .remove(), należy zawinąć ją w obiekt jQuery.

$(this).remove(); 

EDIT: Jeśli ufaliśmy wywołać funkcję w obiekcie vehicleremove(), a następnie zadzwonić:

vehicle.remove(); 

Ponadto, jeśli ufaliśmy skrócić rozmowę .ready(), możesz to zrobić:

jQuery(vehicle.init); 

Od jQuery 1.4 release notes:

Technika jQuery().ready() nadal działa w 1.4, ale została zaniechana. Użyj albo jQuery(document).ready() lub jQuery(function(){}).

+0

Umm Nie sądzę, że to problem - chce nazwać tę funkcję "usuń" w literalnym obiekcie. – Pointy

+0

Próbuję wywołać moją własną funkcję usuwania – Webnet

+1

@Webnet - Możesz po prostu wywołać 'vehicle.remove' jeśli chcesz, lub możesz użyć odpowiedzi @ Pointy, aby zachować wartość' this' w swojej funkcji 'init', ale bez względu na to, wewnątrz obsługi zdarzenia, 'this' będzie odwoływać się do elementu DOM, który otrzymał zdarzenie. – 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

Nie sądzę, że to zadziała. – Pointy

+0

Z pewnością to nie zadziała, "self" wskazuje na funkcję init – Harmen

+1

Nie, @Harmen, "self" nie wskazuje na funkcję "init", to wskaże na "tę" wartość związaną, gdy ta funkcja jest nazywany. Problem polega na tym, że konfiguracja "gotowa" jest nadal błędna. – Pointy

2

Uwaga - wszyscy jesteśmy trochę zdezorientowani, ponieważ nie jest jasne, które „usuń” funkcję, którą chcesz się połączyć.

Problem polega na tym, że przekazujesz odwołanie do funkcji "init", ale gdy się ją nazywa, zmienna "this" będzie odnosiła się do obiektu window, a nie do wartości "vehicle". Czemu? Ponieważ w Javascript wartość "this" zależy tylko od tego, jak wywoływana jest funkcja. Fakt, że dwie funkcje są zdefiniowane w tym samym obiekcie, nie ma z tym absolutnie nic wspólnego.

Spróbuj zrobić to zamiast:

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

Po wywołaniu funkcji „init” w ten sposób — poprzez wyraźne odniesienie go jako własność „pojazd” obiekt — następnie Javascript zwiąże „to” do wartość "pojazdu".

edit oh czekać Właśnie zauważyłem, że jesteś również będzie musiał zrewidować swoją funkcję „init”, ponieważ to kod wewnątrz „kliknięcie” handler ma być wywołana przez jQuery w taki sposób, jak związać "to" w tym kontekście z elementem dotkniętym. Jeśli chcesz zachować odniesienie do "pojazdu", możesz to zrobić:

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

Pointy - Nie sądzę, że to prawda. 'vehicle' to funkcja self-execing, która zwraca obiekt, który ma właściwość' init' która jest funkcją, więc 'jQuery(). ready (vehicle.init)' przekazuje odwołanie do funkcji 'init', która ma być użyj w 'ready()'. – user113716

+1

Tak, widzę to, @patrick, ale myślę (oczywiście odgadując), że to, czego chce, to wywołanie funkcji "usuń" w tym samym obiekcie, a nie "usunięcie" jQuery. – Pointy

+1

'ten' jest związany z elementem, nie z oknem, ponieważ jest używany w funkcji, która jest używana dla detektora zdarzeń. Musiałby to zrobić w połączeniu z rozwiązaniem I.devries, aby działał. –

2

Może szukasz czegoś takiego?

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'); 
    }; 

}; 

... czy może to być może? Trudno powiedzieć, do czego zmierzasz ...

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

Dlaczego 'nowa funkcja'? – Harmen

+1

, więc "this" wewnątrz tego będzie odnosić się do obiektu skonstruowanego przez 'new'. –

+0

Nie używaj 'var foo = new function() {...};'. Użyj 'var foo = function() {...};' lub po prostu 'function foo() {...};' –

0

Podczas wywoływania funkcji jako metoda „to” odnosi się do obiektu, który jest powołując się na to. W jQuery funkcja przekazana jest wywoływana jako metoda elementu html, więc "to" staje się elementem.

Aby upewnić się, że odwołujesz się do właściwego obiektu, musisz utworzyć odniesienie do oryginalnego obiektu.

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);