Toon posts:

[js]script src dynamisch instellen in overlay?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met het ontwikkelen van een Firefox extensie.

In deze extensie is het noodzakelijk dynamisch een javascript bestand te laden. Het probleem is alleen dat het me niet lukt om een handle naar de bewuste <script> tag te krijgen.

Het document waarin de script-tag staat is als volgt:
code:
1
2
3
4
5
6
<?xml version="1.0"?>

<overlay id="helloworldOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script type="application/x-javascript" src="foktoolsOverlay.js" />
    <script type="application/x-javascript" src="" id="functions" />
</overlay>


De bovenste script-tag laad het bestand met globale code, en van daaruit probeer ik de src van de tweede script-tag in te stellen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function selectTemplate(doc)
{
    var template=zoekTemplate(doc);
    var functions=document.getElementById('functions');
    
    switch (template)
    {
        case FOKFORUM_LIGHT:
            functions.src='fokforum_light/functions.js';
            break;
        case FOKFORUM_DARK:
            functions.src='fokforum_dark/functions.js';
            break;
        case FOKSILVER:
            functions.src='foksilver/functions.js';
            break;
        case TEXT_ONLY:
            functions.src='text_only/functions.js';
            break;
    }
}


Maar ik krijg daarbij de foutmelding dat functions geen properties heeft. Weet iemand hoe ik die script-tag moet benaderen?

Alvast bedankt.

[ Voor 19% gewijzigd door Verwijderd op 07-06-2005 12:04 ]


  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Ik weet niet echt zeker of ik snap waar je mee bezig bent, maar ik weet wel dat je in normale xhtml javascript (vaak?) elementen pas aan kunt spreken, nadat het document geladen is. Verder weet ik dat er in normale xhtmlpagina (met een head dus waarnaar dan verwezen wordt), er wel dynamisch een script kan worden toegevoegd, da's een kwestie van zoeken.

Kan zijn dat ik er helemaal naast zit, maar heb het in ieder geval geprobeerd :9

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:39

thomaske

» » » » » »

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Verwijderd

Topicstarter
Bedankt voor de reacties, maar dat zijn niet de dingen waar ik moeite mee heb.

De code wordt pas uitgevoerd na het laden van de pagina, dus dat is het probleem niet. Ik begrijp verder ook prima hoe ik zoiets moet doen in een standaard HTML/XHTML pagina.

Het probleem is alleen dat het geen normale pagina is, maar een overlay. En ik weet niet hoe ik elementen in de overlay moet aanspreken. :)

  • r0bert
  • Registratie: September 2001
  • Laatst online: 26-04 17:38
Heb je wel een <script> element met hetzelfde id in je uiteindelijke pagina opgenomen? Anders wordt je script tag uit dit document toch genegeerd? :?

[ Voor 8% gewijzigd door r0bert op 08-06-2005 12:14 ]


Verwijderd

Topicstarter
schop

  • André
  • Registratie: Maart 2002
  • Laatst online: 06-05 11:13

André

Analytics dude

Kun je niet gewoon alle 4 includen? Dan heb je ze allemaal beschikbaar :)

Verwijderd

Topicstarter
André schreef op vrijdag 10 juni 2005 @ 14:23:
Kun je niet gewoon alle 4 includen? Dan heb je ze allemaal beschikbaar :)
Dat doe ik liever niet. De bedoeling is om de functienamen in die bestanden hetzelfde te houden, dan hoef ik me na selectTemplate() niet meer druk te maken om het gebruikte template.

Als ik alle vier de bestanden zou includen, zouden functies vier keer gedeclareerd worden, ik weet niet precies wat er dan gebeurt, maar vast niet wat ik wil. ;)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:23

crisp

Devver

Pixelated

Verwijderd schreef op woensdag 08 juni 2005 @ 11:46:
De code wordt pas uitgevoerd na het laden van de pagina, dus dat is het probleem niet.
[...]
Dat is het probleem wel; na het laden kan je niet meer dynamisch externe javascripts includen; ze worden immers dan niet meer geparsed
mmz, het kan dus wel:
JavaScript:
1
2
3
4
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'testjs.js';
document.getElementsByTagName('head')[0].appendChild(s);
:)

[ Voor 23% gewijzigd door crisp op 10-06-2005 15:28 ]

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op vrijdag 10 juni 2005 @ 15:23:
[...]

Dat is het probleem wel; na het laden kan je niet meer dynamisch externe javascripts includen; ze worden immers dan niet meer geparsed (ok, in Opera 8 wel, maar dat is een bug in Opera :P )
Dus wat ik wil kan/mag uberhaupt niet? Verdulleme! :(

Dan moet ik een manier bedenken om functies aliassen aan te maken in js. Weet iemand of dat wel mogelijk is, ik zit al op google te zoeken, maar zonder veel resultaat.

Verwijderd

Topicstarter
crisp schreef op vrijdag 10 juni 2005 @ 15:23:
[...]

Dat is het probleem wel; na het laden kan je niet meer dynamisch externe javascripts includen; ze worden immers dan niet meer geparsed
mmz, het kan dus wel:
JavaScript:
1
2
3
4
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'testjs.js';
document.getElementsByTagName('head')[0].appendChild(s);
:)
Gelukkig dat dat wel kan. Maar nou zit ik nog steeds met het probleem dat ik niet bij de overlay kan komen, het originele probleem dus. Want ja:
document.getElementsByTagName('head') has no properties
En het type is natuurlijk application/x-javascript, en niet text/javascript. :)

[ Voor 11% gewijzigd door Verwijderd op 10-06-2005 15:33 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:23

crisp

Devver

Pixelated

Ik denk dat je in jouw geval 'head' gewoon moet vervangen door 'overlay' ;)
Verwijderd schreef op vrijdag 10 juni 2005 @ 15:32:
[...]
En het type is natuurlijk application/x-javascript, en niet text/javascript. :)
type is hier niet direct een synoniem voor mime-type; text/javascript is in deze context wel degelijk correct, de meeste browsers herkennen application/x-javascript niet eens in deze context.

[ Voor 75% gewijzigd door crisp op 10-06-2005 15:37 ]

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op vrijdag 10 juni 2005 @ 15:34:
Ik denk dat je in jouw geval 'head' gewoon moet vervangen door 'overlay' ;)
[...]

type is hier niet direct een synoniem voor mime-type; text/javascript is in deze context wel degelijk correct, de meeste browsers herkennen application/x-javascript niet eens in deze context.
Dat idee met head ga ik straks uitproberen (kan er nu niet bij helaas), maar ik ben bang dat dat niet werkt. Ik bedoel, als ik niet eens een element via een ID kan aanroepen (wat toch altijd de betrouwbaarste methode is), dan ben ik bang dat heel de variabele document niet bestaat.

En application/x-javascript werkt prima in elke browser hoor (behalve IE, maar dat beschouw ik niet als browser), en volgens mij was dat correcter.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:23

crisp

Devver

Pixelated

je zit hier ook in een XML-omgeving; mijn voorbeeld was voor het gemak even HTML-DOM based...
daarbij moet je ws ook createElementNS gebruiken tesamen met de juiste namespace als argument.

[ Voor 43% gewijzigd door crisp op 10-06-2005 15:50 ]

Intentionally left blank


Verwijderd

Topicstarter
Hmm, zoals ik het bedacht heb schijnt het niet mogelijk te zijn. Ik krijg namelijk met geen mogelijkheid een handle op de overlay, of enig element daarin.

Dan moet ik maar proberen om functie-aliassen aan te maken. Is dat mogelijk in javascript? Ik heb al op google gezocht, maar daar krijg ik alleen maar rotzooi.

Wat ik dus nu gewoon wil doen is bijvoorbeeld zeggen dat de functie setQuickQuote() doorlinkt naar functie ff_light_QuickQuote()

Dat zou toch mogelijk moeten zijn?

  • brokenp
  • Registratie: December 2001
  • Laatst online: 23:02
ja, dit kan dmv de volgende code (untested syntax, idee klopt wel)

code:
1
2
3
4
5
6
7
function  ff_light_QuickQuote() 
{
  //new code
};

setQuickQuoteOrig = setQuickQuote;
setQuickQuote = ff_light_QuickQuote;


Door eerst een pointer naar de oude functie op te slaan in een global var kan je deze functie nog gebruiken in je vervangende functie

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:23

crisp

Devver

Pixelated

ja:
JavaScript:
1
2
3
4
5
6
7
function foo()
{
    alert('bla');
}

var bar = foo;
bar();

Intentionally left blank

Pagina: 1