chatGPTでjavascriptについて聞いてみた。202309

(chatGPTにコーディングを尋ねる20230909)
 
 
こちらは、chatGPT素人です。さらにプログラム素人です。
自分用メモです。(何か問題あれば削除いたします。)
 
昔のIEで作られていたhtmファイル(他人の作ったファイル)をedgeでも動くようにならないかと見ていた。
(edgeでは動かなかったファイルです。※デスクトップのローカル環境)
 
ふと、chatGPT(ベータ版(無料))に聞いてみようと思いました。
(以下に長いので、一部のみ記載。chatGPTの回答って、公開してもいいのかな?・・・微妙みたいです。)
 
 
また、使う際の注意点としては、会社などのデータをそのまま載せてはいけないということ。(直して載せたり工夫必要か。)
 
 
先に結論を言うと、「何回かやり取りしたが、コーディングではない部分での知識について間違いがある」のではと判断しました。
(※デスクトップのローカル環境についての知識)
 
最初にしたのは、
(1)
【edgeやchoromeで動くようにコーディングして下さい】
●User
下記のコードhtmlです。2021年現在でhtmlで動くように新しくして下さい。
コードの内容は、あまり変えないで、edgeやchoromeで動くようにコーディングして下さい。
(以下、省略。古いコードです。例にしたのは、index.htmlのような最初に読み込むファイル)
 
(一部こんな感じのを尋ねました)
<FRAMESET rows="87,*" frameborder="0">
<FRAME scrolling=no src="main\midasi.html" noresize>
  <FRAMESET cols="300,*" frameborder="0">
  <FRAME id="option" name="menu" src="main\option.html" noresize>
  <FRAMESET rows="48,*" frameborder="0">
    <FRAME id="indent" name="migi_ue" scrolling=no src="main\indent.html" noresize>
    <FRAME id="mokuzi" name="migi" src="main\mokuzi.html">
    <NOFRAMES><P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P></NOFRAMES>
  </FRAMESET>
  <NOFRAMES><P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P></NOFRAMES>
  </FRAMESET>
  <NOFRAMES><P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P></NOFRAMES>
</FRAMESET>
 
 
●ChatGPT
以下のコードは、2021年現在のHTMLおよびブラウザで動作するように更新されています。コードの内容はできるだけ変更せず、EdgeやChromeなどのモダンブラウザで動作するようにしました。
 
(以下、省略。ChatGPTが書いたコード。)
 
このコードでは、DOCTYPE宣言を正しく設定し、HTML5の構文に合わせて更新しました。また、`<FRAME>`要素の代わりに`<frame>`要素を使用し、`<noframes>`要素も適切に配置されています。ブラウザのユーザーエージェントの判定部分はそのまま保持されています。ブラウザが最新の規格に対応していることを確認してください。
 
↑うーん。上記に書いてあるように直しただけで、あまり変わらなかった。
(実際は、自分の方である程度、古いコードを直したせいかもしれないと思った。)
 
 
(2)
JavaScriptプログラムの説明】
●User
下記のjavascriptのプログラムの意味を丁寧に教えて
 
(一部こんな感じのを尋ねました)
<script type="text/javascript">
<!--
var obj = new Array;                            
var targetWin = 0;                              
 
function expand( listID, imgID ) {             
  if ( listID.style.display=="none" ) {
    listID.style.display="";
    imgID.src = "../parts/open.gif";
    parent.option.sMenu++;
  } else {
    listID.style.display="none";
    imgID.src = "../parts/close.gif";
    parent.option.sMenu--;
    obj = listID.getElementsByTagName("SPAN");
    for ( j=0; j < obj.length; j++ ) {
      if ( obj[j].style.display == "none" ) continue;
      parent.option.sMenu--;
      obj[j].style.display="none";
    }
    obj = listID.getElementsByTagName("IMG");
    for ( j=0; j< obj.length; j++ ) {
      if ( obj[j].src.indexOf("file.gif") == -1 ) obj[j].src = "../parts/close.gif";
    }
  }
(以下省略。このようなfunctionをいくつか羅列して尋ねました。)
 
●ChatGPT
このJavaScriptプログラムは、ウェブページ内のブックマークの展開とウィンドウ操作に関連する関数と、ページがロードされたときに初期化されるさまざまな処理を提供するものです。以下、各関数と変数について詳細に説明します。
 
1. 変数の宣言:
   - `var obj = new Array;`: `obj` という名前の空の配列を宣言します。これは後で要素の取得に使用されます。
   - `var targetWin = 0;`: `targetWin` という名前の変数を宣言し、0で初期化します。この変数はターゲットウィンドウを管理するためのものです。
 
2. `expand(listID, imgID)` 関数:
   - この関数は、ブックマークがクリックされたときに呼び出される処理です。ブックマークをクリックすると、リスト(`listID`)が展開または折りたたまれ、関連するアイコン(`imgID`)も変更されます。展開すると、アイコンは "open.gif" に変更され、折りたたむと "close.gif" に変更されます。
 
(以下省略。こんな感じで教えてくれました。)
このコードは古いスタイルのJavaScriptで書かれており、`<script>` タグ内に HTML のコメント `<!-- ... -->` が含まれています。一般的な現代のプログラミング慣行では、より新しいJavaScriptの機能やベストプラクティスを使用することが推奨されます。また、このコードは一部のブラウザでは動作しない可能性があるため、注意が必要です。新しいウェブ開発プロジェクトでは、最新のWebテクノロジーを使用することを検討することが重要です。
 
(2)-2
●User
上記のプログラム中、下記の個所について、さらに丁寧に具体的に教えて
(以下省略。上記のプログラムを再掲し、細かく教えてくれるよう依頼)
 
●ChatGPT
このコードは、指定されたブックマーク(listID)の表示/非表示を切り替える関数 `expand(listID, imgID)` です。以下ではこの関数内の具体的な動作を詳細に説明します。
 
1. `if (listID.style.display == "none")`:
(以下省略。1行ごとに教えてくれました。)
 
この関数は、ブックマークの展開と閉じる操作を行うためのもので、ブックマークの要素に対してスタイルの変更やカウンターの更新を行います。
(↑最後にこんな風にまとめてくれます。)
 
(2)-3
●User
上記のうち、下記のプログラムの"SPAN"は何を意味しているのですか?
 
obj = listID.getElementsByTagName("SPAN");
 
●ChatGPT
`obj = listID.getElementsByTagName("SPAN");` の部分で、"SPAN"はHTML要素のタグ名を指定しています。具体的には、`getElementsByTagName` メソッドを使用して、`listID` 要素内で "SPAN" タグ名を持つすべての要素を取得しています。
 
要素のタグ名が "SPAN" の場合、通常はインライン要素の一種で、テキストや他の要素を囲むために使用されます。このコードは、特定の要素グループ(ここでは "SPAN" タグを持つ要素)を取得し、それに対してさまざまな操作を実行するために使用されています。たとえば、このコードでは "SPAN" 要素の表示スタイルを変更したり、カウンターを更新したりするために利用されている可能性があります。
 
(↑さらに細かく教えてくれます。自分がこれでコードを分かるかは別問題ですが。これらのコードの独自の意味というか、全体の流れというか、アルゴリズムをきくことはできるのか疑問に思いました。問い方に工夫が必要か。)
 
 
(3)
今回の目的というか、知りたいことは、javascriptがedgeで動かないことの原因(どこを直せばいいか)だった。
そこで、直接プログラムを修正してというより、以下のやり方を尋ねてみました。
 
JavaScript変数の受け渡し方法】
●User
プログラム・コードについて具体的に教えて下さい。
異なるhtmlファイル間で、javascriptの変数の受け渡しをするにはどうすればいいですか?
方法として、parentやopenerなどを使って受け渡しをしたいです。
 
●ChatGPT
異なるHTMLファイル間でJavaScriptの変数を受け渡す方法として、`window.opener`や`window.parent`を使用することができます。これらのオブジェクトを使用すると、親ウィンドウや開いたウィンドウとの間で情報を共有できます。
 
以下に、これらの方法を具体的なコード例とともに説明します。
 
**方法1: window.openerを使用する**
 
1. 最初のHTMLファイル (parent.html) で変数を設定します:
 
```html
<!-- parent.html -->
 
<!DOCTYPE html>
<html>
<head>
    <title>親ウィンドウ</title>
</head>
<body>
    <script>
        // 変数を設定
        var sharedData = "これは親ウィンドウからのデータです。";
    </script>
    <button onclick="openChildWindow()">子ウィンドウを開く</button>
 
    <script>
        function openChildWindow() {
            // 子ウィンドウを開く
            var childWindow = window.open('child.html', 'childWindow');
        }
    </script>
</body>
</html>
 
2. 2つ目のHTMLファイル (child.html) で`window.opener`を使用して親ウィンドウの変数にアクセスします:
 
```html
<!-- child.html -->
<!DOCTYPE html>
<html>
<head>
    <title>子ウィンドウ</title>
</head>
<body>
    <script>
        // 親ウィンドウから変数を取得
        var parentData = window.opener.sharedData;
        alert(parentData);
    </script>
</body>
</html>
```
 
この方法では、親ウィンドウで設定された`sharedData`変数を子ウィンドウで利用できます。
(以下省略。質問のとおり「**方法2: window.parentを使用する**」も答えてくれます。)
 
(3)-2
上記のコードをデスクトップ上で試したが、うまくいかなかったので、さらに問い合わせました。
 
●User
「方法1: window.openerを使用する」の方法を試しました。edgeで試しました。
parentからの「 "これは親ウィンドウからのデータです。"」が、childでalertされると思ったのですが、
子ウィンドウを開くボタンを押しても、子ウィンドウが開くのみで、alertできません。
どうすればいいですか?
 
●ChatGPT
"window.opener"を使用して親ウィンドウから子ウィンドウにデータを渡す際、以下のポイントに注意する必要があります。特に、セキュリティ上の制約が影響を与えることがあります。
 
1. **同一オリジンポリシー (Same-Origin Policy)**: ウェブブラウザのセキュリティ制約により、異なるオリジン (ドメインプロトコル、ポート) 間での"window.opener"を使用したデータの共有は制限されます。これは、セキュリティのための制約であり、同じオリジン内でのみ動作します。
 
2. **ポップアップブロッカー**: ブラウザのポップアップブロッカーが有効になっている場合、"window.open"で子ウィンドウを開こうとしても、ポップアップがブロックされることがあります。
 
したがって、正常に動作させるためには、以下の手順を確認してください:
 
- 同じドメイン内で動作していることを確認します。異なるオリジン間では"window.opener"を使用してデータを渡すことはできません。
 
- ポップアップブロッカーが無効になっていることを確認します。ブラウザの設定でポップアップブロッカーを無効にするか、ポップアップが許可されるように設定します。
 
もし、これらの条件を満たしているのにも関わらず問題が解決しない場合、ブラウザのバージョンや設定、セキュリティポリシーが影響している可能性があるため、ブラウザの設定を確認してください。また、ブラウザの開発者ツールのコンソールを確認してエラーメッセージが表示されていないかも確認してみてください。エラーメッセージがあれば、それを解決する手助けになるかもしれません。
 
(3)-3
さらに問う。
●User
あなたの説明の中の「同じドメイン内で動作していることを確認します。」の確認方法を教えて下さい。
 
●ChatGPT
ウェブページが同じドメイン内で動作しているかどうかを確認するために、ブラウザのアドレスバーを確認することができます。以下は、確認方法のステップバイステップの説明です。
 
1. **ウェブページを開いているブラウザで、親ウィンドウ(parent.html)のウェブページを表示しているタブを開いてください。**
 
2. **ブラウザのアドレスバーを確認します。** アドレスバーには、現在表示されているウェブページのURLが表示されています。URLは通常、次のような形式です:
 
   ```
   ```
 
   ここで、`https://www.example.com`がドメイン部分です。
 
3. **子ウィンドウを開くボタンをクリックして、子ウィンドウを表示します。** 子ウィンドウのHTMLファイル (child.html) のアドレスバーも確認します。
 
4. **子ウィンドウのアドレスバーを確認します。** 子ウィンドウのアドレスバーにも、現在表示されているウェブページのURLが表示されます。URLが表示されているアドレスバーをクリックして、ドメイン部分を確認します。
 
   ```
   ```
 
   親ウィンドウと子ウィンドウのURLが同じドメインであることを確認してください。例では、両方のウィンドウが同じ `www.example.com` ドメイン内にあると仮定しています。
 
同じドメイン内であれば、"window.opener"を使用してデータを受け渡すことができます。異なるドメインの場合、セキュリティの制約により、この方法は制限されます。セキュリティ上の理由から、異なるオリジン間でのデータ共有は制限されているため、他の方法を検討する必要があります。
 
 
(3)-4
さらに問う。
●User
ブラウザの設定でポップアップブロッカーを無効にするか、ポップアップが許可されるように設定するにはどうすればいいですか?
 
●ChatGPT
ブラウザのポップアップブロッカーを無効にするか、特定のサイトでポップアップを許可する方法は、ブラウザごとに異なります。以下に、一般的なブラウザでの手順を示します。ただし、ブラウザのバージョンによっては、これらの手順が異なる場合がありますので、使用しているブラウザに合わせて適切な手順を選んでください。
 
**Google Chromeを使用している場合:**
(以下省略)
 
(3)-5
「要するに、デスクトップでできるのか?」を問い合わせ
●User
同じドメイン内であればということですが、例えば、同一デスクトップ上のhtml間では、javascriptでの値の受け渡し(parentやopener)は可能でしょうか?
 
●ChatGPT
同じデスクトップ上に配置されたHTMLファイル間では、同一のオリジン (Same-Origin) として扱われることが一般的です。したがって、JavaScriptを使用して変数を受け渡すことができます。これには`window.opener`を使用した方法も含まれます。
 
以下は、同じデスクトップ上に配置されたHTMLファイル間でのJavaScript変数の受け渡しの例です。
 
1. 最初のHTMLファイル (parent.html) で変数を設定します:
 
```html
<!-- parent.html -->
<!DOCTYPE html>
<html>
<head>
    <title>親ウィンドウ</title>
</head>
<body>
    <script>
        // 変数を設定
        var sharedData = "これは親ウィンドウからのデータです。";
    </script>
    <button onclick="openChildWindow()">子ウィンドウを開く</button>
 
    <script>
        function openChildWindow() {
            // 子ウィンドウを開く
            var childWindow = window.open('child.html', 'childWindow');
        }
    </script>
</body>
</html>
```
 
2. 2つ目のHTMLファイル (child.html) で`window.opener`を使用して親ウィンドウの変数にアクセスします:
 
```html
<!-- child.html -->
<!DOCTYPE html>
<html>
<head>
    <title>子ウィンドウ</title>
</head>
<body>
    <script>
        // 親ウィンドウから変数を取得
        var parentData = window.opener.sharedData;
        alert(parentData);
    </script>
</body>
</html>
```
 
この方法は、同じデスクトップ上に配置されたHTMLファイル間でのJavaScript変数の受け渡しに使用できます。同一のオリジン内であるため、セキュリティの制約は適用されません。ただし、デスクトップ上で直接HTMLファイルを開いた場合、通常のウェブブラウザセキュリティが適用されないため、この方法はセキュリティ上の懸念は少ないですが、Webブラウザを使用してHTMLファイルを開く場合とは異なります。デスクトップアプリケーションやローカルなコンピューターリソースへのアクセスが必要な場合、セキュリティに対する十分な注意が必要です。
 
↑これをデスクトップ上でやってみたが、ダメだった。
ここで、問題は、なぜ、デスクトップで、javascriptのwindow.openerやparentを使うとedgeではできないのか(edgeだけでなくfirefoxもダメだった・・・)
(ここでは、書いていないが、window.openerを使わない、親→子のウインドウ表示はデスクトップでもedegeでできた。)
(また、以下のようにコードを書いてみると、デスクトップでは、URLは取れるのに、ドメインは取れないこともchatGTPの答えと合致しない気がして悩む)
 
// URLを取得する
var a = document.URL;
alert(a); 
 
// ドメインを取得する
var b = document.domain;
alert(b);
 
「こんな初歩(シンプルなコード)で、自分は分からないのか・・・」と落胆したが、chatGPTへの問い合わせでなく、ネットで、同じように困っているケースがないか、調べた。
 
あまりはっきりは出なかったが、「サーバー上とデスクトップ(ローカル環境)は異なる」「edgeはセキュリティが強化されていて、ローカル環境では制限がある」というようなの記事があった。(感謝します。)
そこで、デスクトップのedgeを「IEモード」にしてみた。
動きました。
 
結局、「デスクトップ上では、edgeはセキュリティが強化されていて、制限があるので、javascriptのwindow.openerやparentは動かない」ということのようだ。
(そういえば、思い出せないくらい昔、ローカル環境に悩んだ気がする・・・)
 
で、このhtmファイルだが、サーバー上ならあまり変更しなくても動くような気がする。
しかし、このhtmファイル、諸事情で、デスクトップなどローカル環境でしか使わないのです。
だから「今後edgeに更新するなら、javascriptを外そうか・・・」と思い至った次第です。
 
 
結局、自分の能力不足とchatGPTのコーディング外の知識不足のせいで?なかなか解決しなかった・・・という結末でした。
 
(追伸:こちらは素人なので、chatGPTは正しく、自分が間違っているだけかもしれません。IEモードは2029年まで使えるようです。)
chatGPTを使うプロンプトエンジニアリングって何だろうね。