【问题标题】:How to pass a javascript data to another page?如何将javascript数据传递到另一个页面?
【发布时间】:2019-03-02 16:08:10
【问题描述】:

我有这样的代码:

<input type="text" id="start" name="o">
<input type="text" id="end" name="d">
<input type="text" id="total" name="total" hidden="hidden">

<button onclick="calcRoute();" value="/index.php?route=information/mymove" >text</button>

<script>
      function calcRoute() {
        var start = document.getElementById('start').value;
        var end = document.getElementById('end').value;
        var request = {
          origin: start,
          destination: end,
          travelMode: google.maps.DirectionsTravelMode.DRIVING
        };
        directionsService.route(request, function(response, status) {
          if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(response);
            computeTotalDistance(response);
          } 
        });
      }
      function computeTotalDistance(result) {
      var total = 0;
      var myroute = result.routes[0];
      for (i = 0; i < myroute.legs.length; i++) {
        total += myroute.legs[i].distance.value;
      }
      total = total / 1000.
      document.getElementById("total").value = total + " km";
      }
</script>

如果我将此代码用于按钮:

&lt;input type="button" value="go" onclick="calcRoute();"&gt; 这会执行 javascript 函数,但不会将数据传递到另一个页面。

我在控制器文件中也有这部分:

if (isset($this->request->post['o'])) {
            $data['o'] = $this->request->post['o'];
        }

        if (isset($this->request->post['d'])) {
            $data['d'] = $this->request->post['d'];
        }

        if (isset($this->request->post['total'])) {
            $data['total'] = $this->request->post['total'];
        }

【问题讨论】:

  • 您应该使用ajax 之类的东西将数据传递到另一个页面。
  • 为什么不设置cookie??
  • 也许你可以在一个页面中设置一个cookie并从另一个页面访问它?
  • 哪个other page?你指的是index.php?route=information/mymove吗?您需要将数据传递到另一个页面的目的是什么?
  • 您需要将哪些具体数据发送到其他地方?

标签: javascript php google-maps


【解决方案1】:

一些重要的事情:你需要使这个按钮成为一个正确的提交按钮,你需要确保它返回回调而不是直接调用函数,你需要确保回调返回 false。这是如何防止在不运行脚本的情况下发送表单的默认行为。

<form action="index.php?route=information/mymove" method="post">
    <input type="text" id="start" name="o">
    <input type="text" id="end" name="d">
    <input type="text" id="total" name="total" hidden="hidden">        
    <button type="submit" onclick="return calcRoute();">text</button>
</form>

<script>
      function calcRoute() {
        var start = document.getElementById('start').value;
        var end = document.getElementById('end').value;
        var request = {
          origin: start,
          destination: end,
          travelMode: google.maps.DirectionsTravelMode.DRIVING
        };
        directionsService.route(request, function(response, status) {
          if (status == google.maps.DirectionsStatus.OK) {
            directionsDisplay.setDirections(response);
            computeTotalDistance(response);
          } 
        });
        return false;
      }
      function computeTotalDistance(result) {
      var total = 0;
      var myroute = result.routes[0];
      for (i = 0; i < myroute.legs.length; i++) {
        total += myroute.legs[i].distance.value;
      }
      total = total / 1000.
      document.getElementById("total").value = total + " km";
      }
</script>

【讨论】:

  • 只是不工作,和以前一样。隐藏的输入字段保持空白。
  • 你至少能检查一下函数是否被调用(提示:console.log 和在浏览器中调试),然后确保所有服务(google、directionsservice 等)都正确初始化并在功能范围。因为如果不是,它甚至可能会默默地失败(没有错误),并且您的 computeTotalDistances 将永远不会被调用。尝试use strict 进行检查。我无法调试这件作品,因为它没有与上下文隔离,并且您没有显示上下文
  • 如果我使用这个按钮
    这部分javascript document.getElementById("total").innerHTML = parseFloat(Math.round(total * 100) / 100 /1.60934).toFixed(2) + "miles";然后总英里数或公里数显示在 id="total" 上,这样就可以了。问题是,没有将数据传递到另一个页面。
【解决方案2】:

我认为您应该能够修改computeTotalDistance 函数,以便在所有计算完成后将总值添加到所需的隐藏输入中,然后提交表单。

function computeTotalDistance(result) {
    var total = 0;
    var myroute = result.routes[0];
    for (i = 0; i < myroute.legs.length; i++) {
        total += myroute.legs[i].distance.value;
    }
    total = total / 1000;
    document.getElementById("total").value = total + " km";

    if( total && document.getElementById("total").value!='' ) document.getElementById("total").parentNode.submit();
}

另一种选择是使用相同的回调函数将 ajax 请求发送到相同的端点 url。

function computeTotalDistance(result) {
    var total = 0;
    var myroute = result.routes[0];
    for (i = 0; i < myroute.legs.length; i++) {
        total += myroute.legs[i].distance.value;
    }
    total = total / 1000;
    document.getElementById("total").value = total + " km";

    /* send the total by ajax to endpoint url */
    ajax.call( this, url, 'total='+total, (r)=>{
        alert(r);
    } );
}


function ajax( url, params, callback ){
    with( new XMLHttpRequest() ){
        onreadystatechange=function(e){
            if( this.status==200 && this.readyState==4 ){
                callback.call( this.response )
            }
        }
        open( 'POST', url, true );
        setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        send( params );
    }
}

最初并没有说您希望在另一个页面中view 总计,只是您希望将值发送到另一个页面。因为这是一个要求,所以在这种情况下,ajax 根本不是最好的选择——因为有一个表单应该在我最初修改的函数尝试做的时候提交。

更新: 完整的示例,经过测试和工作,可以模拟您的代码尝试执行的操作。

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        /* 
            consider this as "another page" - the form has submitted to here
            and you can see the POST data...
        */
        exit(printf('<pre>%s</pre>',print_r($_POST,true)));
    }
?>
<!doctype html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>Google Maps: Route Calculations</title>
        <style>
            #map{
                width:800px;
                height:600px;
                float:none;
                margin:auto;
            }
        </style>
        <script>
            function initMap(){
                let _lat = 56.55;
                let _lng = -2.72;
                let _form = document.querySelector( 'form[name="route-plotter"]' );

                let latlng=new google.maps.LatLng( _lat, _lng );
                let options = {
                    zoom: 10,
                    center: latlng,
                    mapTypeId: google.maps.MapTypeId.TERRAIN
                };
                let map = new google.maps.Map( document.getElementById('map'), options );

                const calcroute=function(){
                    let request = {
                        origin: document.getElementById('start').value,
                        destination: document.getElementById('end').value,
                        travelMode: google.maps.DirectionsTravelMode.DRIVING
                    };

                    let directionsService = new google.maps.DirectionsService();
                    let directionsDisplay = new google.maps.DirectionsRenderer();

                    directionsService.route(request, function(response, status) {
                        if ( status == google.maps.DirectionsStatus.OK ) {

                            directionsDisplay.setDirections( response );
                            calculatedistance( response );
                        } 
                    });
                };
                const calculatedistance=function(result){
                    let total=0;
                    let route=result.routes[0];
                    route.legs.forEach( leg=>{
                        total+=leg.distance.value;
                    });
                    document.getElementById('total').value=total;
                    _form.submit();
                };

                _form.querySelector('button').addEventListener('click',calcroute,false)
            }
        </script>
        <script async defer src='//maps.googleapis.com/maps/api/js?key=APIKEY&callback=initMap'></script>
    </head>
    <body>
        <div id='map'></div>
        <form name='route-plotter' method="post">
            <input type="text" id="start" name="start" value="dundee" />
            <input type="text" id="end" name="end" value="aberdeen" />
            <input type="text" id="total" name="total" hidden="hidden">        
            <button type="button">Go get the distance</button>
        </form>
    </body>
</html>

【讨论】:

  • 我厌倦了你的推荐,但仍然没有工作,至少第一个似乎隐藏的输入字段不包含数据。在第二个我不知道如何在另一个页面上显示 ajax 帖子。
猜你喜欢
  • 2015-09-12
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2011-12-04
  • 2017-01-25
  • 2020-10-19
相关资源
最近更新 更多