[JS/AJAX] innerHTML met script(s) er in
Fijne dagen iedereen alvast :)
To the point: Ik haal met AJAX stukken pagina op, die weergegeven worden als een 'nieuw venster'. De achtergrond krijgt een semitransparante zwarte overlay en daarbovenop wordt een witte tabel met randjes en data getoond. Deze nieuwe vensters kunnen wel 3 niveaus diep gaan. Elke keer komt er een overlay en een nieuw venster bovenop. De eigenaar pagina (de pagina die in de adresbalk staat dus) heeft maar een aantal scripts geladen, de standaard scripts. Omdat er soms wel 20 varianten van nieuwe vensters door ajax mogelijk zijn, kan ik de eigenaarpagina onmogelijk ALLE scripts voor die varianten laten laden (het kan natuurlijk wel, maar is enorme overload). Dus het liefst zou ik met Ajax de pagina + het benodigde (optionele) script voor die pagina ophalen ('die pagina' is dus zo'n 'nieuw venster').
Maar Ajax en JS hebben het zo afgesproken dat je geen <script>s kan laden met innerHTML setten... Ofzo. Dus als ik een pagina laad, waar <script>s in staan, en ik gooi m in zo'n overlay, heeft dat nieuwe venster geen enkel script geladen.
Ik heb ooit een manier gezien waarop dat wel gebeurde, waarschijnlijk met een zelf gefabriceerde setInnerHtml (oid) functie, die de script tags eruit haalde en op een andere manier (???) in de pagina laadde.
Heeft iemand er ervaring mee en een oplossing? Of kan iemand me in de goede richting schoppen? Heb het voor nu (ik hoop tijdelijk) opgelost met de scripts laden in de eigenaarpagina, maar daar staat nu dus een ENORME plakaat scripts (waarvan er veel niet nodig zijn :().
Enorm bedankt!
tv
Edit:
Ik heb de volgende functie gemaakt (js inladen nadat de pagina is geladen kan trouwens wel):
Maar (natuurlijk) IE is het er niet mee eens... Runtime error in de laatste 3 gecommente lines. Je mag blijkbaar de INNERHTML niet setten als je het object zelf gemaakt hebt... Ofzoiets. JS die met SRC opgeroepen wordt, werkt wel, dus zo moet ik het voorlopig dan maar doen: ontelbaar veel kleine js bestandjes maken en laden.
Weet iemand hoe het wel kan met het script zelf, ipv de SRC te laden?? In FF werkt het wel gewoon perfect! Dank
Code (php)
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
37
38
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
37
38
function setInnerHTML(o,h) {
//alert((window.opera || navigator.product == 'Gecko'));
var regex = /^([\s\S]*?)<script([\s\S]*?)>([\s\S]*?)<\/script>([\s\S]*)$/i;
var regex_src = /src=["'](.*?)["']/i;
var matches, id, script, output = '', subject = h;
var scripts = [];
while (true) {
matches = regex.exec(subject);
if ( !matches || !matches[0] ) {
break;
}
subject = subject.replace(/(<script([\s\S]*?)>([\s\S]*?)<\/script>)/, '');
var src_match = regex_src.exec(matches[2]);
var src = null;
if ( src_match && src_match[0] ) {
src = src_match[1];
}
scripts.push([ matches[3], src ]);
}
var i = scripts.length, head = document.getElementsByTagName('head')[0];
while ( i-- ) {
var s = document.createElement('script');
s.setAttribute( 'type', 'text/javascript' );
// If 'src' attribute
if ( scripts[i][1] ) {
s.setAttribute( 'src', scripts[i][1] );
}
var id = 'ih_' + Math.round(Math.random()*9999) + '_' + Math.round(Math.random()*9999);
s.setAttribute( 'id', id );
head.appendChild(s);
// If contents
// if ( scripts[i][0] ) {
// document.getElementById(id).innerHTML = scripts[i][0];
// }
}
o.innerHTML = subject;
return o;
}
//alert((window.opera || navigator.product == 'Gecko'));
var regex = /^([\s\S]*?)<script([\s\S]*?)>([\s\S]*?)<\/script>([\s\S]*)$/i;
var regex_src = /src=["'](.*?)["']/i;
var matches, id, script, output = '', subject = h;
var scripts = [];
while (true) {
matches = regex.exec(subject);
if ( !matches || !matches[0] ) {
break;
}
subject = subject.replace(/(<script([\s\S]*?)>([\s\S]*?)<\/script>)/, '');
var src_match = regex_src.exec(matches[2]);
var src = null;
if ( src_match && src_match[0] ) {
src = src_match[1];
}
scripts.push([ matches[3], src ]);
}
var i = scripts.length, head = document.getElementsByTagName('head')[0];
while ( i-- ) {
var s = document.createElement('script');
s.setAttribute( 'type', 'text/javascript' );
// If 'src' attribute
if ( scripts[i][1] ) {
s.setAttribute( 'src', scripts[i][1] );
}
var id = 'ih_' + Math.round(Math.random()*9999) + '_' + Math.round(Math.random()*9999);
s.setAttribute( 'id', id );
head.appendChild(s);
// If contents
// if ( scripts[i][0] ) {
// document.getElementById(id).innerHTML = scripts[i][0];
// }
}
o.innerHTML = subject;
return o;
}
Maar (natuurlijk) IE is het er niet mee eens... Runtime error in de laatste 3 gecommente lines. Je mag blijkbaar de INNERHTML niet setten als je het object zelf gemaakt hebt... Ofzoiets. JS die met SRC opgeroepen wordt, werkt wel, dus zo moet ik het voorlopig dan maar doen: ontelbaar veel kleine js bestandjes maken en laden.
Weet iemand hoe het wel kan met het script zelf, ipv de SRC te laden?? In FF werkt het wel gewoon perfect! Dank
Gewijzigd op 01/01/1970 01:00:00 door Rudie dirkx
Maar als jij je content ophaalt d.m.v. ajax, dan kun je toch gewoon zeggen:
<a href="javascript:openPagina('pagina.html');">
En de functie openPagina() zorgt er dan voor dat er een overlay over de pagina heen komt, met daarin jouw door ajax opgehaalde content. Dit kun je dan blijven herhalen, doordat de functie "openpagina" pagina onafhankelijk is.
Is het dan niet het simpelst om gewoon namen van de JS scripts die je nodig hebt in de url te zetten van de hoofdpagina? Dan kun je op de betreffende subpagina's de goeie scripts laden via GET.