Archief - JS: harnekkige fout in simpel scriptje

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Dr33tN

Legacy Member
Hi! Ik heb hier een simpel JavaScriptje die hardnekkig dezelfde foutmelding blijft veroorzaken. nl. 'Toegang geweigerd' regel 21 teken 2. Het is de bedoeling dat er 5 random images op het scherm getoond worden. Ik post hieronder even de code:
Code:
function init(){
	images();
}
//afbeeldingen preloaden

function images(){
	var preload = new Array('004.jpg','009.jpg','010.jpg','011.jpg','012.jpg','013.jpg','015.jpg','017.jpg','019.jpg','021.jpg','025.jpg','026.jpg','027.jpg','030.jpg','033.jpg','037.jpg','043.jpg','049.jpg','056.jpg','057.jpg','061.jpg','066.jpg','072.jpg','074.jpg','085.jpg','086.jpg','090.jpg','095.jpg');
	var loader = new Array();
	var n = 5;
	var r; 
	var a, b;
	var m = preload.length;
	for(var i = 0; i < m; i++){
		loader[i] = new Image();
		loader[i].src = 'img/'+preload[i];
	}
	
	for(var j = 0; j < n; j++){
		r= ran_img(m);
		a = loader[r].src;
		b = '<img src="'+a+'" height="65" width="100" />';
		document.write(b);
	}
}

function ran_img(maximum){
	var randomgetal=Math.floor(Math.random()*maximum+1);
	return randomgetal;
}

de functie init() wordt gewoon in de body via onload opgeroepen.

Ik heb alles al afzonderlijk in vars gestopt, in commentaar en uit commentaar gezet, alle waarden naar het scherm geschreven. Er is niks mis mee. De waarden kloppen. Als ik zonder for lus een images schrijf, dan lukt dat. Vanop het moment dat hij een tweede image wil schrijven krijg ik fouten...
ik ben zeker dat hier iemand wel raad mee weet. Alvast bedankt!

BTW: is het normaal als je via document.write(' '); html code genereert, dat alle andere geschreven HTML ook verdwijnt?

peace

servi

Legacy Member
niet echt gecontroleerd, maar wat verander eens dat wat daar in het geel staat :
for(var j = 0; j < n; j++){
var r= ran_img(m);
var a = loader[r].src;
var b = '<img src="'+a+'" height="65" width="100" />';
document.write(b);
}
Zo maak je een aparta variabele aan telkens je doorlust, anders gebruik je telkens dezelfde variabele.


BTW: is het normaal als je via document.write(' '); html code genereert, dat alle andere geschreven HTML ook verdwijnt?

ja dat is normaal, vermits je immers het document overschrijft met die nieuwe waarde. Als je niet wil dat dit gebeurt moet je gebruiken maken van de appendChild()-functie .

Dr33tN

Legacy Member
nog steeds toegang geweigerd :$
IE zegt dat het hieraan ligt:
var b = '<img src="'+a+'" height="65" width="100" />';

weird....

Lashknife

Legacy Member
servi zei:
BTW: is het normaal als je via document.write(' '); html code genereert, dat alle andere geschreven HTML ook verdwijnt?

ja dat is normaal, vermits je immers het document overschrijft met die nieuwe waarde. Als je niet wil dat dit gebeurt moet je gebruiken maken van de appendChild()-functie .
Nee dat is niet waar.

Als je iets laat schrijven terwijl het document geload wordt, dan schrijft hij dat tussen je code.

Als je document.write oproept vanuit een functie als heel je pagina al geladen is, dan pas overschrijft hij alles.

Nu, kga dat effe testen en zal direct laten weten of het ook zo is :p

Menta

Legacy Member
Laat het dan eens zien zonder de for loop, datgene wat werkt dus.
Want er zit duidelijk iets verkeerd dan in die for loop.

orez

Legacy Member
Code:
b = "<img src=\"" + a + "\" height=\"65\" width=\"100\" />";

probeer eens ? zal waarschijnlijk niet veel helpen, maar ge weet maar nooit..

servi

Legacy Member
Nee dat is niet waar.

Als je iets laat schrijven terwijl het document geload wordt, dan schrijft hij dat tussen je code.

Als je document.write oproept vanuit een functie als heel je pagina al geladen is, dan pas overschrijft hij alles.

ja maar aangezien het hier functies zijn roept hij die waarschijnlijk op met onload of iets dergelijk en in dat geval is de pagina al helemaal uitgeschreven en wordt dus die pagina overschreven als je die functie aanroept.


het geval waar het niet overschreven wordt, is is enkel als je iets als dit hebt :
<script language="javascript">
document.write("testje");
</script>

Lashknife

Legacy Member
Dreetn, ik heb uw script zonder wijzigingen eens offline gedraaid en ik krijg gewoon 5 img containers (kheb geen images natuurlijk)

zonder "access denied" error. Zit er op uw img folder een of andere security? waar je html niet aankan? (vrij belachelijk want als jij aan je image kan, dan kan html (onder jouw user id gerunt) ook eraan)

heb je al eens geprobeerd om je images en html page op een andere location te runnen? vb online? andere drive met propere nieuwe folderstructuur

Lashknife

Legacy Member
Om een lang verhaal kort te maken :D
Kheb er ineens ook een check previously shown bijgestoken, want anders zou ge wel eens 2of meer keer dezelfde image kunnen tegenkomen eh :)

Code:
<script type="text/javascript">
<!--
var imglist = new Array	("1.gif","2.gif", "3.gif", "4.gif", "5.gif", "6.gif", "7.gif", "8.gif", "9.gif", "10.gif");
var imglistlen = imglist.length;
var imgpath = "img/";

function preload() {
	var tmpsrc;
	for (var i = 0; i < imglistlen; i++) {
		tmpsrc = imglist[i];
		imglist[i] = new Image();
		imglist[i].src = imgpath + tmpsrc;
	}
}

var alreadyshown = new Array();
function in_array(val,list) {
	for (var i = 0; i < list.length; i++) {
		if (list[i] == val) {
			return true;
		}
	}
	return false;
}

function randimg() {
	var randvalue = Math.ceil(Math.random()*imglistlen);
	while (in_array(randvalue,alreadyshown)) {
		randvalue = Math.floor(Math.random()*imglistlen);
	}
	alreadyshown.push(randvalue);
	return randvalue;
}

function show(n) {
	var imgcontainer = document.getElementById("imgcontainer");
	var imgObj;
	for (var i = 0; i < n; i++) {
		imgObj = document.createElement("IMG");
		with (imgObj) {
			src = imglist[randimg()].src;
			style.width = "65px";
			style.height = "100px";
		}
		imgcontainer.appendChild(imgObj);
	}	
}

function init() {
	preload();
	show(5);
}
//-->
</script>
en dan 1 divke
Code:
<div id="imgcontainer"></div>

Dr33tN

Legacy Member
Vriendelijk bedankt voor de moeite lashknife. Het werkt. Ook bij mij offline :)
Thx !
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan