Indy TIdHTTPServer OnCommandGet javascript在html中没有执行

时间:2014-11-25 11:42:53

标签: javascript html delphi indy httpserver

我有一个TIdHTTPServer,它会将html文件中的javascript代码发送到<script language="javascript">标记中带有标记<head>的浏览器。我无法访问html文件,所以我无法更改它的内容。我使用HTTPServerCommandGet将此文件的内容发送到浏览器,如下所示:

procedure TMainForm.HTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  responseMemoryStream : TMemoryStream;
begin
  responseMemoryStream := TMemoryStream.Create;
  try
    AResponseInfo.ContentType := 'text/html';
    AResponseInfo.ContentEncoding := 'UTF-8';
    AResponseInfo.CharSet := 'UTF-8';
    responseMemoryStream.LoadFromFile(ExtractFilePath(Application.ExeName) + 'index.html');
    AResponseInfo.ContentStream := TMemoryStream.Create;
    TMemoryStream(AResponseInfo.ContentStream).LoadFromStream(responseMemoryStream);
  finally
    responseMemoryStream.Free;
  end;
end;

当我从互联网浏览器发出GET命令时,它有时会加载javascript,但有时它不会 - 当我使用 Firefox 时没有问题,但是当我使用 Chrome IE javascript永远不会执行。有没有办法用AResponseInfo变量以某种方式强制执行javascript代码,或者我无法解决这个问题?

这是index.html的一部分:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <meta  charset=utf8 />
    <title>My title</title>
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
    <script language="javascript">
        var map;
        var flag_for_map_massage = 0;
        var map_marker = 0;
        function initmap()
        {
            var html;
            var map_divtxt = "<div id=\"map_canvas\" style=\"width:200px;height:150px;\" ></div>";
            document.getElementById("google_map").innerHTML = map_divtxt;
            var latlng = new google.maps.LatLng(100.12345, 200.12345);

            var options = {
                zoom: 17,
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            var map1 = new google.maps.Map(document.getElementById("map_canvas"), options);

            var html = "<table>" +
                    "<tr><td>GMBH Address</td> </tr>";

            infowindow = new google.maps.InfoWindow({
                content: html
            });
            var marker1 = new google.maps.Marker({
                position: new google.maps.LatLng(100.12345, 200.12345),
                map: map1

            });
            //     infowindow.open(map1, marker1);
            google.maps.event.addListener(marker1, "click", function() {
                infowindow.open(map1, marker1);
            });
        }

    </script>
</head>
<body onload="initmap();">  
  <div class="entry">
    <div id="google_map">
    </div>
  </div> 
</body>
</html>

2 个答案:

答案 0 :(得分:4)

您的所有服务器都可以将HTML传送到浏览器,仅此而已。浏览器负责处理HTML,检索外部资源,执行脚本等。如果浏览器运行不正常,那么HTML /脚本可能会出现错误。这与您的服务器无关(除非您破坏了正在发送的数据)。

话虽如此,您不需要在OnCommandGet代码中使用两个流,这是过度的。一个流就足够了。此外,utf-8不是有效的ContentEncoding值,因此您需要将其删除。

试试这个:

procedure TMainForm.HTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentType := 'text/html';
  AResponseInfo.CharSet := 'utf-8';
  AResponseInfo.ContentStream := TMemoryStream.Create;
  TMemoryStream(AResponseInfo.ContentStream).LoadFromFile(ExtractFilePath(Application.ExeName) + 'index.html');
end;

可替换地:

procedure TMainForm.HTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentType := 'text/html';
  AResponseInfo.CharSet := 'utf-8';
  AResponseInfo.ContentStream := TIdReadFileExclusiveStream.Create(ExtractFilePath(Application.ExeName) + 'index.html');
end;

当然,如果浏览器实际上请求ARequestInfo.Document而不是服务器上的其他文件,请确保关注index.html属性并仅提供index.html

答案 1 :(得分:2)

Indy10的IdCustomHTTPServer.pas有一个错误。

设置AResponseInfo.Charset值并不起作用。 因为以下行(Pas文件中的第2141行)会覆盖Charset变量。

ContentType := 'text/html; charset='+Charset;

为了纠正,请在下面添加两个文件(从&#34; C:\ Program Files(x86)\ Embarcadero \ Studio \ 16.0 \ source \ Indy10 \ Core&#34;复制到您的项目目录,然后添加到您的项目):

IdCustomHTTP.pas

IdCompilerDefines.inc

将第2141行修改为

{{1}}

;-)