回答編集履歴

2

Webブラウザ→Webサーバ

2020/12/24 12:08

投稿

miyabi-sun
miyabi-sun

スコア21203

test CHANGED
@@ -364,9 +364,9 @@
364
364
 
365
365
  JS上のonchangeイベントは
366
366
 
367
- Webブラウザとは何の関係もありません。
367
+ Webサーバとは何の関係もありません。
368
-
368
+
369
- Webブラウザの仕事はHTTPリクエストを待ち受け、適切なHTTPレスポンスを返すことだけが仕事です。
369
+ Webサーバの仕事はHTTPリクエストを待ち受け、適切なHTTPレスポンスを返すことだけが仕事です。
370
370
 
371
371
  ブラウザがHTMLを受け取って画面を描画している時点でWebサーバの仕事は終わっています。
372
372
 

1

イベントに関しての追記を追加

2020/12/24 12:08

投稿

miyabi-sun
miyabi-sun

スコア21203

test CHANGED
@@ -343,3 +343,173 @@
343
343
 
344
344
 
345
345
  こういう感じになっていくはずです。
346
+
347
+
348
+
349
+ ---
350
+
351
+
352
+
353
+ > htmlのテキストボックスのonchangeイベントをnode.jsで処理する方法はあるでしょうか?
354
+
355
+
356
+
357
+ ありません。
358
+
359
+ まぁ、言いたい内容はわかりますし実現は出来るんですが、
360
+
361
+ どのレイヤーかをちゃんと押さえておく必要があります。
362
+
363
+
364
+
365
+ JS上のonchangeイベントは
366
+
367
+ Webブラウザとは何の関係もありません。
368
+
369
+ Webブラウザの仕事はHTTPリクエストを待ち受け、適切なHTTPレスポンスを返すことだけが仕事です。
370
+
371
+ ブラウザがHTMLを受け取って画面を描画している時点でWebサーバの仕事は終わっています。
372
+
373
+
374
+
375
+ JavaScript(以下JS)とNode.jsこれは全く違うものです。
376
+
377
+ ブラウザがHTMLを受取り、DOMツリー構築を行い画面レンダリングを行った後に、
378
+
379
+ DOMツリーを後から書き換えて画面の更新をするものがJSです。
380
+
381
+
382
+
383
+ JSにはブラウザ上でDOMを書き換える機能しかありません。
384
+
385
+
386
+
387
+ Node.jsはJSをRubyやPythonのような汎用スクリプト言語として使いたい人が居まして、
388
+
389
+ 変数や配列等のメモリ確保等の機能はGoogle社が開発しているV8エンジンを借りてきて
390
+
391
+ C++で作ったOSの機能を使うモジュール、ファイルの読み書き、外部ライブラリ読み込み、自由なネットワーク通信などなど……の機能を継ぎ足して完成した魔改造JSがNode.jsです。
392
+
393
+
394
+
395
+ Node.jsというJSファイルが動作する汎用スクリプト言語は人気が出ましたが、
396
+
397
+ JSそのものはブラウザ上でDOMツリーを書き換える言語でしかありません。
398
+
399
+ それが質問に対する回答「ありません」になります。
400
+
401
+
402
+
403
+ じゃあそれをどうやって実現させるか?
404
+
405
+
406
+
407
+ - [Ajax](https://ja.wikipedia.org/wiki/Ajax)
408
+
409
+ - [WebSocket](https://developer.mozilla.org/ja/docs/Web/API/WebSockets_API)
410
+
411
+
412
+
413
+ 基本的にはAjaxを実装する方針が無難です。
414
+
415
+ JSではブラウザの力を借りてHTTPリクエストを飛ばす事が出来ます。
416
+
417
+
418
+
419
+ ブラウザに渡すHTMLをこんなふうに作っておきます。
420
+
421
+ すると、`div`要素をクリックすると、
422
+
423
+ [Fetch API](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API)の機能を使ってWebサーバの`/api/data`にデータを取りに行きます。
424
+
425
+
426
+
427
+ ```html
428
+
429
+ <script>
430
+
431
+ const getData = () => {
432
+
433
+ // JSONを期待して変換するロジックを組んでみた
434
+
435
+ fetch("/api/data")
436
+
437
+ .then(res => res.json())
438
+
439
+ .then(data => {
440
+
441
+ console.log(data);
442
+
443
+ });
444
+
445
+ }
446
+
447
+ </script>
448
+
449
+ <div onclick="getData()">
450
+
451
+ aaa
452
+
453
+ </div>
454
+
455
+ ```
456
+
457
+
458
+
459
+ Node.jsのWebサーバも準備しましょう。
460
+
461
+ 上記では`/api/data`に向かってHTTPリクエストを出しているはずなので、
462
+
463
+ `/api/data`のパスにHTTPリクエストが飛んできたら受け取れるようにしておきます。
464
+
465
+
466
+
467
+ ```js
468
+
469
+ const express = require("express");
470
+
471
+
472
+
473
+ const app = express();
474
+
475
+ const port = 3000; // まずは3000番等で様子見
476
+
477
+
478
+
479
+ app.get('/', (req, res) => {
480
+
481
+ res.send('Hello World!')
482
+
483
+ });
484
+
485
+
486
+
487
+ app.get('/api/data', (req, res) => {
488
+
489
+ // こんな風にJSONを返す
490
+
491
+ res.json({
492
+
493
+ id: 1,
494
+
495
+ name: "taro"
496
+
497
+ });
498
+
499
+ })
500
+
501
+
502
+
503
+ app.listen(port, () => {
504
+
505
+ console.log(`Example app listening at http://localhost:${port}`)
506
+
507
+ });
508
+
509
+ ```
510
+
511
+
512
+
513
+ このような流れを設計・作成し、
514
+
515
+ 二人三脚で作っていく形になります。