Javascript (カレンダー013_Nodeへ移す3(jQuery調べ))

■カレンダーのjavascriptをNodeへ移すためのより道

カレンダーのjavascriptの中で、jQueryを使って、カレンダー内の要素をクリックすると入力画面が出るようにしているけど、nodeで実行した場合、クリックしても反応しない。カレンダーのコードの問題なのか、nodeの問題なのかよくわからないので、簡単なjQueryを試してみる。

まず簡単なhtmlを用意する。

<html>
<body>
<script type="text/javascript" src="jquery-3.5.1.min.js"></script>
<div id="aaa"><p id="aaaid">AAA</p><div><br>
<div id="text-button"><p id="text">Click</p></div>
<script>
document.getElementById("text-button").onclick = function() {
  document.getElementById("text").innerHTML = "text onclick";
};
$("#aaa").click(function(){
      $("#aaaid").append("bbb")
  });
</script>
</body>
</html>

このhtmlをブラウザで開くとAAAとClickの文字が出る。Clickをクリックすると、document.getElementByIdの部分が反応して、「text onclick」の文字に置き換わる。AAAをクリックすると、$("#aaa").clickのjQueryの部分が反応して、「bbb」が文字に追加される(なぜかClickをクリックしても「bbb」が追加されてしまうが)。
これと似たコードと他の検証用のコードをrequestHandlers.jsに組み入れ実行してみる。index.js, router.js, server.jsには特に手を付けない。実行してアクセスした画面が下のもの。

nodeの起動は成功し、localhost:8888へのアクセスもできたが、$ is not definedといったエラーは出ている。組み入れたコードは宣言(<script type="text/javascript" src="jquery-3.5.1.min.js">)を除いており、jQueryの参照がないため出ているよう。ただ、上のhtmlと同じように宣言を入れても、ファイルがないといったエラーが出る。
GET http://localhost:8888/jquery-3.5.1.min.js net::ERR_ABORTED 404 (Not Found)

画面に出たものの挙動を確認すると、Click部分をクリックするとブラウザで確認したとおり、「text onclick」の文字に置き換わる。エラーが出ているjQueryの部分(AAAのクリック)はやはり動作しない。また、画面読み込み時に、console.log($("#aaa").text());は正しくコンソールに表示された。requestHandlers.jsでもrequire('jquery')としてjQueryを読み込んでいるが、こちらは機能しているよう。でも、$("#aaa").click(function()の使い方はできないみたい。

まとめると下記のようになった(下にrequestHandlers.jsのコードを付ける)。
1. Nodeプログラム中の$("(jQueryでのid参照)").textは可能。
2. Nodeプログラム中の$("(jQueryでのid参照)").clickは不可。
3. Nodeプログラム中のdocument.getElementById("(id参照)").onclickは不可。
4. Nodeプログラムへのhtml書き込み、html読み込みの$("(jQueryでのid参照)").clickは不可。
5. Nodeプログラムへのhtml書き込み、html読み込みのdocument.getElementById("(id参照)").onclickは可能。

nodeを使用する際にjQueryを使用するのは一般的でないのかな。もっと別のフレームワークを使えば、今JQueryで対応している入力画面をそのままにnodeへ移動できるかもしれないけど、気力もないので、jQueryを使わず移動できないか試してみる。

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const jquery = require('jquery');

var events = require('events')
var eventEmitter = new events.EventEmitter()

var fs = require('fs');

function start(response, postData) {

body = `
<html>
<body>
<script type="text/javascript" src="jquery-3.5.1.min.js"></script>
<div id="aaa">AAA<div><br>
<div id="text-button"><p id="text">Click</p></div>
<script>
document.getElementById("text-button").onclick = function() {
  document.getElementById("text").innerHTML = "text onclick";
  console.log('jsdom click');
};
$("#aaa").click(function(){
  $("#aaaid").append("bbb")
  console.log('jsdom click');
});
</script>
</body>
</html>`;

const dom = new JSDOM(body);
const { document } = dom.window;
const $ = jquery(dom.window);

//jsdom click display
document.onclick=function(e){
console.log('jsdom click display');
};

//jsdom click display ver 2 
//=============================上本文の3番===========================
document.getElementById("text-button").onclick = function() {
  console.log('jsdom click display ver2');
  document.getElementById("text").innerHTML = "text onclick";
};


//jQuery sample display
console.log($("#aaa"));
//=============================上本文の1番===========================
console.log($("#aaa").text());
console.log($("#aaa")[0].id);
console.log($("#aaa").width());
console.log($("#aaa").append('bbbbbbbbbbbbb'));
console.log($("#aaa").text());

//jQuery click display
//=============================上本文の2番===========================
$("#aaa").click(function(){
console.log("jQuery click display");
});

response.writeHead(200, {"Content-Type": "text/html"});
response.write(body);
response.end();


eventEmitter.on('click', function () {
  console.log('click!')
})


//=============================上本文の4, 5番(html読み込み===========
//上のresponse.writeHeadからの3行と重複するのでコメントをつけたりして入れ替えている。
//fs.readFile('./text.html', 'utf-8' , doReard );
//function doReard(err, data) {
//      response.writeHead(200, {'Content-Type': 'text/html'});
//      response.write(data);
//      response.end();
//   }
}



function upload(response, postData) {
}

exports.start = start;
exports.upload = upload;