开发者

How do I make this javascript function run automatically?

I am trying to use a longitude/latitude converter to display the OSGR value. This is the code I have at the moment:

    <?php

$longitude = "-0.310150 N";
$latitude = "59.688930 W";
?>

<script language="JavaScript" type="text/JavaScript">
<onload = function() {
           CalculateOSGB();
         };
</script>

<script language="JavaScript" type="text/JavaScript">
function ELMNT(elementName)
{
  return document.getElementById(elementName);
}

function CalculateLL()
{
  ENEN = new EastNorth;
  RefToCoords ( ELMNT("OSRef").value, ENEN );

//  ELMNT("OSRef").value = ELMNT("OSRef").value + ENEN.Easting + " " + ENEN.Northing + "\t";
  CoordsToLL(ENEN,LatLong);

  ELMNT("latitude").value = LatLong.Lat;
  ELMNT("longitude").value = LatLong.Long;
//  ELMNT("OSRef").value = ELMNT("OSRef").value + LatLong.Lat + "\t" + LatLong.Long + "\t" + ELMNT("OSRef").value + "\n";
}

function RefToCoords ( InRef, EastNorth )
{
    var  Length1 = 0;
    var  Length2 = 0;
    var  Index;
    Numbers  = new String("");
    Letters  = new String("");
    Easting  = new Array("");
    Northing = new Array("");
    Grid_X = new Array(   0, 100, 200, 300, 400,   0, 100, 200,   0, 300, 400,   0, 100, 200, 300, 400,   0, 100, 200, 300, 400,  0, 100, 200, 300, 400, 0);
    Grid_Y = new Array( 400, 400, 400, 400, 400, 300, 300, 300,   0, 300, 300, 200, 200, 200, 200, 200, 100, 100, 100, 100, 100开发者_运维问答,  0,   0,   0,   0,   0, 0);
    Lookup = new String("                                                                 ABCDEFGHIJKLMNOPQRSTUVWXYZ");

    Ref = new String(InRef);
    Ref.toUpperCase();

    Length1 = Ref.length;
    for ( i=0; i<Length1; i++ )
    {
        if ( Ref.charAt(i).toUpperCase() >= 'A' && Ref.charAt(i).toUpperCase() <= 'Z' )
            Letters = Letters + Ref.charAt(i).toUpperCase();
        else
            if ( Ref.charAt(i) >= '0' && Ref.charAt(i) <= '9' )
                Numbers = Numbers + Ref.charAt(i);
    }

    if ( Letters.length != 2 )
    {
        ELMNT("OSRef").value = ELMNT("OSRef").value + "ERROR: OS Ref. Letters must be 2 long\n";
        return -1;
    }

    Length2 = Numbers.length;
    if ( !Length2 || Length2 & 0x01 )
    {
        ELMNT("OSRef").value = ELMNT("OSRef").value + "ERROR: OS Ref. Must not be odd number of numbers\n";
        return -1;
    }

    Length2 = Length2 / 2;
    Length2 = Math.floor(Length2)

    Easting = Numbers.slice(0,Length2);
    Easting = Easting + "00000";

    Northing = Numbers.slice(5,5+Length2);
    Northing = Northing + "00000";

    Index = Lookup.indexOf(Letters.charAt(0)) - 65;
    EastNorth.Easting = 5000 * Grid_X[Index];
    EastNorth.Northing = 5000 * Grid_Y[Index];

    Easting= Easting /100000;
    Northing = Northing / 100000;
    Index = Lookup.indexOf(Letters.charAt(1)) - 65;
    EastNorth.Easting = EastNorth.Easting + ( Grid_X[Index] * 1000 );
    EastNorth.Northing = EastNorth.Northing + ( Grid_Y[Index] * 1000 );

    EastNorth.Easting = EastNorth.Easting + ( parseInt(Easting) - 1000000 );
    EastNorth.Northing = EastNorth.Northing + ( parseInt(Northing) - 500000 );

    return 0;
}

function LLToCoords(LatLong,EastNorth)
{
  var dLongI = 0.0; 
  var dLatI  = 0.0;
  var Rad    = 0.0174532925199432957692369076848;

  dLongI = Rad * (parseFloat ( LatLong.Long )+2.0 );
  dLatI  = parseFloat ( LatLong.Lat ) * Rad;

  dT     = Math.tan ( dLatI );
  dTSq   = dT * dT;
  dJ     = dLongI * Math.cos ( dLatI );
  dJSq   = dJ * dJ;
  dETASq = Math.cos ( dLatI );
  dETASq = dETASq * dETASq * 0.0067153346685;

  dNu = Math.sin ( dLatI );
  dNu = 6377563.396 / Math.sqrt ( 1.0 - ( dNu * dNu * 0.006670539761597 ) );  

  dA7 = ( 61.0 - dTSq * ( 479.0 - 179.0 * dTSq + dTSq * dTSq ) ) /5040.0;
  dA5 = ( 5.0 - dTSq * ( 18.0 - dTSq ) + dETASq * ( 14.0 - 58.0 * dTSq ) ) / 120.0;
  dA3 = ( 1.0 - dTSq + dETASq ) / 6.0;
  dA1 = 0.9996012717 * dNu;

  EastNorth.Easting = dA1 * dJ * ( 1.0 + ( dJSq * ( dA3 + ( dJSq * ( dA5 + dA7 * dJSq ) ) ) ) );

  dM=6335021.60578487*(1.0050342114*dLatI-0.5*0.0050449242*Math.sin(2.0*dLatI)+0.25*0.0000105505*Math.sin(4.0*dLatI));
  dA2 = 0.5 * dA1 * dT;
  dA4 = ( 5 - dTSq + dETASq*(9.0+4.0*dETASq) ) / 12.0;
  dA6 = ( 61.0 - dTSq*(58.0+dTSq) + dETASq*(270.0-330.0*dTSq) ) / 360.0;

  EastNorth.Northing = 0.9996012717 * dM + dA2 * dJSq * ( 1.0 + dJSq * ( dA4 + dA6 * dJSq ) );

  EastNorth.Easting  = EastNorth.Easting + 400000;
  EastNorth.Northing = EastNorth.Northing - 5527063.0;

  return dLongI;
}

function EastNorth(East,North)
{
  this.Easting = East;
  this.Northing = North;
  return 0;
}

function LatLong(Lat,Long)
{
  this.Lat = Lat;
  this.Long = Long;
  return 0;
}

function CoordsToLL(InEastNorth,InLatLong)
{
  var Rad = 0.0174532925199432957692369076848;
  var K = 1 / (  Rad * 6377563.396 );
  var dx;
  var dy;
  var myloop = 0;

  EN = new EastNorth(InEastNorth.Easting,InEastNorth.Northing);
  LL = new LatLong(52.0,-3.0);
  do
  {
    myloop = myloop + 1;
    LLToCoords(LL,EN);
    dx = InEastNorth.Easting - EN.Easting;
    dy = InEastNorth.Northing - EN.Northing;
    LL.Lat = LL.Lat + dy * K;
    LL.Long = LL.Long + dx * K / ( Math.cos(Rad) * LL.Lat );
  } while ( ( ( (Math.abs ( dx ) + Math.abs ( dy )) > 0.0000001 )) && myloop < 5000);
  InLatLong.Lat = LL.Lat;
  InLatLong.Long = LL.Long;

  return 0;
}


function CalculateOSGB()
{

  var lat = "<?php echo $latitude; ?>";
  var lon = "<?php echo $longitude; ?>";
  LatLong.Lat  = (lat);
  LatLong.Long = (lon);
  LLToCoords ( LatLong, EastNorth );
  ELMNT("OSRef").value = OSReference ( EastNorth );

}


function OSReference(EastNorth)
{
  var Codes = new Array ( 'V','W','X','Y','Z','Q','R','S','T','U','L','M','N','O','P','F','G','H','J','K','A','B','C','D','E');
  var East = 0.0;
  var North = 0.0;
  var I = 0;
  var J = 0;
  var A = ' ';
  var B = ' ';

  East  = parseInt ( EastNorth.Easting ) + 1000000.0;
  North = parseInt ( EastNorth.Northing ) + 500000.0;

  I = parseInt ( East  / 500000 );
  J = parseInt ( North / 500000 );
  A = Codes[parseInt ( I + J*5 )];

  East  = parseInt (  East % 500000 );
  North = parseInt ( North % 500000 );
  I = parseInt ( parseInt ( East  ) / 100000 );
  J = parseInt ( parseInt ( North ) / 100000 );
  B = Codes[parseInt ( I + J*5 )];

  C = (parseFloat(East)+100000)+"";
  D = (parseFloat(North)+400000)+"";

  return A + B + ' ' + C.substring(C.length-5,6) + ' ' + D.substring(D.length-5,6);
}
</script>


<div id="Layer3" style="position:absolute; width:695px; height:115px; z-index:1; left: 189px; top: 115px;"> 
  <table align="center" border="0">
    <tbody><tr> 
      <td><font face="Arial, Helvetica, sans-serif">Latitude:</font></td>
      <td><font face="Arial, Helvetica, sans-serif"> 
        <input value="" id="latitude" name="latitude" size="30" type="text">
        </font></td>
      <td><font face="Arial, Helvetica, sans-serif">6° South should be entered 
        as -6.0</font></td>
    </tr>
    <tr> 
      <td><font face="Arial, Helvetica, sans-serif">Longitude:</font></td>
      <td><font face="Arial, Helvetica, sans-serif"> 
        <input value="" id="longitude" name="longitude" size="30" type="text">
        </font></td>
      <td><font face="Arial, Helvetica, sans-serif">4° West should be entered 
        as -4.0</font></td>
    </tr>
    <tr> 
      <td></td>
      <td> <font face="Arial, Helvetica, sans-serif"> 
        <input value="Convert Lat/Long to OSGB" onclick="CalculateOSGB()" name="LL2OSGB" type="button">
        </font></td>
      <td> <font face="Arial, Helvetica, sans-serif"> 
        <input value="Convert OSGB to Lat/Long" onclick="CalculateLL()" name="OSGB2LL" type="button">
        </font></td>
    </tr>
    <tr> 
      <td><font face="Arial, Helvetica, sans-serif">OS Ref.</font></td>
      <td colspan="2"><font face="Arial, Helvetica, sans-serif"> 
        <input value="" id="OSRef" name="OSRef" size="30" type="text">
        </font></td>
    </tr>
    <tr> 
      <td></td>
      <td colspan="2"><font face="Arial, Helvetica, sans-serif">If you see 'NaN' 
        your Lat/Long is out of range for an OSGB reference</font></td>
    </tr>
  </tbody></table>
  <div id="results" style="position:absolute; width:695px; height:50;"></div>
</div>

I don't know javascript very well, but I believe the calculateOSGB() function works out the OSGR after the calculate button is clicked. Could someone please explain how I would get this to work automatically rather than having to click the button? I would like to be able to insert the longitude & latitude from a database (why I have used PHP variables) and have this script automatically display & output the OSGR value.

Thanks for any help


if you don't use a JS library like jQuery, you can use onload

onload = function() {
           // do something here
         };

and that's it. Some people like to use window.onload but it is the same thing.

Reference:
https://developer.mozilla.org/en/DOM/window.onload
Best practice for using window.onload

If you consider using jQuery or some other library, it may save you time over the long run. If using jQuery, you can use

$(function() {   
  // do something
});

and it will run when the DOM is ready, which is earlier than when the page is fully loaded like the first method above.


You have two ways of achieving this, you can either call that function using <body onload="CalculateOSGB();"> - this will execute the function when the body has loaded.

Your other option is to use a library such as jQuery and use the $(document).ready(function() to call your function when the DOM has loaded.

Hope that helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜