Vreemde hik in het uitvoeren van een functie

Status
Niet open voor verdere reacties.

poashoas

Gebruiker
Lid geworden
31 mei 2008
Berichten
66
Het gaat om de onderstaande code en dan vooral om function checkFab() en getContent().
getContent wordt aangeroepen en het komt aan, en dan wordt getContent() ook uitgevoerd.
Het gekke is: als ik in checkFab() of getContent() een alert plaats dan is alles koek en ei want als ik op OK klik van de alert verschijnt de content op het scherm. Maar als ik de alerts weg haal dan verschijnt het niet.... ook geen foutmelding in Web Developer toolbar van FireFox.... in de andere browsers gebeurt hetzelfde...

var fabselect;
var xmlHttpmerk;
var xmlHttpfab;
var evalFab;
var evalContent;
var myShop2;
var myShop;

function showDropdown(){
xmlHttpmerk=GetXmlHttpObject();​
xmlHttpfab=GetXmlHttpObject();​
if (xmlHttpmerk==null){​
alert ("Browser does not support HTTP Request");​
return;​
}​

var url="application/controller/switch.php";​
url=url+"?request=shop&action=merken";​
url=url+"&sid="+Math.random();​

xmlHttpmerk.onreadystatechange=stateChangedmerk;​
xmlHttpmerk.open("GET",url,true);​
xmlHttpmerk.send(null);​

var url="application/controller/switch.php";​
url=url+"?request=shop&action=fabrikanten";​
url=url+"&sid="+Math.random();​

xmlHttpfab.onreadystatechange=stateChangedfab;​
xmlHttpfab.open("GET",url,true);​
xmlHttpfab.send(null);​
evalFab=setInterval('checkFab();', 100);​
}

function stateChangedmerk()
{
if (xmlHttpmerk.readyState==4 || xmlHttpmerk.readyState=="complete")​
{​
myShop = xmlHttpmerk.responseText;​
var browser=navigator.appName;​
if (browser=="Microsoft Internet Explorer"){​
select_innerHTML(document.getElementById("merk"),myShop);​
}else{​
document.getElementById("merk").innerHTML=myShop;​
}​
}​
}

function stateChangedfab()
{
if (xmlHttpfab.readyState==4 || xmlHttpfab.readyState=="complete")​
{​
myShop2 = xmlHttpfab.responseText;​
var browser=navigator.appName;​
if (browser=="Microsoft Internet Explorer"){​
select_innerHTML(document.getElementById("fabrikant"),myShop2);​

}else{​
document.getElementById("fabrikant").innerHTML=myShop2;​
}​
}​
}

function checkFab(){
if(myShop2!=undefined && myShop!=undefined){​
if(document.getElementById('fabrikant').innerHTML.toLowerCase()==myShop2.toLowerCase() && document.getElementById('merk').innerHTML.toLowerCase()==myShop.toLowerCase()){​
clearInterval(evalFab);​
getcontent();​
}else{​
return false;​
}​
}else{​
return false;​
}​
}

function getcontent(){
var combo1 = document.getElementById("merk");​
var merkValue = combo1.options[combo1.selectedIndex].value;​
var combo2 = document.getElementById("fabrikant");​
var fabrikantValue = combo2.options[combo2.selectedIndex].value;​
sendkeywords(document.getElementById("searchtxt").value, merkValue, fabrikantValue);​
}

//de value is altijd zonder quotes als er geen spatie in de waarde voorkomt, er zijn wel quotes als de fabrikant uit 2 woorden bestaat

function select_innerHTML(objeto,innerHTML){
objeto.innerHTML = ""​
var selTemp = document.createElement("micoxselect")​
var opt;​
selTemp.id="micoxselect1"​
document.body.appendChild(selTemp)​
selTemp = document.getElementById("micoxselect1")​
selTemp.style.display="none"​

if(innerHTML.toLowerCase().indexOf("<option")<0){​
innerHTML = "<option>" + innerHTML + "</option>"​
}​

innerHTML = innerHTML.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span")​
selTemp.innerHTML = innerHTML​

for(var i=0;i<selTemp.childNodes.length;i++){​

var spantemp = selTemp.childNodes;


if(spantemp.tagName){​


if(document.all){ //IE​
objeto.add(opt)​
}else{​
objeto.appendChild(opt)​
}​

//getting attributes​
for(var j=0; j<spantemp.attributes.length; j++){​

var attrName = spantemp.attributes[j].nodeName;​
var attrVal = spantemp.attributes[j].nodeValue;​

if(attrVal){ //áls er een waarde is voor Value?​
try{​
opt.setAttribute(attrName,attrVal);​
opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));​
}catch(e){}​
}​
}​

opt.value = spantemp.getAttribute("value")​
opt.text = spantemp.innerHTML​

}​
}​

document.body.removeChild(selTemp)​
selTemp = null​
}
 
Je laat alleen maar de functies zien. Ik heb het vemoeden dat het niet aan je functies ligt maar op het moment dat je ze aanroept. Kun je het script laten zien wat deze functies aanroept?
 
Je laat alleen maar de functies zien. Ik heb het vemoeden dat het niet aan je functies ligt maar op het moment dat je ze aanroept. Kun je het script laten zien wat deze functies aanroept?

Ja,

Ik denk by the way dat er ergens een element nog niet geladen is... want onderaan deze post laad ik html in een div met load(). Deze html wordt weer geladen met sendkeywords(); in shoplisteners(); maar dat gebeurd pas na een timeout van 700 ms. Ik ga ervan uit dat de html dan wel geladen is....


De code:

<body onload="init();">

INIT.JS
function init(){
load('shop', 'content', '', '');​
setTimeout('indexlisteners()', 1000);​
}

LOAD.JS
function load(name, div, action, id) {
loadphp(id, name, div, action);//id, name, div, action​
return false;​
}

function loadphp(id, url, target, action) {
if (window.XMLHttpRequest) {​
req = new XMLHttpRequest();​
} else if (window.ActiveXObject) {​
req = new ActiveXObject("Microsoft.XMLHTTP");​
}​

var href='application/views/'+url+'/'+url+'.php';

if (req != undefined) {​
req.onreadystatechange = function() {loadphpDone(url, target, action, id);};​
req.open("GET", href, true);​
req.send("");​
}​
}

function loadphpDone(url, target, action, id) {
if (req.readyState == 4) { // only if req is "loaded"​
if (req.status == 200) { // only if "OK"​
document.getElementById(target).innerHTML = req.responseText;​
} else {​
document.getElementById(target).innerHTML=" AHAH Error:\n"+ req.status + "\n"​
+req.statusText;
}​
}​

setTimeout("listeners('"+url+"', '"+action+"', '"+id+"');", 700);

}


BEHAVIOURS.JS
function listeners(page, action, id){
var strgoto=page;​
var tmp2Func = new Function(strgoto+"listeners(\""+action+"\", \""+id+"\")");​
tmp2Func();​
}

function shoplisteners(action, id){
showDropdown();

if(document.addEventListener){ //code for Moz​
document.getElementById("searchtxt").addEventListener('keyup', function(){​
sendkeywords(document.getElementById("searchtxt").value, document.getElementById("merk").options[document.getElementById("merk").selectedIndex].value, document.getElementById("fabrikant").options[document.getElementById("fabrikant").selectedIndex].value);​
}, false);​

document.getElementById("merk").addEventListener('change', function(){​
sendkeywords(document.getElementById("searchtxt").value, document.getElementById("merk").options[document.getElementById("merk").selectedIndex].value, document.getElementById("fabrikant").options[document.getElementById("fabrikant").selectedIndex].value);​
}, false);​

document.getElementById("merk").addEventListener('change', function(){​
sendkeywords(document.getElementById("searchtxt").value, document.getElementById("merk").options[document.getElementById("merk").selectedIndex].value, document.getElementById("fabrikant").options[document.getElementById("fabrikant").selectedIndex].value);​
}, false);​
}else{​
document.getElementById("searchtxt").attachEvent('onkeyup', function(){​
sendkeywords(document.getElementById("searchtxt").value, document.getElementById("merk").options[document.getElementById("merk").selectedIndex].value, document.getElementById("fabrikant").options[document.getElementById("fabrikant").selectedIndex].value);​
}, false);​
document.getElementById("merk").attachEvent('onchange', function(){​
sendkeywords(document.getElementById("searchtxt").value, document.getElementById("merk").options[document.getElementById("merk").selectedIndex].value, document.getElementById("fabrikant").options[document.getElementById("fabrikant").selectedIndex].value);​
}, false);​
document.getElementById("merk").attachEvent('onchange', function(){​
sendkeywords(document.getElementById("searchtxt").value, document.getElementById("merk").options[document.getElementById("merk").selectedIndex].value, document.getElementById("fabrikant").options[document.getElementById("fabrikant").selectedIndex].value);​
}, false);​
}​
}

en dan volgt de shopdropdown() code in mijn vorige post. Die moet van alles vullen in een in de volgende html.
De dropdowns worden wel degelijk geladen maar de sendkeywords, afhankelijk van de geladen dropdowns gaan niet zo lekker:

function sendkeywords(objtxt1, objmerk, objfabrikant){
var searchtxt=objtxt1;​
var merk=objmerk;​
var fabrikant=objfabrikant;​
var page='';​
showResult(searchtxt, merk, fabrikant, page);​
}

application/views/shop/shop.php
<?php
echo'
<div id="left">

<div id="nitemscart">​

</div>​

<div id="searchbox">​

<form name="search" id="search" action="">​
<p>​
<select name="merk" id="merk">​

</select>​
</p>​

<br />​

<p>​
<select name="fabrikant" id="fabrikant">​

</select>​
</p>​

<br />​

<p>​
Type: <input type="text" id="searchtxt" size="25" value=" " />​
</p>​
</form>​

</div>​

<div id="livesearch">​

</div>​

</div>

<div id="right">

<div id="searchindex"></div>​
<div id="cart" style="display:none"></div>​

<div id="shopcontent" style="display:block;"></div>​

</div>
';
?>
 
Laatst bewerkt:
na een ellenlang verhaal...

Je laat alleen maar de functies zien. Ik heb het vemoeden dat het niet aan je functies ligt maar op het moment dat je ze aanroept. Kun je het script laten zien wat deze functies aanroept?

Nou ik sprak mezelf wel een beetje tegen in me laatste post, ik zei dat 700 ms wel genoeg was om de html te laden. En achteraf was dat ook zo toen ik dat eenmaal aangepast had.
Ik zoek alleen nog een vriendelijkere manier in plaats van een timeout om te zien of een div geladen is.
 
als je een script element onder het div element zet in de html wordt het script pas uitgevoerd als die div is geladen

Ik gebruik ook nooit het onload event, ik toep een functie aan in het einde van de body. Dan hoeft het niet te wachten op plaatjes en iframes die nog laden :)
 
als je een script element onder het div element zet in de html wordt het script pas uitgevoerd als die div is geladen

Ik gebruik ook nooit het onload event, ik toep een functie aan in het einde van de body. Dan hoeft het niet te wachten op plaatjes en iframes die nog laden :)

Goed plan ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan