从PHP调用Javascript函数

时间:2018-03-06 08:02:52

标签: javascript php html

我的代码正在执行以下操作(请注意所有HTML,JavaScript和PHP代码都在同一个文件中):

表单用于输入数据,并由PHP验证。 PHP从Google API获取JSON数据并将其发送到JavaScript。 JavaScript函数解析JSON并在表中显示必需的字段。

我想在获取JSON后从PHP调用JavaScript函数但是当我从PHP调用它时,控制台显示函数未定义。当我从HTML按钮调用该函数时,相同的代码工作。我已经尝试在PHP脚本之前定义函数,在它之后,在头部,基本上无处不在。当我用其他JavaScript函数在头部定义它时,其他函数也会得到函数未定义的错误。

JavaScript函数:

    function generateTable() {
        var placejs = <?php echo json_encode($placesresponse); ?>; //getting the json from php
        var pjs = JSON.parse(placejs);
        var body = document.getElementsByTagName("body")[0];
        var tbl = document.createElement("table");
        var tblBody = document.createElement("tbody");
        var results = pjs.results;
        //Outputing the headers
        var row = document.createElement("tr");
        var thead = document.createElement("th");
        var headtext = document.createTextNode("Category");
        thead.appendChild(headtext);
        row.appendChild(thead);
        thead = document.createElement("th");
        headtext = document.createTextNode("Name");
        thead.appendChild(headtext);
        row.appendChild(thead);
        thead = document.createElement("th");
        headtext = document.createTextNode("Address");
        thead.appendChild(headtext);
        row.appendChild(thead);
        tblBody.appendChild(row);
        //outputting the values
        for (var i = 0; i < results.length ; i++) {
            row = document.createElement("tr");
            var curresult = results[i];
            var result_keys = Object.keys(curresult);
            for (var j = 0; j < result_keys.length ; j++) {
                var cell = document.createElement("td");
                var cur = result_keys[j];
                if(result_keys[j] == "icon")
                {
                var im = document.createElement("img");
                im.setAttribute("src",curresult[cur]);
                cell.appendChild(im);
                row.appendChild(cell);
                }
                if(result_keys[j] == "name")
                {
                var cellText = document.createTextNode(curresult[cur]);
                cell.appendChild(cellText);
                row.appendChild(cell);
                }
                if(result_keys[j] == "vicinity")
                {
                var cellText = document.createTextNode(curresult[cur]);
                cell.appendChild(cellText);
                row.appendChild(cell);
                }
            }
            tblBody.appendChild(row);
        }
        tbl.appendChild(tblBody);
        body.appendChild(tbl);
        tbl.setAttribute("border", "1");
        tbl.style.marginLeft = "auto";    
        tbl.style.marginRight = "auto"; 
        tbl.style.borderCollapse = "collapse";
    }

我称之为PHP的部分:

    $placesurl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=$latitude,$longitude&radius=$radius$type&keyword=$keyword&key=$placeskey";
        $placesresponse = file_get_contents($placesurl); //getting the json
        $placesjson = json_decode($placesresponse,true);
        if($placesjson['status']=="ZERO_RESULTS"){
            echo '<script>';
            echo 'noresult();';
            echo '</script>';
        }
        else{
            echo '<script>';
            echo 'generateTable();'; //function call
            echo '</script>';

        }

这是一项任务,我必须遵循指南,所以我不能只从PHP生成表。我也不能出于同样的原因使用jQuery。任何帮助将不胜感激,我是这个东西的新手。

编辑:

1)很抱歉没有发布这个,控制台显示这一个额外的错误:“SyntaxError:expected expression,得到'&lt;'”为我将json分配给javascript变量的行:

    var placejs = <?php echo json_encode($placesresponse); ?>;

2)我测试了一点,并且清楚地表明我在同一个脚本标签内定义的任何函数和generateTable()在控制台中也显示为undefined。脚本标记放在函数调用之前。

3 个答案:

答案 0 :(得分:0)

在javascript函数中必须在调用之前定义。检查你的php结果html。

答案 1 :(得分:0)

你在这里没有足够的信息给我一个明确的答案,我不是一个php人,所以我不能说你的PHP代码,但似乎是如果您使用php将JSON对象注入javascript变量。在这之后,不需要调用JSON.parse。只有在需要将javascript字符串转换为javascript对象时才应该这样做。你已经有了一个javascript对象。 placejs应包含您要使用的对象。如果您使用浏览器的调试工具,您应该看到该变量包含一个对象。无需解析javascript对象,它已经是一个对象。

答案 2 :(得分:-1)

你不需要这一行:

var pjs = JSON.parse(placejs);

这是因为您在回复之前的行中的原始json对象而不是json字符串。