Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43

    width e height di un immagine su Internet Explorer

    un codice del tipo
    codice:
    var img = new Image;
    img.src = source; 
    var width = img.width; 
    var height = img.height;
    funziona benissimo su Firefox e Chrome.
    Ma Internet Explorer ignora le ultime due assegnazioni finchè l'immagine non è stata caricata.
    Come faccio a rendere compatibile questo codice con IE, possibilmente evitando di mettere il codice nell'evento onload dell'immagine?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    devi per forza usare l' onload,
    dubito fortemente che anche gli altri browser a cache vuota siano in grado di restituirti le dimensioni di un immagine definita un millesimo di secondo prima

  3. #3
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43
    Originariamente inviato da Xinod
    devi per forza usare l' onload,
    dubito fortemente che anche gli altri browser a cache vuota siano in grado di restituirti le dimensioni di un immagine definita un millesimo di secondo prima
    Effettivamente avrò refreshato la stessa pagina centinaia di volte
    Il mio problema è che in questo caso devo richiamare due funzioni diverse all'evento onload. La versione 9 di IE supporta la funzione addEventListener?

  4. #4
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43
    Anche all'evento onload width e height rimangono impostati a zero. Non so più come fare
    Siamo sicuri che IE supporti queste due proprietà? Forse le visualizza solo dopo aver appeso l'immagine? Purtroppo adesso sto utilizzando canvas e sarebbe meglio evitare questo passaggio..

  5. #5
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    una dritta, poi approfondiamo come hai provato ad implementare la cosa tu:
    l' onload va settato prima di settare l' src dell' immagine

    non serve l' addEventListener, l' oggetto image ha da sempre un evento onload
    considera inoltre quell' oggetto image lo crei dal nulla al momento = non puo' avere precedenti onload settati che potresti inavvertitamente sovrascrivere
    codice:
    var img = new Image;
    img.onload=function(){
      qui puoi accedere a this.width e this.height
    }
    img.src='indirizzoImmagine.jpg'

  6. #6
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43
    Allora il mio problema è che ho creato la classe fixed_object (che eredita da object_2d):

    codice:
    //simula l'eredità
    if (typeof Function.prototype.inherits !== 'function') 
    {
        Function.prototype.inherits = function(superclass){
            this.prototype = superclass.prototype;
            superclass.call(this.prototype);
        };
    }
    var object_2d = function(){
        this.x = 0;
        this.y = 0;
        this.width = 0;
        this.height = 0;
    };
    var fixed_image = function(source){
        this.img = new Image;
        this.img.src = source;
        if(navigator.appName == "Microsoft Internet Explorer")
        {
            this.img.attachEvent("onload", getdimensionIE.call(this));
        }
        else
        {
            this.width = this.img.width;
            this.height = this.img.height;
        }
    };
    fixed_image.inherits(object_2d);
    var getdimensionIE = function()
    {    
        this.width = this.img.width;
        this.height = this.img.height;
    };
    Questo codice è in un file a parte (classi.js). Poi nella pagina vera e propria (prova.html) dichiaro:
    codice:
    var bar = new fixed_image("rep_bar.png");
    e vorrei che impostasse sempre le dimensioni (che mi servono per gestire delle collisioni su canvas) in maniera autonoma.
    Solo che mi serve che il codice sia espandibile. Per cui devo necessariamente utilizzare attachEvent() e addEventListener() per far sì che poi da altri script possa comunque aggiungere qualche altra cosa, in questo caso:
    codice:
    if(navigator.appName == "Microsoft Internet Explorer")
         bar.img.attachEvent("onload", function(){
              context.drawImage(bar.img,bar.x,bar.y);
         });
    else
    {
          bar.img.onload = function(){
          bg.drawImage(bar.img,bar.x,bar.y);
          };
    }
    Tralasciando il fatto che ho utilizzato il vecchio sistema per browser diversi da IE (poi anche lì farò assegnare width e height nell'evento onload).
    Forse il problema è l'assegnazione del link dell'immagine prima di aver assegnato gli eventi onload, però per come ho strutturato il programma non posso metterlo dopo aver dichiarato tutti gli eventi. Comunque sia ho fatto delle prove e vengono richiamati tutti, è per questo che penso che il problema abbia a che fare con IE.
    Ripeto il programma funziona perfettamente su Chrome e Firefox e anche su IE se non fosse per width e height.

  7. #7
    Utente di HTML.it L'avatar di Lanus
    Registrato dal
    Apr 2006
    Messaggi
    43
    Ho scoperto che IE9 supporta addEventListener() e che l'errore consisteva nel fatto che passavo la funzione utilizzando getdimensionIE.call(this), ciò non passava la funzione come parametro ma la eseguiva direttamente.
    codice:
    var tempo
    var fixed_image = function(source){
        this.img = new Image();
        this.img.src = source;
        tempo = this;
        this.img.addEventListener("load", function(){
            tempo.width = tempo.img.width;
            tempo.height = tempo.img.height;
            var text = document.createTextNode("</br>setto valori - link: "+tempo2.img.src);
            document.body.appendChild(text)
            ;}, false);
    };
    Ora funziona bene. Assegnare .src prima o dopo aver assegnato l'evento non cambia l'ordine di esecuzione degli eventi, forse perchè si tratta delle ultime versioni dei suddetti browsers o perchè si tratta di immagini piccole, ma poco male, in questo modo posso mantenere il codice estendibile senza problemi.
    Grazie per l'aiuto , javascript è veramente difficile da imparare per chi conosce solo linguaggi c-like e soprattutto per chi parte col pregiudizio che sia anch'esso c-like :P

    A questo punto però mi sorge un altro dubbio: c'è un metodo per passare una funzione come handler e allo stesso tempo passargli qualche parametro?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.