如何动态更改脚本src

How to dynamically change the script src?

本文关键字:脚本 src 动态 何动态      更新时间:2023-09-26

我试图根据在下拉字段中选择的内容动态更改区域。

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?region=DK"></script>

有人能帮我弄清楚吗?

您可以在页面加载后动态加载JavaScript,但请记住:一旦加载了它,就无法在活动页面中卸载JavaScript。它存储在浏览器内存池中。您可以重新加载页面,这将清除活动脚本,然后重新开始。或者,您可以覆盖已设置的函数。

说到这里。以下是如何使用javascript:在页面加载后更改脚本

<select onChange="changeRegion(this.value);">
    <option value="-">Select region</option>
    <option value="SE">Sweden</option>
    <option value="DK">Denmark</option>
</select>
<div id="output">
    <script id="map" type="text/javascript" src="https://maps.googleapis.com/maps/api/js?region=DK"></script>
</div>
<script type="text/javascript">
function changeRegion(value)
{
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = "https://maps.googleapis.com/maps/api/js?region=" + value;
    s.innerHTML = null;
    s.id = "map";
    document.getElementById("output").innerHTML = "";
    document.getElementById("output").appendChild(s);
}
</script>

您应该避免多次加载Google Maps API。如果可能的话,您应该考虑去掉该脚本标记,而是在选择下拉菜单(区域)后通过JavaScript添加它。

编辑:

假设你有这样一个下拉列表:

<select id="regionSelector" onchange="loadGoogleMaps()">
  <option value="">Select region to use Google Maps:</option>
  <option value="DK">Denmark</option>
  <option value="SE">Sweden</option>
</select>

添加脚本将类似于:

function loadGoogleMaps() { 
    var selectedRegion = document.getElementById("regionSelector").value;
    if(selectedRegion === '') {
       return;
    }
    var head= document.getElementsByTagName('head')[0];
    var script= document.createElement('script');
    script.type= 'text/javascript';
    script.src= 'https://maps.googleapis.com/maps/api/js?region=' + selectedRegion;
    head.appendChild(script);
}

有关Google Maps API异步加载的更多信息:https://developers.google.com/maps/documentation/javascript/examples/map-simple-async

试试这个。。

<html>
 <head>
  <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script> 
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js"></script>
  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>  
 </head>
 <body>
  <h1>Google Maps Autocomplete Search Sample</h1>
  <div align="left">
   <input type="text" value="" id="searchbox" style=" width:800px;height:30px; font-size:15px;">
  </div>
  <div align="left" id="map" style="width:800px; height: 600px; margin-top: 10px;">
  </div>
 </body>
</html>
<script type="text/javascript">
 $(document).ready(function(){
  var mapOptions = {
       zoom: 10,
       mapTypeId: google.maps.MapTypeId.ROADMAP,
       center: new google.maps.LatLng(41.06000,28.98700)
     };
  var map = new google.maps.Map(document.getElementById("map"),mapOptions);
  var geocoder = new google.maps.Geocoder();  
     $(function() {
         $("#searchbox").autocomplete({
           source: function(request, response) {
          if (geocoder == null){
           geocoder = new google.maps.Geocoder();
          }
             geocoder.geocode( {'address': request.term }, function(results, status) {
               if (status == google.maps.GeocoderStatus.OK) {
                  var searchLoc = results[0].geometry.location;
               var lat = results[0].geometry.location.lat();
                  var lng = results[0].geometry.location.lng();
                  var latlng = new google.maps.LatLng(lat, lng);
                  var bounds = results[0].geometry.bounds;
                  geocoder.geocode({'latLng': latlng}, function(results1, status1) {
                      if (status1 == google.maps.GeocoderStatus.OK) {
                        if (results1[1]) {
                         response($.map(results1, function(loc) {
                        return {
                            label  : loc.formatted_address,
                            value  : loc.formatted_address,
                            bounds   : loc.geometry.bounds
                          }
                        }));
                        }
                      }
                    });
            }
              });
           },
           select: function(event,ui){
      var pos = ui.item.position;
      var lct = ui.item.locType;
      var bounds = ui.item.bounds;
      if (bounds){
       map.fitBounds(bounds);
      }
           }
         });
     });   
 });
</script>