prplxr Medlem sedan juni 2012 581 inlägg Frågan 18 mars 2013 13:22 #1 Argh. Får hjärnblödning på detta. Hämtar Aftonbladets RSS med PHP för att sedan skicka den vidare till JavaScript för att där hantera den. Allt är frid och fröjd fram till den punkten att jag vill visa varje "objekt" i tre sekunder.
Detta är koden jag har nu:
<?php
$rss = simplexml_load_file('http://www.aftonbladet.se/nyheter/rss.xml');
if($rss) {
$strItems = '';
$items = $rss -> channel -> item;
foreach($items as $item) {
$strItems .= $item->link.'|'.$item->title.'@';
}
$strItems = substr($strItems, 0, strlen($strItems)-1);
$arrItems = explode('@', $strItems);
}
?>
<script type="text/javascript">
function setNews(url, title) {
document.getElementById('newsHere').innerHTML = '<a href=\''+url+'\'>'+title+'</a>';
};
var arrItems = <?php echo json_encode($arrItems); ?>;
var run = 0;
for(var i=0, item; item=arrItems[i]; i++) {
var arrItem = arrItems[i].split('|');
if(run == 0) {
run = 1;
delay = 0;
} else {
delay = 3000;
};
setTimeout(setNews(arrItem[0], arrItem[1]), delay);
if(i==29) i=0;
};
</script>
Är jag helt ute och cyklar, eller!?
setTimeout schemalägger att funktionen du anger ska köras x sekunder in i framtiden. Med andra ord, den fungerar inte som en "sleep"-funktion. Men ett mer akut problem med din kod är anropet till funktionen:
setTimeout(setNews(arrItem[0], arrItem[1]), delay);
Vad den koden gör är att köra setNews(arrItem[0], arrItem[1]) och sedan ta (eventuellt) returvärde och skicka till setTimeout . Du måste jobba runt det på något vis, t ex
setTimeout(
function(){setNews(arrItem[0], arrItem[1]); }
, delay);
Dock skulle jag hellre omorganisera hela koden och ha en funktion som visar nästa nyhet, och sedan låta den anropa setTimeout med sig själv som argument i slutet.
prplxr Medlem sedan juni 2012 581 inlägg Du har så rätt, så! Ibland blir det bara kaos i mössparkeringen!
Lösningen blev följande:
<?php
$rss = simplexml_load_file('http://www.aftonbladet.se/nyheter/rss.xml');
if($rss) {
$strItems = '';
$items = $rss -> channel -> item;
foreach($items as $item) {
$strItems .= $item->link.'|'.$item->title.'@';
}
$strItems = substr($strItems, 0, strlen($strItems)-1);
$arrItems = explode('@', $strItems);
}
?>
<script type="text/javascript">
var arrItems = <?php echo json_encode($arrItems); ?>;
function setNews(url, title) {
document.getElementById('newsHere').innerHTML = '<a href=\''+url+'\'>'+title+'</a>';
};
function getNews(i) {
var arrItem = arrItems[i].split('|');
setNews(arrItem[0], arrItem[1]);
if(i==29) {
i=0;
} else {
i++;
}
setTimeout(function() {getNews(i)}, 3000);
};
</script>
Tack för knuffen i rätt riktning! :-)
Den här snutten:
if(i==29) {
i=0;
} else {
i++;
}
kan du ersätta med
i=(i+1)%29
Procenttecknet betyder modulo, dvs divisionsrest. Med andra ord, när i+1 == 29 blir resten noll, och i tilldelas 0 igen.
prplxr Medlem sedan juni 2012 581 inlägg
nitro2k01 skrev:
Den här snutten:
if(i==29) {
i=0;
} else {
i++;
}
kan du ersätta med
i=(i+1)%29
Procenttecknet betyder modulo, dvs divisionsrest. Med andra ord, när i+1 == 29 blir resten noll, och i tilldelas 0 igen.
Jag kände till vad % gjorde, men jag har aldrig tänkt på det sätt du beskrev här! Tusen tack! :-D