[JS] function onload image

Pagina: 1
Acties:

  • ingmdijkstra
  • Registratie: November 2005
  • Laatst online: 14-09-2023
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function imgerror(evt){
  this.src = '**other location of image**';
}
function imgload()
{
  //??waarschijnlijk is hier this ook van het object window
  if (this.src)
  {
    if (this.src=='**location of imag**')  
    {
        //laat een ander plaatje in
        this.src='**other location of image**';
    }  
    else {
        //hang plaatje aan document
        document.append(this);
    }
  }
  else {//als het safari is
     imgb = new Image();
     imgb.onerror = _void;
     imgb.onload=imgbload;
     imgb.src='**other location of image**';
  }
}
function imgbload() {
  //???? HIER IS this van het object window
  document.append(this);
} 
function _void(evt){
  return;
}
var imga = new Image();
imga.onerror = imgerror;
imga.onload = imgload;
imga.src = '**location of imag**';


Mijn probleem is dat this niet het object image is maar in een keer de window document in safari.
Kan iemand mij helpen met het probleem dat this niet van obj Image is en hoe ik dan eventueel wel er achter kan komen door welk obj de function onload wordt aangeroepen?

[ Voor 5% gewijzigd door NMe op 07-04-2006 13:29 . Reden: Code tags toegevoegd. Volgende keer zelf doen graag. :) ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

heb ik net zo'n mooie javascript highlighter gemaakt :/

anyway, dit is inderdaad een bekende bug in safari; ik zal eens kijken of ik nog een linkje kan vinden

edit: found: http://www.sitepoint.com/.../31/is-this-a-safari-bug/

[ Voor 20% gewijzigd door crisp op 07-04-2006 13:25 ]

Intentionally left blank


  • ingmdijkstra
  • Registratie: November 2005
  • Laatst online: 14-09-2023
Uhm sorry kon highlighter nog niet vinden maar dat kan aan mij liggen.
Kwam pas achter het probleem nadat ik er achter kwam dat het plaatje nog moest appende.
Dit wil zeggen dat
'if (this.src)'
een toevallige workaround is voor safari nog niet wetend dat dit this dan al een window obj is.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Lezen is erg moeilijk. ;) Waar hoort mijn topic?

PRG>>WEB

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ingmdijkstra schreef op vrijdag 07 april 2006 @ 13:27:
Uhm sorry kon highlighter nog niet vinden maar dat kan aan mij liggen.
Kwam pas achter het probleem nadat ik er achter kwam dat het plaatje nog moest appende.
Dit wil zeggen dat
'if (this.src)'
een toevallige workaround is voor safari nog niet wetend dat dit this dan al een window obj is.
tsja, je zou ook
JavaScript:
1
if (this == window) { alert('stomme browsert!'); }
kunnen doen, maar voorkomen is natuurlijk beter dan genezen.
De enige workaround die ik zo kan bedenken is gebruik maken van een closure (zoals in het eerder genoemde artikel ook wordt gedaan).

Intentionally left blank


  • ingmdijkstra
  • Registratie: November 2005
  • Laatst online: 14-09-2023
Ik mis misschien even je punt -NMe-.

Even iets anders hier een aanvulling op de info over this.

Het werkt bij mij niet als ik de functie los laat staan.
Dus img.onload = imgonload;
function imgonload(){alert(this)}

ga nu proberen als ik het gewoon direct als functie er aan hang.
img.onload = function (){alert(this)}

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

NMe wijst je op het feit dat je je vraag in het verkeerde forum had gepost (dat was mij even ontgaan).

Anyway, 'this' is een speciaal keyword; voor een closure kan je zoiets doen:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
var img = new Image();
attachOnloadHandler(img, imgload);
img.src = 'file.gif';

function attachOnloadHandler(obj, handler)
{
    obj.onload = function() { handler.apply(obj); }
}

function imgload()
{
    alert(this.src);
}

Intentionally left blank


  • ingmdijkstra
  • Registratie: November 2005
  • Laatst online: 14-09-2023
Sorry zag dat ik inderdaad in de verkeerde forum zat te posten

Ik heb nog niet de hierboven genoemde methode geimplementeerd maar wel de function() {} gebruikt nu geeft safari wel aan dat imgb een image object is.
Het probleem is nu dat deze niet gekoppeld wordt aan het document dmv appendChild.
Eigenlijk gooi ik het een aan href die ik met document.write eerder opgezet heb.

javascript:
JavaScript:
1
2
3
4
5
6
document.write('<a id="idlink" href="linkje">hreftext</a>')

imgb.onload=function () { 
  link = document.getElementById('idlink');
  link.appendChild(imgb)
}  


Helaas werkt dit niet. Weet zelf niet waarom ga nu de bovenstaande function even proberen.
Begrijp alleen niet waar apply vandaan komt.

Iets anders tussen door als dit mag?
Ik ben opzoek naar een goede js editor met code completion en als het mogelijk is debugger.

[ Voor 5% gewijzigd door ingmdijkstra op 07-04-2006 14:54 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je image is een javascript image object, geen HTML image element. Je kan die dus niet mbv appendChild toevoegen. Je zal dan zoiets moeten doen:

JavaScript:
1
2
3
4
5
6
7
8
9
imgb = new Image();
imgb.onload = function()
{
  var link = document.getElementById('idlink');
  var img = document.createElement('img');
  img.src = this.src;
  link.appendChild(img);
}
imgb.src = 'foo.gif';


apply is overigens een method waarmee je een functie in de context van een bepaald object kan uitvoeren.

[ Voor 13% gewijzigd door crisp op 07-04-2006 15:17 ]

Intentionally left blank


  • ingmdijkstra
  • Registratie: November 2005
  • Laatst online: 14-09-2023
Ik heb het even zo gedaan nu nog even testen maar hoor graag jullie mening

JavaScript:
1
2
3
4
5
6
document.write('<a id="idlink" href="linkje">hreftext</a>')
imgb = document.createElement('img'); 
imgb.onload=function () { 
  link = document.getElementById('idlink');
  link.appendChild(imgb)
}

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ja, dat werkt, maar echt netjes is het niet.
Waarom gebruik je document.write om je link aan te maken?
En wat is het uiteindelijke doel van deze hele constructie?

Intentionally left blank


  • ingmdijkstra
  • Registratie: November 2005
  • Laatst online: 14-09-2023
Probeer een flipover te maken deze mag pas linken als deze klaar is alleen onder bepaalde omstandigheden mag deze niet linken.
Ben wel omslachtig bezig ik weet het maar ja eerst maken en dan aanpassen. Probeer ook op dom 0 te blijven met alle functies zodat het browser compatible is.
Dit is een kern van een klein onderdeeltje.
Zal dit eerst moeten opschonen.

Kwam dus het foutje tegen met this.src en heb toen niet gezien dat dit een window obj is vandaar dat het een beetje mis loopt allemaal.
Pagina: 1