0

賢明な方: 構築中の Web アプリケーションで、まだ深刻な問題が発生しています。APACHE 2 Web サーバーを使用しています。localhost で test.html をクリックすると、.html ファイル内で JavaScript を実行するテスト ボタンがポップアップ表示されます。

test.html は次のとおりです。

<!DOCTYPE html>
<html>
<head>
<script>


function loadXMLDoc() {
var xmlhttp;

if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}


xmlhttp.onreadystatechange=function() {
var str, fileNameVar;
fileNameVar = "hello";
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
    str = xmlhttp.responseText;
    alert(str);
    }
}

xmlhttp.open('GET', 'try.pl?name=fileNameVar' + encodeURIComponent(fileNameVar),false);
xmlhttp.send();
}
</script>
</head>
<body>

<h2>Example</h2></div>
<button type="button" onclick="loadXMLDoc()">test</button>

</body>
</html>

この Web アプリは、以前は perl スクリプトを呼び出してその戻り値を出力するときに機能していましたが、今回は、javascript から perl スクリプト [try.pl] にパラメーターを渡そうとしています。ご覧のとおり、文字列または整数を保持する変数 fileNameVar を渡そうとしています。

これが私の perl スクリプト、try.pl です。

#!C:/indigoampp/perl-5.12.1/bin/perl.exe
use CGI;
use strict;
use warnings;

my $cgi = CGI->new;

my $name = $cgi->param('name');
print "Content-type: text/plain\n\n";
print "$name";

そのため、Web アプリでボタンが押されると、"hello" という単語を含むユーザーへのアラートが作成されるだけです。

ただし、ボタンを押しても何も起こりません。他の人でもうまくいくように見えるので、自分が何を間違っているのかわかりません。基本的に、私の Web アプリは動作しますが、javascript から perl スクリプトに変数を渡す機能を追加したいと考えています。

注: GET ステートメントで「hello」を直接渡したくありません。fileNameVar に保存されているものは何でも渡したいです。ただし、この例では、fileNameVar は「hello」に設定されています。助けてくれてありがとう!

4

2 に答える 2

4

1) test.html を apache2 の htdocs ディレクトリに置きます。
2) apache2 の cgi-bin ディレクトリに try.pl を置きます。
3) try.pl を実行可能にします (Windows ではおそらく自動的に実行されます)。UNIX では、次のように記述します。

.../apache2/cgi-bin$ chmod a+x try.pl 

4) Apache を起動します。
5) ブラウザに次のように入力して、test.html ページをリクエストします。

http://localhost:8080/test.html

(Apacheがリッスンしているポートに置き換えます)

6) この行で:

xmlhttp.open('GET', 'try.pl?name=fileNameVar' + encodeURIComponent(fileNameVar),false);

...いくつか問題があります。関数内で fileNameVar を定義し、関数の外から fileNameVar にアクセスしようとしています。関数内で定義された変数は、その関数内でのみ見ることができます (他の関数内で定義された関数である「クロージャー」と呼ばれるものは例外です)。

次に、あなたの例では、encodeURIComponent() は「hello」を返すため、URL は次のようになります。

'try.pl?name=fileNameVar'  + 'hello'

または同等:

'try.pl?name=fileNameVarhello'

...これはおそらくあなたが望むものではありません。あなたが書きたい:

var fileNameVar = "hello";
....'try.pl?name=' + encodeURIComponent(fileNameVar)

次に、「cgi-bin」をパスに入れる必要があります。

 var fileNameVar = "hello";
 ......'cgi-bin/try.pl?name=' + encodeURIComponent(fileNameVar)

7) 行内:

print "$name";

引用符は何もしません。

====

.../apache2/htdocs/test.html:

<!DOCTYPE html>
<html>
<head>
<title>Test</title>

<script type="text/javascript">

function loadXMLDoc() 
{
  var xmlhttp;

  if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  }
  else
  {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }


  xmlhttp.onreadystatechange = function() 
  {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      var str = xmlhttp.responseText;
      alert(str);
    }
  }


  var fileNameVar = "hello"; //LOOK AT ME*******

  xmlhttp.open(
    'GET', 
    'cgi-bin/try.pl?name=' + encodeURIComponent(fileNameVar),
    false
  );

  xmlhttp.send();
}

</script>
</head>
<body>

<h2>Example</h2></div>
<button type="button" onclick="loadXMLDoc()">test</button>

</body>
</html>

...apache2/cgi-bin/try.pl:

#!/usr/bin/env perl

use CGI;
use strict;
use warnings;

my $cgi = CGI->new;

my $name = $cgi->param('name');
print "Content-type: text/plain\n\n";
print $name;

ブラウザに入力する URL:

http://localhost:8080/test.html

(Apacheがリッスンするように構成したポートに置き換えます-.../apache2/conf/httpd.confで指定されています)

次に、ボタンをクリックします。

于 2013-06-27T20:03:31.013 に答える