Javascript se ne izvede

Uporabljam klasičen način Ajaxa, po vnosu podatkov kličem JS funkcijo, katera pokliče PHP program. Ta generira HTML, ter vrne na ustrezen <DIV ID=xx></DIV>.

Med to vrnjeno HTML kodo je tudi JS, konkretno koda za Google Chart. Problem je, da se ta koda ne izvede, torej da se graf ne nariše. Tudi če je samo alert(??); se ne izvede. Če to kodo shranim v HTML datoteko in poženem, se JS izvede (sintaksa je torej pravilna).

Prosim za kak nasvet.

29 odgovorov

Kaj pa če bi JS pognal v callbacku na ajax klicu?

1

Če pa že moraš izvajati script, ki ga vrneš z responsom, pa si preberi ta članek.

2

Kot je LouD napisal, callback bi bil najboljša izbira, torej da je JS že nekje naložen ves časa, ampak se izvede s podatki, ki jih dobiš od strežnika.

Članek, ki ga je LouD linkal podrobneje razloži kaj narediti, če res nujno rabiš, da se tista koda iz strežnika izvede, ampak eval() ti hitro lahko prinese en kup problemov na stran in jaz bi ga uporabljal izključno, če ne gre drugače.

JS koda vrinjena v stran po osnovnem nalaganju pa se seveda ne izvede, to bi bil samomor iz vidika varnosti.

2

Hvala obema. Poskusil sem z rešitvijo, ki je opisana na priloženem linku, vendar (za enkrat) mi ne dela. Način, da je koda (in tudi rezultat) na primarni strani, PHP pa poskrbi za podatke, mi deluje OK. Vendar v tem primeru bi želel imeti rezultat (graf) med podatki, ki jih vrne strežnik. To pomeni, da se <div id=xxx… vrne z podatki s strežnika. Rezultat je pa tak, da se graf pokaže in takoj izgine. Ne najdem zakaj izgine. Prosim za nasvet.

Prva rešitev, da se na strežniku izdela tudi JS je zame precej bol enostavna in tudi brez problema deluje, če se za rezultate odpre nova stran. To je sicer za prikazovanje reklam OK, saj se pri 10 izračunih reklame prikažejo 20 krat, v nasprotnem primeru samo enkrat. Je pa za uporabnika precej manj prijazno, ko čaka na nalaganje nove strani.

Če boš prilimal kakšno kodo bo lažje :)

1

Ne vem kateri del kode bi bil bistveni za razjasnitev.

Pri spremembi kličem goFunc()

<input onchange="goFunc()" id="znes" name="znes" type="range" min=5000 max=500000 value=200000 step=1000 oninput="oznes(value)">
/----------------------------/
function goFunc() {
IzAnui(); // pripravi testne podatke (kasneje bo to na strežniku)
refi01(); // kliče PHP
drawChart(); // nariše graf
}
/----------------------------/
function refi01()
{
with (document.forms["f1"])
{
var curr = curr.value;
var _dnak = dnak.value;
var _znes = znes.value;
var _obme = obme.value;
var _leta = leta.value;

var str="http://localhost/moca/my-includes/mocaac.php";
str=str+"?poda="+
curr+";";
str=str+dnak+";";
str=str+
znes+";";
str=str+obme+";";

str=str+
leta+"";
// document.write(str);
if (str=="")
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4)
{
if (xmlhttp.status==200)
{
document.getElementById("txtHint1").innerHTML=xmlhttp.responseText;
}
}
}
xmlhttp.open("GET",str,true);
xmlhttp.send();
}
}
/
----------------------------*/
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['', ''],
['Principal', exzn],
['Interest', exob]

]);
var options = {
pieHole: 0.4,
colors: ['#5D8BB7', '#721846', '#8CB85E',
'#A75EB8', '#B8A75E', '#5EB8A7',
'#0D3B67', '#660D3B', '#3B660D'],
legend: 'none',
slices: { 1: {offset: 0.1}}
};

    var chart = new google.visualization.PieChart(document.getElementById('donutchart'));

chart.draw(data, options);
}
/----------------------------/
Koda v PHP-ju kjer bi naj bil graf
<td rowspan="7" width="50%">Karkoli<div id="donutchart" style="width: 200px; height: 200px;"></div></td>
/----------------------------/
Koda na koncu osnovne strani, kjer pridejo podatki s strežnika.
<div id="txtHint1"></div>

Zakaj želiš da strežnik javlja HTML ?
A ne bi bilo enostavneje, da ti strežnik javi podatke recimo v JSON, ti jih pa potem samo sfeedaš v chart api ?

Npr takole:

<html>
  <head>
    <!--Load the AJAX API-->
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript">

    // Load the Visualization API and the piechart package.
    google.load('visualization', '1', {'packages':['corechart']});

    // Set a callback to run when the Google Visualization API is loaded.
    google.setOnLoadCallback(drawChart);

    function drawChart() {
      var jsonData = $.ajax({
          url: "getData.php",
          dataType: "json",
          async: false
          }).responseText;

      // Create our data table out of JSON data loaded from server.
      var data = new google.visualization.DataTable(jsonData);

      // Instantiate and draw our chart, passing in some options.
      var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
      chart.draw(data, {width: 400, height: 240});
    }

    </script>
  </head>

  <body>
    <!--Div that will hold the pie chart-->
    <div id="chart_div"></div>
  </body>
</html>
3

@CRUISER Problem nastane ko je ta graf potrebno umestit med podatke, ki so prišli s strežnika.
Uspel mi je PrtScrt v trenutku, ko se graf pojavi.

Če ne drugega loči klica, za content in za graf, dvomim da je zadeva tako procesno požrešna, da bi ti dodaten klic delal probleme. Ko dobiš content, poženeš še en klic za data in preko tega generiraš graf. V contentu pa lepo nastavi en loading element, ki se zamenja z grafom ko enkrat dobiš podatke.

1

Verjetno bo to rešitev, ker šele sedaj opažam na sliki, da znesek na osnovni strani (Monthly annuity) in znesek v vrnjeni tabeli (Payment) nista enaka. Kar pomeni, da se graf nariše v predhodne podatke, potem pa ga prekrijejo novi podatki. Graf je od gornji podatkov, podatki ob njem pa od prehodnih. Poročam, ko bom naredil.