【问题标题】:Loop JSON using JavaScript and create dynamic HTML table使用 JavaScript 循环 JSON 并创建动态 HTML 表
【发布时间】:2017-08-11 17:01:32
【问题描述】:

我正在尝试从 REST 端点循环访问 JSON 对象。我已经成功地遍历了 JSON 数组,并根据我从 JSON 对象创建的变量创建了一个动态表。

我遇到的问题是为每个位置创建一个单独的表。例如,我希望每个位置都成为自己的行,并将关联的相机位置及其照片作为单独的单元格。相反,我的表格以一列一排的形式出现。

这是我的代码的样子(请忽略我的业余编码能力,因为我还在学习):):

function getJSON(url) {

            var resp = '';
            var xmlHttp = new XMLHttpRequest();

            if (xmlHttp != null) {
                xmlHttp.open("GET", url, false);
                xmlHttp.send(null);
                resp = xmlHttp.responseText;
            }

            return resp;

        }

        function getAllLocations() {

            gjson = getJSON(
                'https://gis.iowadot.gov/public/rest/services/Maintenance/RWIS_Data/FeatureServer/5/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=CAMERA_POSITION%2C+SITE_NUMBER%2C+RPUID_NAME%2C+IMAGE_URL&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&gdbVersion=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=RPUID_NAME+ASC%2C+CAMERA_POSITION+ASC&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=&resultOffset=&resultRecordCount=&f=pjson'
            );

            var parsedJSON = JSON.parse(gjson);
            var features = parsedJSON.features;

            return features;

        }

        /*
        creates the table. 
        */
        function getJSON(url) {

            var resp = '';
            var xmlHttp = new XMLHttpRequest();

            if (xmlHttp != null) {
                xmlHttp.open("GET", url, false);
                xmlHttp.send(null);
                resp = xmlHttp.responseText;
            }

            return resp;

        }

        function getAllLocations() {

            gjson = getJSON(
                'https://gis.iowadot.gov/public/rest/services/Maintenance/RWIS_Data/FeatureServer/5/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=CAMERA_POSITION%2C+SITE_NUMBER%2C+RPUID_NAME%2C+IMAGE_URL&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&gdbVersion=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=RPUID_NAME+ASC%2C+CAMERA_POSITION+ASC&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=&resultOffset=&resultRecordCount=&f=pjson'
            );

            var parsedJSON = JSON.parse(gjson);
            var features = parsedJSON.features;

            return features;

        }

        /*
        creates the table. 
        */
        function createLocationTable() {

            var features = getAllLocations();
            var site_number = '';
            var sitename = '';
            var cameraPostion = '';
            var imgURL = '';
            var date = new Date();
            var content = '';

            content = '<table align="center">';
            content += '<tr><th class="table-header">';
            content += '<center>RWIS Images</center></th></tr></table>'
            content += '<table><tbody>';
            var tempSiteName = features[0].attributes.SITE_NUMBER;
            content += '<tr>';
            for (var i = 0; i < features.length; i++) {

                site_number = features[i].attributes.SITE_NUMBER
                sitename = features[i].attributes.RPUID_NAME;
                cameraPostion = features[i].attributes.CAMERA_POSITION;
                imgURL = features[i].attributes.IMAGE_URL;

                //if(tempSiteName.toString().substr(0,tempSiteName.toString().indexOf(' ')) != sitename.toString().substr(0,sitename.toString().indexOf(' ')))
                if (tempSiteName != sitename) {
                    //then create a new row
                    tempSiteName = sitename;
                    content += '</tr>';
                    content += '<tr>';
                }
                //otherwise everythind goes side to side
                content += '<td><center><b><br>' + sitename + '</b> -</br></center><center>' + cameraPostion +'</center>';
                content += '<div><a href =' + imgURL + ' target="_blank"><center><img src=' + imgURL +
                    ' class="imgRWIS" height="100" width="150"></center></div></td>';

            }
            content += '</tbody></table>';
            document.write(content)

            return content;
        }

        window.onload = createLocationTable();
body {
            font-family: Arial, 'Trebuchet MS', Verdana, Helvetica, sans-serif; 
        }

        .table-header {
            font-size: 24px;
            font-family: Arial, sans-serif;
            color: #d46200;
        }
        .sitename h{
            font-size: 20px;
            font-family: Arial, sans-serif;
            color: #7c9f3d;
        }

        .table-location {
            /*  background: #dddddd; */
            width: auto;
            margin: 10px 0;
            font-size: 14px;
            border: 1px solid black;
        }

        .table-location td {
            padding: 5px;
        }

        img.imgRWIS {
            background: black;
            position: relative;
            padding: 1px;
            display: block;
            margin: 0 auto;
        }

【问题讨论】:

  • 编辑:我更新了代码 sn-p 以反映正确的答案。

标签: javascript json html rest


【解决方案1】:

据我了解,这就是你想要的

function getJSON(url) {

var resp = '';
var xmlHttp = new XMLHttpRequest();

if (xmlHttp != null) {
    xmlHttp.open("GET", url, false);
    xmlHttp.send(null);
    resp = xmlHttp.responseText;
}

return resp;

}

function getAllLocations() {

gjson = getJSON(
    'https://gis.iowadot.gov/public/rest/services/Maintenance/RWIS_Data/FeatureServer/5/query?where=1%3D1&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=CAMERA_POSITION%2C+SITE_NUMBER%2C+RPUID_NAME%2C+IMAGE_URL&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&gdbVersion=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=RPUID_NAME+ASC%2C+CAMERA_POSITION+ASC&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=&resultOffset=&resultRecordCount=&f=pjson'
);

var parsedJSON = JSON.parse(gjson);
var features = parsedJSON.features;

return features;

}

    /*
    creates the table. 
    */
function createLocationTable() {

var features = getAllLocations();
var site_number = '';
var sitename = '';
var cameraPostion = '';
var imgURL = '';
var date = new Date();
var content = '';

content = '<table class="table-location"><tbody>';
content += '<tr><th class="table-header">';
content += '<center>Images</center></th></tr>';
var tempSiteNumber = features[0].attributes.SITE_NUMBER;
content += '<tr>';
content += '<tr><th class="table-header">';
content += '<center>' + features[0].attributes.RPUID_NAME + '</center></th></tr>';
for (var i = 0; i < features.length; i++) {

    site_number = features[i].attributes.SITE_NUMBER
    sitename = features[i].attributes.RPUID_NAME;
    cameraPostion = features[i].attributes.CAMERA_POSITION;
    imgURL = features[i].attributes.IMAGE_URL;               
    
    if (tempSiteNumber != site_number)
    {
        //then create a new row
                                     
        tempSiteNumber = site_number;
        content += '</tr>';                
        content += '<tr>';
        content += '<tr><th class="table-header">';
        content += '<center>'+sitename+'</center></th></tr>';
    }
    //otherwise everythind goes side to side
    content += '<td>' + cameraPostion;
    content += '<div><a href =' + imgURL + ' target="_blank"><center><img src=' + imgURL +' class="imgRWIS" height="125" width="250"></center></div></td>';
  
}
content += '</tbody></table>';
document.write(content)

return content;
}

window.onload = createLocationTable();
body {
            font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
        }

        .table-header {
            background: #D07D0E;
        }

        .table-location {
            /*  background: #dddddd; */
            width: auto;
            margin: 10px 0;
            font-size: 14px;
            border: 1px solid black;
        }

        .table-location td {
            padding: 5px;
        }

        img.imgRWIS {
            background: black;
            position: relative;
            padding: 1px;
            display: block;
            margin: 0 auto;
        }
<!doctype HTML>
<html>
<head>
    <script src="test.js"></script>
    <link rel="stylesheet" type="text/css" href="test.css">
</head>
<body>
</body>
</html>

你所要做的就是管理不同的“名字”,当它不同时跳过一行,否则都在同一行

编辑

为了在图像上显示标题,您必须使用像 Div 这样的显示块容器。

好了,所有问题都解决了。

【讨论】:

  • 在sn-p代码中是否有不明白的地方欢迎提问。
  • 现在如何让网站名称成为每张图片的标题?
  • 我去看看,这是解决锡达拉皮兹问题的新条件.. if(tempSiteName.toString().substr(0,tempSiteName.toString().indexOf(' ') ) != sitename.toString().substr(0,sitename.toString().indexOf(' '))) 我也更新了sn-p的代码。
  • 修复了 Cedar Rapids 问题,但现在它在一行中输入了多个站点名称,而不是站点名称有自己的行。
  • 我解决了最后一个问题!
【解决方案2】:

问题在于您的&lt;tr&gt; 标签。

content += '<tr><td><b>' + sitename + '</b> - ' + cameraPostion + '</td>';
content += '<td><a href =' + imgURL + ' target="_blank"><center><img src=' + imgURL +' class="imgRWIS" height="125" width="200"></center></td></tr>';

&lt;tr&gt;&lt;/tr&gt; 中的内容占一行。 &lt;td&gt;&lt;/td&gt; 中的内容构成一列。

【讨论】:

  • 如果需要,还可以将 colspan 添加到 以将标题扩展到两列。内容 += ' ';
  • 我想在一行中显示每个带有站点名称的摄像机位置,并在另一行中显示其下方的相应图像。我希望每个站点的图像在每个站点各自的行中。因此,您将拥有来自一个站点的一排图像,然后是来自单个站点的图像下方的一行,依此类推。
猜你喜欢
相关资源
最近更新 更多
热门标签