Problemen met for loop

Status
Niet open voor verdere reacties.

jefuri

Nieuwe gebruiker
Lid geworden
27 nov 2009
Berichten
3
Ik probeer door middel van een for loop een functie meerdere malen aan te roepen. De functie voeg_toe zit extern buiten de website om en voegt een item toe aan een soort van winkelmandje. Dus met de functie hieronder kan ik in 1 keer bijvoorbeeld een hele categorie aan producten toevoegen.

Het werkt op zich maar alleen als ik window.alert() er bij zet waardoor ik eerst op ok druk en dan de volgende weer wordt toegevoegt, etc. Anders voegt hij alleen de laatste toe. Kan iemand me in de goede richting stureen, heb ook al met timeout lopen proberen te spelen, maar lukt het ook niet echt.

hieronder werkt:

Code:
<script type="text/javascript">

	function callMultiple(title, id)
	{
	var n=0;
	  for (i in title)
		{
		   voeg_toe(title[i],id[i],id[i]+\'.pdf\',\'magazine\',\'\',\'\');
		   window.alert(\'test\');
		}
	}
	
</script>




Dit niet:

Code:
<script type="text/javascript">

	function callMultiple(title, id)
	{
	var n=0;
	  for (i in title)
		{
		   voeg_toe(title[i],id[i],id[i]+\'.pdf\',\'magazine\',\'\',\'\');
		}
	}
	
</script>


dit is voeg_toe:
Code:
function voeg_toe(var1,var3,var4,var5,var6,var7) {
    if(!window.color){
        var color='FF0000'
    }
    
    var vars = "&var1=" + var1 + "&var2=" + portal + "&var3=" + var3 + "&var4=" + var4 + "&var5=" + var5 + "&var6=" + var6 + "&var7=%20" + var7.toLowerCase() + "&portal=" + brokenstring[2] + "&trl_id=" + o_id + kleurtje;
    document.getElementById("ajax").src="http://www.iets.nl/aha/ep_code-cm_order-WEBID-1745-portalcode-"+portal + vars ;
    // iframe maken
}
 
Laatst bewerkt:
[JS] voeg_toe(title,id,id+\'.pdf\',\'magazine\',\'\',\'\');[/JS]
wauw... maak er eens dit van?[JS]
voeg_toe(title,
id,
id + '.pdf',
'magazine',
'',
'');[/JS]een stuk leesbaarder! Bovendien is het niet nuttig om e quotes te escapen... je zit namelijk helemaal niet IN een andere quote.



Mijn vermoedens waarom het niet werkt: je zit te klooien met dat ajax ding. Nu weet ik niet precies wat en hoe dit allemaal zit bij jou, maar het komt hier op neer: als je TE SNEL een request maakt als ie nog bezig is met requesten, dan 'overschijf' je het request, zegmaar. Kortgezegd: de oude (die nog bezig is met laden) wordt overschreven door je nieuwe.

Omdat je een alert plaatst, stopt het script op dat punt. Daardoor gaat het request goed, en als je de popup wegklikt, maakt ie een nieuwe, etcetera.

ik zou eens even wat goochelen op asynchrone ajax; dan kan je een... errr, wat handigere functie schrijven. Zoiets:
[JS]function voeg_toe(.. ... ... ...)
{
var file = ?... + &... + &... + &...;
var req = new HttpRequestDing(file, callback);
}

function callback()
{
//doe iets... of niet natuurlijk
}[/JS]
 
Krijg het niet aan de praat met die ajax ding. Als ik het op zoek op internet hebben ze het over requests doen naar de server en daar gaat het mij helemaal niet om. Zo het kunnen werken met een setInterval of setTimeout?

heb nu zoiets:

Code:
{
	  
	  var pdf = \'.pdf\';
	  var magazine = \'magazine\';
	  var empty = \'\';
	  for (i in title)
		{
			var ids = id[i];
			var titles = title[i];
		   	var t=window.setInterval(function(){voeg_toe(titles,ids,ids+pdf,magazine,empty,empty);}, 5000);	
		}
	}

werkt alleen nog steeds hetzelfde. Begin nu echt langzaam kaal te worden van het trekken aan me haren. Hoop dat iemand me kan helpen!
 
Heb je wel gelezen wat ik heb geschreven? Ten eerste, de quotes. Onhandig, en grote kans dat het niet werkt. Daarnaast, als je je interval opslaat in een variabele, wordt deze daana alsnog weer overschreven.

Nu, ga eens rustig en duidelijk uitleggen WAT precies WAAR iets doet. Waar zijn er nou AJAX requests voor nodig? Wat doet de voeg_toe() precies? Waarom kan je het niet in een normale loop (zonder timeout) aanroepen?

Meer relevante code gaat ook helpen.



:thumb:
 
Zal nog is alles posten zoals het is:
je kan de website zien op adverteren.pressofoon.nl/producten.php


in de rechter kolom zit het volgende:

Code:
<div class="mediaplannercontent">
			<div style="background-image:url(../images/cmag-leeg.png);border-left:1px solid #CFCFCF; padding:0px; margin:0px;">
				<script language="javascript">
				var portal = 1400;
				var color  = "FFFFFF";
				</script>
				<script src="http://www.cmagazine.nl/script/cm_order_cookie_test.js">
				</script>
			</div>
		</div>
dit plaatst een soort winkelmandje waarin dus artikelen van een tijdschrift komen.
Dit gebeurt normaal per artikel met de voegtoe functie, dit werkt ook.

Nu willen we per categorie groep alle artikelen/producten in 1x toevoegen aan dat 'winkelmandje'.

Code:
<a href='javascript:callMultiple(Array("Alles over Huisbouwen & Renovatie", "Alles over Slaapkamers", "Alles over Haarden & Kachels", "Alles over Woonklimaat", "Alles over  Vloeren", "Alles over Keukens", "Alles over Tuinen, Serres & Zwembaden", "Alles over Badkamers"), Array("331660", "331661", "331662", "331524", "311219", "315387", "314989", "331523"))'>

had ik dus bedacht om 2 arrays te maken waarin alle waardes staan die nodig zijn, de titels en id's.

Code:
function callMultiple(title, id)
	{
	  var pdf = '.pdf';
	  var magazine = 'magazine';
	  var empty = '';
	  for (i in title)
		{
		   	voeg_toe(title[i],id[i],id[i]+pdf,magazine,empty,empty);	
		}
	}

heb ik dus hierboven een eigen functie gemaakt waarin de arrays afgelopen worden en de voegtoe functie wordt aangeroepen.

Code:
var params = '';
function voeg_toe(oo_title,oo_obj,oo_obj_name,oo_type,oo_advspot,oo_keyword, arrayvar){
    oo_title=oo_title.replace(/\&/,"qqqqq"); // replace & with qqqqq
    oo_title=oo_title.replace(/\?/,"ttttt"); // replace & with ttttt
    params=oo_title+'|'+oo_obj+'|'+oo_obj_name+'|'+oo_type+'|'+oo_advspot+'|'+oo_keyword+',';
	document.getElementById("JD65vdqzyp6Bzvif").src="http://www.cmagazine.nl/script/cm_display.php5?color="+color+"&portal="+portal+"&params="+params;
}

hierboven staat de voegtoe functie. Deze roept dus een pagina aan (cm_display.php5) zie hieronder.

Code:
<?php
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"');
include_once "cm_functies.php5"; 

$params      = $_REQUEST['params']; 
$color       = $_REQUEST['color']; 
$portal      = intval($_REQUEST['portal']);
$ordernummer = $_REQUEST['ordernummer'];
$arr         = parse_url($_SERVER['HTTP_REFERER']);
$url         = $arr['scheme'].'___'.$arr['host']; //  http://www.domeinnaam.nl            url zonder /cmagazine

if(empty($ordernummer) && empty($params)){  // nieuwe bezoeker nog geen bestelling
    $no_order="http://www.cmagazine.nl/script/cm_no_prod.php5?url=$url&color=$color";
    header("Location: $no_order");
    exit;
}

// als nodig is creer cookie en stuur naar cm_prod.php5
echo"
<script type='text/javascript' src='http://www.cmagazine.nl/script/cm_cookie_functies.js'></script>
<script type='text/javascript'>
var params ='';
// kleur portal ordernummer url en evt bestelling ophalen
params = '$params'; // oo_title oo_obj oo_obj_name oo_type oo_advspot oo_keyword = bestelling
                    // Naar binnen naar buiten: de garagedeur!|317|317.pdf|magazine||wonen garagedeur garagedeuren

ordernummer = '$ordernummer'
portal      = $portal
color       = '$color'
url         = '$url'
check       = 0

if( !readCookie('ordernummer')){                     // bestelling geen ordernummer cookie -> dus creer ordernummer en voeg toe
    utc = ordernumber()
    ordernummer  = portal
    ordernummer += '_'
    ordernummer += color + '_'
    ordernummer += utc
    ordernummer += '.ord';
    if(checkcookie())
        createCookie('ordernummer', ordernummer, '');
}
else{    
  check=1;
}
location = 'http://www.cmagazine.nl/script/cm_prod.php5?check='+check+'&color='+color+'&portal='+portal+'&params='+params+'&ordernummer='+ordernummer+'&url='+url
</script>";
exit;
?>

ik hoop dat dit genoeg info is, voor de zekerheid ook nog cm_prod.php5 hieronder geplaatst:

Code:
<?php
/* prod.php5
 * toon orderregels
 * en geef mogelijkheid tot bestellen/verwijderen van artikelen 
 * check:   -1 = verwijderen, 0 = bestelling maar nog geen ordernummer, 1 = bestelling + ordernummer
 */
$MAX_AANTAL_ARTIKELEN = 12; // maximaal aantal artikelen dat je kan selecteren -> ook wijzigen in: cm_opslaan.php5 en cm_pakket_add.php5
$dir = '/www/hosts/www.cmagazine.nl/html/generator/cookies/'; // met slash
include_once "cm_functies.php5"; 

$params      = $_REQUEST['params']; 
$color       = $_REQUEST['color']; 
$url         = $_REQUEST['url'];
$check       = $_REQUEST['check'];
$oo_obj_name = $_REQUEST['oo_obj_name'];
$ordernummer = $_REQUEST['ordernummer'];
$portal      = intval($_REQUEST['portal']);
$f_url       = $url; // http___domain name
$url         = str_replace('___', '://', $url);// search replace string http://

// geen bestelling wel een ordernummer -> order afdrukken op scherm
if(empty($params) && !empty($ordernummer) && $check!=-1 ){
    $contents = read_csv($dir,$ordernummer);  // oo_title,oo_obj,oo_obj_name,oo_type,oo_advspot,oo_keyword| = bestelling
}

// toevoegen en verwijderen
else{
    
    $add = 0;
    $contents = '';
    $params   = substr($params,0,-1);
    $arr      = explode("|",$params);   
// Nieuwe order, alleen toevoegen, (nieuwe order) dus 1e orderregel    
    if(!$check){                  
        $contents = $params;
        $contents.="\n";
        $add=1;
    }
// er zijn orderregels controleren op dubbel en toevoegen    
    else if($check == 1 ){        
        
        $file=$dir.$ordernummer;
        //if(!file_exists($file)){}
        $lines=countlines($file);
        $str = file_get_contents($file); // read entire file
        if(!instr ($params, $str)){      // not in file ok to add
            $contents.= $params."\n";
            $add = 1;
        }
        // als wel in file hoeven we niet toe te voegen
    }
// verwijderen als oo_obj_name = in orderregel
    else if($check == -1){ 
        $file    = $dir.$ordernummer;
        $written = 0;
        $arr     = file($file,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES ); // array

        if(!unlink($file))
            die("Kon file $file niet verwijderen!"); // verwijder file
       
        $count   = count($arr);
        for($i=0;$i<$count;$i++){
            if(!instr ($oo_obj_name,  $arr[$i])){ // als deze oo_obj_name arr[2] niet in alle orderregels zit
                //echo "$arr[$i]<br>";
                $contents.= $arr[$i]."\n";
                $written++;
            }
        }
 // laatste order verwijderd dan cookie verwijderen       
        if(!$written){ 
            echo"<script type='text/javascript' src='http://www.cmagazine.nl/script/cm_cookie_functies.js'></script>
            <script type='text/javascript'>
            eraseCookie('ordernummer')
            location = 'http://www.cmagazine.nl/script/cm_no_prod.php5?url=$url&color=$color&portal=$portal';
            </script>";exit;
        }
        else
            $add=1;
    }
    // pakket
    else if($check==2){
        $add = 1;
    }
    // einde pakket
    
    if($lines >= $MAX_AANTAL_ARTIKELEN && $check!=-1){
        $alert = "alert('U kunt maximaal $MAX_AANTAL_ARTIKELEN artikelen selecteren')";
        $add = 0;
    }
    
   
}
if($add){
    add_items($ordernummer,$contents,$url,$dir);
}

// lezen order
$str = read_items($dir,$ordernummer,$url);

$in_scroller=$str;

// voor verzenden order 
$myurl='http://www.cmagazine.nl/script/cm_countryform.php5?ordernummer='.$ordernummer.'&url='.$f_url.'&portal='.$portal.'&dir='.$dir.'&color='.$color;

// print naar scherm
echo"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>cMagazine</title>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<style type='text/css'>
body{font-family:verdana;font-size:10px;background:#$color;}
/*img{margin:0px 3px 0px 3px;}*/
#scroller{position:relative;top:5px;overflow:auto;height:50px;color:#8D979B;padding:1px;width:300px;
background:#FFFFE1;color:#000033;border-style:solid;border-width:0px;border-color:#$color;}
#myframe{width:300px;height:250px;width:300px;}
#send,#lk{position:relative;top:31px;padding:1px;color:#171717;}
</style>
<script type='text/javascript' src='http://www.cmagazine.nl/script/cm_cookie_functies.js'></script>
<script type='text/javascript'>
var pW;
function openWindow(url,name,s,w,h,t,l,u){if(u){all=screen.width;l=all-w-28;}
pW=window.open(url,name,'resizable=yes,scrollbars=1,status='+s+',width='+w+'px,height='+h+'px,top='+t+'px,left='+l+'px');if (window.focus) {pW.focus()}}
$alert
</script>
</head>
<body>
<div id='myframe'>
<img src='$url/cmagazine/cmag_vul.png' width='298' height='75' alt='cMagazine'/><div id='scroller'>$in_scroller</div>
<div id='send'>Deze artikelen in een magazine ontvangen?<br>Klik  op verzenden, vul uw gegevens in en ontvang<br>het magazine binnen enkele dagen gratis thuis.</div>
<div id='lk'><a href='javascript:void(0)' onclick=\"openWindow('$myurl','mywin',1,880,680,10,10,1)\">VERZENDEN</a></div>
</div>
</body>
</html>";
exit;
?>

alles wat in het winkelmandje wordt geplaatst wordt trouwens weggeschreven in een bestand, een txt file op de webserver dat. Elke order heeft zijn eigen txt file. Bij verzenden wordt het in de db geplaatst.
 
Laatst bewerkt:
Goed. Zoals ik eerder al opmerkte: je wilt dus meerdere 'links openen', door deze in een loop te zetten. De reden dat dit niet kan met een setTimeout is dat het ook kan zijn dat het bijvoorbeeld 2.3 seconde duurt voordat de pagina geladen is, ipv je timeout van 2 seconde. Dan mis je dus een link. Daarom kan je hier AJAX voor gebruiken. Het probleem is echter dat ajax geen externe calls kan maken. Er zijn nog een paar mogelijkheden over echter:
1. old-skool ajax, otw. met iframes
2. met ajax een server-side (bv. php) script aanroepen, welke de call maakt.​
voorbeeld van het 1e:
[JS]function voeg_toe()
{
var link = "http://example.com/";

var ifrm = document.createElement('iframe');
ifrm.setAttribute('src', link);
iftm.setAttribute('width', '0');
iftm.setAttribute('height', '0');

document.appendChild(ifrm);
}[/JS]zoiets (niet getest, werkt denk ik niet, maar gaat om het idee)
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan