[js] Abortowanie pobierania obrazu

0

Mój skrypt pobiera obraz za pomocą JS-owego obiektu Image().

function Obj = {
    return{
        var obraz=null;
        function pobierz(){
            //stworzenie obiektu Image jako zmiennej obraz i wstawienie adresu obrazka do atrybutu src
        }
        function abortuj(){
            this.obraz.src=null;
            this.obraz=null;
        }
    }

var img=new Obj();
img.pobierz();
img.abortuj();

F-cja abortuj ma za zadanie zatrzymać ładowanie obrazka. Tak się jednak nie dzieje.

Postanowiłem sprawdzić co się stanie jeśli przesunę instrukcje z owej funkcji do funkcji pobierz(). O dziwo, wszystko ładnie śmiga. Obraz jest natychmiast abortowany.

Jednak aby skrypt miał sens instrukcja abortu musi być w innej f-cji. Co więc robię źle, że f-cja się nie wykonuje?

PS. Dla sprawdzenia wpisałem w abortuj() instrukcję alert() - została ładnie wyświetlona. Tak więc problem nie w literówkach.

0

korzystasz z takich zaciemniających konstrukcji językowych a nie potrafisz debugować swoich skryptów?
poza tym nie ma takiego słowa jak "abortować"

0

google nie gryzie, nie pluje, nie wrzeszczy.. google Cię kocha.
http://stackoverflow.com/questions/930237/javascript-cancel-stop-image-requests

0

Dzieki za odpowiedzi.

Po pierwsze podany przez Ciebie link prowadzi do dyskusji o pobieraniu obrazów AJAX-em i doradza zastopowanie wszystkich działań w kodzie (ja chcę mieć możliwość zrobienia jeszcze czegos, poza tym jednoczesnie w tle zachodzą inne procesy, których nie chce zatrzymywać).

Po drugie przepraszam bo wprowadziłem Was w błąd. Za dużo wyrzucilem z kodu zanim go tu wrzuciłem.
Tak jak jest wyżej dziala bez zarzutu.

Problem pojawia się kiedy pobieram obrazy za pomocą pętli for() - wówczas zapisuję wszystkie utworzone objekty do tablicy (powiedzmy table[]) a nastepnie za pomocą innej for() chcę zaabortowac wszystkie obrazy poprzez wywołanie dla wszystkich instancji tego objektu:

for(var licznik=0; licznik <= table.length-1; licznik++){
    table[licznik].abortuj();
}

W takim wypadku obrazy pobierają sie dalej.

0

Spotkałem się z tym, że ludzie mieli problemy z ANULOWANIEM (nie żadnym "abortowaniem") pobierania obrazków. Czego by nie robili, nie działało to we wszystkich ważnych przeglądarkach.

Nie spotkałem się natomiast z takim problemem, by działało to dla pojedynczych obrazków, a nie dla zestawu obrazków w tablicy. A może nadal troszkę tutaj oszukujesz, próbując coś uprościć? Upraszczanie problemu do niezbędnego minimum jest dobre, ale to niezbędne minimum musi zostać zachowane.

No bo z tego co piszesz wynika, że jakbyś miał zmienną obrazek i na niej wykonał funkcję abortuj() (proszę, zmień jej nazwę...), to by to zadziałało. A gdybyś miał tablicę o nazwie obrazki i w pętli for na nich wykonał metodę abortuj(), to już by nie zadziałało. A co jeśli miałbyś nie tablicę, tylko np. kilka zmiennych postaci obrazek1, obrazek2, obrazek3 itd.? Na nich wywołanie abortuj() zadziałałoby, czy co?

Informacje w Twoim pierwszym poście -- że abortuj musi być w innej funkcji -- sugerować mogą jakieś problemy np. z domknięciami. Niestety, z kodu tyle wyciąłeś i tak go poprzestawiałeś, że nie ma on najmniejszego sensu. Jest pełno błędów kompilacji, to nie jest poprawny składniowo JavaScript.

Mogę zgadywać, że np. zastosowałeś tam wzorzec zwany z angielskiego revealing module pattern. I wygląda to jakoś tak:

function EnhancedImage(filename) {
  var image;
...
  function download() {
    ...
  }

  function abort() {
    this.image.src = null; // zignorujmy na chwilę oczywiste błędy w tej i następnej linii
    this.image = null;
  }
...

  return {
    abort: abort,
    download: download
  };
}

W wersji kodu wklejonej i edytowanej przez Ciebie tutaj masz jakąś pokraczną, nieistniejącą konstrukcję łączącą instrukcje funkcji z intrukcją return zwracającą niby-obiekt.

W tym kodzie masz pełno oczywistych błędów (powstałych zapewne przy wklejaniu i obróbce kodu tu na forum), ale nawet jeśli się zignoruje się te błędy to i tak widać kilka niebezpieczeństw. Po pierwsze, w funkcjach prywatnych, takich jak abort i download powyżej, this nie działa. Po drugie, jeśli chcesz się dostać do zmiennej prywatnej, takiej jak image powyżej, to NIE powinieneś w ogóle używać this.

Faktycznie, może być to powód, dla którego nie działa Ci to gdy masz kilka obiektów Twoich "ulepszonych" obrazków. this wewnątrz metod prywatnych wskazuje na obiekt window, a nie na konkretny obiekt Twojego ulepszonego obrazka (czyli de facto this nie działa). Jeśli najpierw, np. w konstruktorze, zapisałeś coś do this.obrazek, to tak naprawdę odwołałeś się do window.obrazek. Ponieważ window to w przeglądarkowych implementacjach JavaScriptu obiekt globalny, tak naprawdę utworzyłeś właśnie zmienną globalną o nazwie obrazek. JEDNĄ zmienną globalną. Potem wszystkie następne konkretne obiekty będące instancjami Twojej klasy odwołują się do tego jednego pola window.obrazek, czy po prostu zmiennej globalnej obrazek. Dlatego kilka obiektów nie działa, a jeden działa.

W razie czego możesz wkleić tutaj całość Twojej klasy -- chyba nie nazywa się Obj ;) (mam taką cholerną nadzieję!). Zostaw wszystko tak jak jest, kopiuj/wklej, i wywal tylko nieistotne metody. Zostaw inicjalizację obrazka, ścieżki do obrazka itd. I nie przemieszczaj całych kawałków kodu jak w pierwszym poście, bo albo trzeba to zrobić ostrożnie i starannie, albo wychodzi takie masło maślane.

Na razie powróżyłem z fusów, tj. z niepełnego opisu i kodu, który był tak silnie edytowany (wiem, że chciałeś dobrze...), że niemal stracił sens jeśli chodzi o debugowanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1