-
スレッドの関数に引数を渡して別々の処理をさせたい場合があると思いますが、 スレッドを生成する時にアドレス指定のところに ParameterizedThreadStart デリゲートを使うことで可能です。
以下に実行プログラムの例を示します。引数があるスレッドの実行プログラム
Imports System Imports System.Threading Module ThreadParam 'メイン関数(エントリーポイント) Sub Main() '[ParameterizedThreadStart]デリゲートを使ったスレッド生成 Dim pThread As Thread = New Thread(New ParameterizedThreadStart(AddressOf ThreadParam)) '(ParameterizedThreadStart)の指定が無くてもOKですが 'Dim pThread As Thread = New Thread(AddressOf ThreadParam) 'スレッド開始 pThread.Start("スレッド...") Console.WriteLine("スレッド開始") End Sub '引数を持つスレッド関数(引数は1個のオブジェクトのみ) Sub ThreadParam(ByVal obj As Object) For i As Integer = 1 To 5 Threading.Thread.Sleep(1000) Console.WriteLine(obj.ToString()) Next End Sub End Module取敢えず、実行結果がコンソールに以下の様に表示されます。
スレッド開始 スレッド... スレッド... スレッド... スレッド... スレッド...
ParameterizedThreadStart の利用は引数が1個なので複数のデータを渡す場合には 配列等(リストオブジェクト等)にして、スレッド関数側で配列の内容について処理を規定する必要があります。
以下に引数をオブジェクトの配列として渡す場合の例を示します。引数があるスレッドの実行プログラム2
Imports System Imports System.Threading Module ThreadParam 'メイン関数(エントリーポイント) Sub Main() '[ParameterizedThreadStart]デリゲートを使ったスレッド生成 Dim pThread As Thread = New Thread(New ParameterizedThreadStart(AddressOf ThreadParam)) 'オブジェクト配列データ設定 Dim arrObj(2) As Object arrObj(0) = "1111" arrObj(1) = 12345 arrObj(2) = True 'スレッド開始 pThread.Start(arrObj) Console.WriteLine("スレッド開始") End Sub '引数を持つスレッド関数(引数は1個のオブジェクトのみ) Sub ThreadParam(ByVal obj As Object) '引数をオブジェクト配列として扱う Dim pArr As Object() = CType(obj, Object()) For i As Integer = 0 To pArr.Length - 1 Threading.Thread.Sleep(1000) Console.WriteLine(pArr(i).ToString()) Next End Sub End Module引数にして渡さなくても、スレッド実行をラップする様なクラスを導入して コンストラクタの引数でデータ型を規定することもできます。
以下に、スレッドを実行するためのクラスを導入した例を示します。スレッドの引数としてクラスでラップした実行プログラム
Imports System Imports System.Threading Module ThreadParam 'メイン関数(エントリーポイント) Sub Main() 'スレッド用クラスの生成 Dim pclsThread As New clsThread(12345, "AAA", False) 'スレッド開始 pclsThread.Start() Console.WriteLine("スレッド開始") End Sub 'スレッド用クラス Class clsThread 'クラス生成時に退避されるデータ群 Private mintData As Integer Private mstrData As String Private mblnData As Boolean 'コンストラクタ Sub New(ByVal aintData As Integer, ByVal astrData As String, ByVal ablnData As Boolean) Me.mintData = aintData Me.mstrData = astrData Me.mblnData = ablnData End Sub '内部スレッドの開始メソッド Sub Start() Dim pThread As Thread = New Thread(AddressOf ThreadProc) 'スレッド開始 pThread.Start() End Sub 'スレッド関数(この関数はプライベート) Private Sub ThreadProc() Threading.Thread.Sleep(1000) Console.WriteLine("Integer Data = " & Me.mintData) Threading.Thread.Sleep(1000) Console.WriteLine("String Data = " & Me.mstrData) Threading.Thread.Sleep(1000) Console.WriteLine("Boolean Data = " & Me.mblnData) End Sub End Class End Module実行結果は以下の様に表示されます。
スレッド開始 Integer Data = 12345 String Data = AAA Boolean Data = False
スレッドを含む処理をクラスの中に入れ込んで、 その中で開始や停止などを行った方がスレッド処理を呼出す側との処理の分離がうまくいくと思います。
PR -
名前付きパイプを使った複数クライアントプログラムとの通信の説明は以下の記事で行いましたが、 今回はこれにクライアントとの双方向通信が出来る様に変更してみました。
⇒名前付きパイプを使ったプロセス間通信についてその2(複数クライアントとの通信)
双方向と言っても、クライアント側からサーバー側に送信されてきた文字列に、応答の為に少しの文字列を付加してクライアント側に送信する処理を考えます。
サーバー側の変更個所は以下の通りです。- 通信スレッドの中でストリーム読込を生成を行った後で、ストリーム書込を生成します。
- 処理ループの中でストリーム読込を行った後で、受信した文字列に「...OK」の文字列を付加してストリーム書込を行います。
サーバー側プログラム
Imports System.Threading Imports System.IO Imports System.IO.Pipes Public Class frmNameServer '別スレッドからメッセージを処理するためデリゲートを利用 Delegate Sub SetRichTextBox1Delegate(ByVal Value As String) Private RichTextBox1Delegate As New SetRichTextBox1Delegate(AddressOf _ AppendTextRichTextBox1) 'リッチテキストボックスにメッセージを表示する Private Sub AppendTextRichTextBox1(ByVal message As String) RichTextBox1.AppendText(message) RichTextBox1.SelectionStart = RichTextBox1.TextLength End Sub '別スレッドからボタンの許可設定処理するためデリゲートを利用 Delegate Sub SetButton1EnabledDelegate(ByVal bln As Boolean) Private SetButton1Delegate As New SetButton1EnabledDelegate(AddressOf _ SetButton1Enabled) '[Buttin1]のEnabled設定 Private Sub SetButton1Enabled(ByVal blnEnabled As Boolean) Me.Button1.Enabled = blnEnabled End Sub 'サーバスレッドの数 Private Const numThreads As Integer = 3 'サーバスレッド配列 Private arrServer(numThreads - 1) As Thread 'サーバスレッド終了フラグ件数 Private intServerFinish As Integer = 0 '[Start NamePipe]ボタンクリックイベント Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click intServerFinish = 0 '名前付きパイプによる通信スレッド開始 For i = 0 To UBound(arrServer) arrServer(i) = New Thread(AddressOf ServerThread) arrServer(i).Start() Next AppendTextRichTextBox1("名前付きパイプ通信待機中・・・" & vbNewLine) '[Start NamePipe]ボタン不可設定 Me.Button1.Enabled = False End Sub '名前付きパイプによる通信スレッド Private Sub ServerThread() 'サーバー用のパイプを双方向でクライアント数は指定値で生成 Dim pipeServer As New NamedPipeServerStream("PIPE_TEST", PipeDirection.InOut, numThreads) Try 'パイプスレッド取得 Dim threadId As Integer = Thread.CurrentThread.ManagedThreadId Me.Invoke(RichTextBox1Delegate, _ New Object() {"パイプ生成完了(スレッドID:" & threadId & ")" & vbNewLine}) 'パイプの接続を待つ pipeServer.WaitForConnection() Me.Invoke(RichTextBox1Delegate, _ New Object() {"パイプ接続完了(スレッドID:" & threadId & ")" & vbNewLine}) 'ストリーム読込を生成 Dim pipeStreamReader As New StreamReader(pipeServer) 'ストリーム書込を生成 Dim pipeStreamWriter As New StreamWriter(pipeServer) pipeStreamWriter.AutoFlush = True Try While True 'パイプからの文字列受信(入力) Dim strRead As String = pipeStreamReader.ReadLine() 'ストリームの末尾に到達した場合はNullなので、通信を終了する If strRead = "" Then Exit While End If '受信文字列の表示 Me.Invoke(RichTextBox1Delegate, _ New Object() {"受信文字列(スレッドID:" & threadId & "):" & strRead & vbNewLine}) '受信文字列に「...OK」を追加して返す Dim strTX As String = strRead & "...OK" pipeStreamWriter.WriteLine(strTX) Me.Invoke(RichTextBox1Delegate, _ New Object() {"受信文字列(スレッドID:" & threadId & "):" & strTX & vbNewLine}) End While Catch ex As IOException MsgBox(ex.Message) Finally pipeStreamReader.Close() '基になるストリームも閉じられるので 'pipeStreamWriter.Close() 'この close はエラーになるので実行しない!! End Try Me.Invoke(RichTextBox1Delegate, New Object() {"パイプ通信の終了" & vbNewLine}) intServerFinish += 1 If intServerFinish >= numThreads Then '[Button1]の許可設定 Me.Invoke(SetButton1Delegate, New Object() {True}) End If Catch ex As Exception MsgBox(ex.Message) Finally pipeServer.Close() End Try End Sub End Class
クライアント側の変更個所は以下の通りです。- パイプ用ストリーム読込オブジェクトを静的変数で宣言し、[Start Named Pipe]ボタンクリック時イベントで生成します。
- [Send Message]ボタンクリック時イベントでサーバーへ文字列を送信後、空文字でなければサーバーからの応答を受信し表示します。 尚、送信文字列が空文字の場合は、パイプ用ストリーム読込オブジェクトをCloseします。
- フォーム上に受信文字列を表示するTEXTBOXを追加します。
クライアント側プログラム
Imports System.IO.Pipes Imports System.IO Imports System.Security.Principal Public Class frmNameClient '名前付きパイプ・クライアント Private pipeStream As NamedPipeClientStream = Nothing 'パイプ用ストリーム書込 Private pipeSw As StreamWriter = Nothing 'パイプ用ストリーム読込 Private pipeSr As StreamReader = Nothing 'フォームロード時イベント Private Sub frmNameClient_Load(sender As Object, e As EventArgs) Handles Me.Load '[Start Named Pipe]ボタンを許可設定 Me.Button1.Enabled = True '[Send Message]ボタンを不可設定 Me.Button2.Enabled = False End Sub '[Start Named Pipe]ボタンクリック時イベント Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try '名前付きパイプ・クライアント生成 pipeStream = New NamedPipeClientStream(".", "PIPE_TEST", _ PipeDirection.InOut, PipeOptions.None, _ TokenImpersonationLevel.Impersonation) '名前付きパイプ接続 pipeStream.Connect(1000) 'ストリーム書込生成 pipeSw = New StreamWriter(pipeStream) pipeSw.AutoFlush = True 'ストリーム読込生成 pipeSr = New StreamReader(pipeStream) '[Start Named Pipe]ボタンを不可設定 Me.Button1.Enabled = False '[Send Message]ボタンを許可設定 Me.Button2.Enabled = True Catch ex As Exception MsgBox(ex.Message) End Try End Sub '[Send Message]ボタンクリック時イベント Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Try '送信文字列取得 Dim strTX As String = Me.TextBox1.Text.Trim Me.TextBox1.Text = "" '送信 pipeSw.WriteLine(strTX) If strTX = "" Then 'ストリーム書込を閉じる pipeSw.Close() 'ストリーム読込を閉じる pipeSr.Close() '名前付きパイプを閉じる pipeStream.Close() '[Start Named Pipe]ボタンを許可設定 Me.Button1.Enabled = True '[Send Message]ボタンを不可設定 Me.Button2.Enabled = False Else '送信後、サーバーからの応答を受信 Dim strRead As String = pipeSr.ReadLine '受信文字列を表示 Me.TextBox2.Text = strRead End If Catch ex As Exception MsgBox(ex.Message) End Try End Sub 'フォームクローズ時イベント Private Sub frmNameClient_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed 'ストリーム書込を閉じる If Not pipeSw Is Nothing Then pipeSw.Close() End If 'ストリーム読込を閉じる If Not pipeSr Is Nothing Then pipeSr.Close() End If '名前付きパイプを閉じる If Not pipeStream Is Nothing Then pipeStream.Close() End If End Sub End Classサーバー側のEXEを実行した後、クライアントEXEを3個実行します。 その後、サーバー側の「Start NamePipe」ボタンを押下して、各クライアントの「Start Name Pipe」ボタンを順次押下します。 各クライアント側で送信文字列を入力して「Send Message」ボタンを押下した結果の画像です。 送信した文字列に「...OK」の文字列が追加されて送信されてくる様子が分かります。
尚、以下は各クライアント側で送信文字列をクリアして「Send Message」ボタンを押下して一連の処理を終了した結果の画像です。関連する記事
⇒名前付きパイプを使ったプロセス間通信について
⇒名前付きパイプを使ったプロセス間通信についてその2(複数クライアントとの通信)
⇒Remoting の IPC を使ったプロセス間通信について
⇒Remoting の IPC を使ったプロセス間通信についてその2(HTTPチャネル)
-
名前付きパイプを使ったクライアントプログラムとの通信の説明は以下の記事で行いましたが、 今回はこれを複数のクライアントとの通信が出来る様に変更してみました。
⇒名前付きパイプを使ったプロセス間通信について
変更個所は、通信開始の時にサーバー処理のスレッドを複数立ち上げて、別々のクライアントからの受信をそれぞれのスレッドで受ける様にします。 サーバースレッドの終わりでは、スレッドの終了をスレッドの個数分終わった時点で、再度の通信開始のボタンを押下出来る様にしています。
今回のサーバースレッドの起動数は3個に抑えてありますし、スレッドの終了判定などが適当ですので改良の余地はありますが。サーバー側プログラム
Imports System.Threading Imports System.IO Imports System.IO.Pipes Public Class frmNameServer '別スレッドからメッセージを処理するためデリゲートを利用 Delegate Sub SetRichTextBox1Delegate(ByVal Value As String) Private RichTextBox1Delegate As New SetRichTextBox1Delegate(AddressOf _ AppendTextRichTextBox1) 'リッチテキストボックスにメッセージを表示する Private Sub AppendTextRichTextBox1(ByVal message As String) RichTextBox1.AppendText(message) RichTextBox1.SelectionStart = RichTextBox1.TextLength End Sub '別スレッドからボタンの許可設定処理するためデリゲートを利用 Delegate Sub SetButton1EnabledDelegate(ByVal bln As Boolean) Private SetButton1Delegate As New SetButton1EnabledDelegate(AddressOf _ SetButton1Enabled) '[Buttin1]のEnabled設定 Private Sub SetButton1Enabled(ByVal blnEnabled As Boolean) Me.Button1.Enabled = blnEnabled End Sub 'サーバスレッドの数 Private Const numThreads As Integer = 3 'サーバスレッド配列 Private arrServer(numThreads - 1) As Thread 'サーバスレッド終了フラグ件数 Private intServerFinish As Integer = 0 '[Start NamePipe]ボタンクリックイベント Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click intServerFinish = 0 '名前付きパイプによる通信スレッド開始 For i = 0 To UBound(arrServer) arrServer(i) = New Thread(AddressOf ServerThread) arrServer(i).Start() Next AppendTextRichTextBox1("名前付きパイプ通信待機中・・・" & vbNewLine) '[Start NamePipe]ボタン不可設定 Me.Button1.Enabled = False End Sub '名前付きパイプによる通信スレッド Private Sub ServerThread() 'サーバー用のパイプを双方向でクライアント数は指定値で生成 Dim pipeServer As New NamedPipeServerStream("PIPE_TEST", PipeDirection.InOut, numThreads) Try 'パイプスレッド取得 Dim threadId As Integer = Thread.CurrentThread.ManagedThreadId Me.Invoke(RichTextBox1Delegate, _ New Object() {"パイプ生成完了(スレッドID:" & threadId & ")" & vbNewLine}) 'パイプの接続を待つ pipeServer.WaitForConnection() Me.Invoke(RichTextBox1Delegate, New Object() {"パイプ接続完了(スレッドID:" & threadId & ")" & vbNewLine}) 'ストリーム読込を生成 Dim pipeStreamReader As New StreamReader(pipeServer) Try While True 'パイプからの文字列受信(入力) Dim strRead As String = pipeStreamReader.ReadLine() 'ストリームの末尾に到達した場合はNullなので、通信を終了する 'If strRead Is Nothing Then If strRead = "" Then Exit While End If '受信文字列の表示 Me.Invoke(RichTextBox1Delegate, New Object() {"受信文字列(スレッドID:" & threadId & "):" & strRead & vbNewLine}) End While Catch ex As IOException MsgBox(ex.Message) Finally pipeStreamReader.Close() End Try 'invokeTextBox(dlg, "パイプ通信を終了します。") Me.Invoke(RichTextBox1Delegate, New Object() {"パイプ通信の終了" & vbNewLine}) intServerFinish += 1 If intServerFinish >= numThreads Then '[Button1]の許可設定 Me.Invoke(SetButton1Delegate, New Object() {True}) End If Catch ex As Exception MsgBox(ex.Message) Finally pipeServer.Close() End Try End Sub End Class
クライアント側プログラムは「名前付きパイプを使ったプロセス間通信について」のものと変わっていません。クライアント側プログラム
Imports System.IO Imports System.IO.Pipes Imports System.Security.Principal Public Class frmNameClient '[Start Named Pipe]ボタンクリック時イベント Private Sub ButtonSend_Click(sender As Object, e As EventArgs) _ Handles ButtonSend.Click Dim pipeStream As NamedPipeClientStream = Nothing Dim pipeSw As StreamWriter = Nothing Try '[Send Message]ボタンを不可設定 Me.ButtonSend.Enabled = False '名前付きパイプ・クライアント生成 pipeStream = New NamedPipeClientStream(".", "PIPE_TEST", _ PipeDirection.InOut, _ PipeOptions.None, _ TokenImpersonationLevel.Impersonation) '名前付きパイプ接続 pipeStream.Connect(1000) 'ストリームライタ pipeSw = New StreamWriter(pipeStream) pipeSw.AutoFlush = True '文字列送信 pipeSw.WriteLine(Me.TextBox1.Text.Trim) Catch ex As Exception MsgBox(ex.Message) Finally 'ストリームライタを閉じる If Not pipeSw Is Nothing Then pipeSw.Close() End If '名前付きパイプを閉じる If Not pipeStream Is Nothing Then pipeStream.Close() End If '[Send Message]ボタンを許可設定 Me.ButtonSend.Enabled = True End Try End Sub End Classサーバー側のEXEを実行した後、クライアントEXEを3個実行します。 その後、サーバー側の「Start NamePipe」ボタンを押下して、各クライアントの「Start Name Pipe」ボタンを順次押下します。 各クライアント側で送信文字列を入力して「Send Message」ボタンを押下した結果の画像です。
尚、以下は各クライアント側で送信文字列をクリアして「Send Message」ボタンを押下して一連の処理を終了した結果の画像です。関連する記事
⇒Remoting の IPC を使ったプロセス間通信について
⇒Remoting の IPC を使ったプロセス間通信についてその2(HTTPチャネル)
⇒名前付きパイプを使ったプロセス間通信について
⇒名前付きパイプを使ったプロセス間通信についてその3(クライアントとの双方向通信)
-
通常、Javascriptの関数等をまとめた外部Javascriptファイル(JSファイル と略します)を、HTML内の head 内で指定しますが、 別の外部JSファイルに入れ替えたい場合もあります。
そこで今回は、この外部JSファイルを別のファイルに変更する方法について説明します。■外部JSファイルを使うHTMLファイル
外部JSファイル test-script-chg1.js がこのHTMLファイルと同じディレクトリに存在することにします。
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>test jQuery</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="test-script-chg1.js"></script> </head> <body> <p>メッセージあああ</p> <div> <p class="msgchg1">メッセージ1</p> <p class="msgchg2">メッセージ2</p> <p class="msgchg3">メッセージ3</p> </div> <p class="msgchg4">メッセージ6</p> <button class="btn1">TEXT変更</button> <button class="btn2">SCRIPT変更</button> </body> </html>■外部JSファイル:test-script-chg1.js
$(function () { //<button class="btn1">のクリックイベントの関数を宣言 $(".btn1").click(function(){ //<div>要素内の<p>の全てのTEXTを変更 $("div p").text("ああああああああ"); }); //<button class="btn2">のクリックイベントの関数を宣言 $(".btn2").click(function(){ //最初のスクリプトを削除 $("script[src='test-script-chg1.js']").remove(); //別のスクリプトを生成 var src = $("<script>").attr({ "type": "text/javascript", "src": "test-script-chg2.js" }); //スクリプト追加 $("head").append(src); //以下の方法でもOK //$("<script>").attr("type","text/javascript").attr("src", "test-script-chg2.js").appendTo("head"); //ボタンを不可設定 $(".btn2").prop('disabled', true); }); });このJSファイルは、.btn1 と .btn2 のクリックイベント関数を宣言しています。
.btn2 のクリックイベント関数で最初に読込んだJSファイル test-script-chg1.js を削除し、 新しい test-script-chg2.js を読込んでいます。
JSファイルを削除するセレクタの指定がミソなのですが、 このセレクタはHTML要素の script に対して script の引数が test-script-chg1.js であるものを示します。
これは属性フィルタと呼ばれるもので、以下の様に指定します。$("[属性名='属性フィルタ値']")「=」 は演算子でこの場合は「属性フィルタ値」と完全に等しいものが対象になります。
演算子は 「=」 の他に以下の様なものが在ります。- != ... 指定した「属性フィルタ値」と異なる要素
- ^= ... 指定した「属性フィルタ値」と前方一致する要素
- $= ... 指定した「属性フィルタ値」と後方一致する要素
- *= ... 指定した「属性フィルタ値」と部分一致する要素
- ~= ... 指定した「属性フィルタ値」と単語として一致する要素
実際に以下を動作させると、「SCRIPT変更」ボタン押下後は、「TEXT変更」ボタン押下時に div タグ内の全ての p タグのテキストが「いいいいいいい」に変わります。 「ああああああああ」ではないことに注意して下さい。
⇒Javascriptファイルの動的に変更の例
■動的に読込まれる外部JSファイル:test-script-chg2.js
$(function () { //<button class="btn1">のクリックイベントの関数を宣言 $(".btn1").click(function(){ //<div>要素内の<p>の全てのTEXTを変更 $("div p").text("いいいいいいい"); }); });
-
前回は jQuery のセレクタの使い方の基本的な方法として HTMLの要素 , id名 , class名 を単独での使い方を説明しましたが、 今回はそれらを複合的に組み合わせて使う方法について説明します。
組み合わせの方法としては、AND的な方法とOR的な方法があります。 AND的な方法とはセレクタの中で要素を連続で記述し、要素を絞り込むことです。 OR的な方法とはセレクタを列挙してどれにでも該当させることです。
■「HTMLの要素」AND「HTMLの要素」
HTMLの要素同士のANDのセレクタの例を以下に示します。
ボタンクリックイベントの関数宣言の中で div タグと p タグのAND指定を行っています。
2つのdiv タグと p タグの指定の間には空白を入れます。空白が無いと別々のものと判定ができません。
ボタンをクリックした時に全ての div タグで囲まれたHTML要素の内部の全ての p タグのテキストが「ああああああああ」に変わります。<html> <head> <meta charset="utf-8"> <title>test jQuery</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <p>メッセージあああ</p> <div> メッセージ0<br /> <p>メッセージ1</p> <p>メッセージ2</p> <p>メッセージ3</p> </div> <p>メッセージいいい</p> <div> <p>メッセージ4</p> </div> <button class="btn">変更</button> <script> $(function () { //<button class="btn">のクリックイベントの関数を宣言 $(".btn").click(function(){ //<div>要素内の<p>の全てのTEXTを変更 $("div p").text("ああああああああ"); }) }); </script> </body>上の例を以下に実際のHTMLで示します。
⇒「HTMLの要素」AND「HTMLの要素」の例
■「HTMLの要素」AND「class名」
HTMLの要素とclass名のANDのセレクタの例を以下に示します。
div タグと class名 指定を連続して指定します。 class名 指定は先頭に .(ドット) を付けます。
この連結する時に「HTML要素名」と「class名」の間に空白を入れない場合と入れる場合で意味合いが異なります。
空白を入れない場合は指定した「HTML要素名」のclassが、指定した「class名」であるものが対象となります。
また、空白を入れる場合は指定した「HTML要素名」の中のHTML要素でclassが指定した「class名」であるものが対象となります。
以下の例では、ボタンのクリック関数の最初の処理で <div class="msgchg"> のテキストが全て「ああああああああ」に変わります。 (注意するのは <p>メッセージA</p> が全て「ああああああああ」に置き換わることです)
2番目の処理では div タグで囲まれたHTML要素の内部の class="msgchg" の p タグのテキストが「いいいいいいいい」に変わります。<html> <head> <meta charset="utf-8"> <title>test jQuery</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <p>メッセージあああ</p> <div class="msgchg"> <p>メッセージA</p> </div> <div> メッセージ0<br /> <p class="msgchg">メッセージ1</p> <p>メッセージ2</p> <p>メッセージ3</p> </div> <p>メッセージいいい</p> <button class="btn">変更</button> <script> $(function () { //<button class="btn">のクリックイベントの関数を宣言 $(".btn").click(function(){ //<div>要素の<class="msgchg">の全てのTEXTを変更 $("div.msgchg").text("ああああああああ"); //<div>要素内の要素が<class="msgchg">の全てのTEXTを変更 $("div .msgchg").text("いいいいいいいい"); }); }); </script> </body> </html>上の例を以下に実際のHTMLで示します。
⇒「HTMLの要素」AND「class名」
■「class名」AND「class名」
「class名」同士のANDのセレクタの例を以下に示します。class名 指定は先頭に .(ドット) を付けます。
この連結する時に「class名」と「class名」の間に空白を入れない場合と入れる場合で意味合いが異なります。
空白を入れない場合は、classの中が複数指定された「class名」を持つHTML要素が対象となります。
また、空白を入れる場合は最初に指定した「class名」を持つHTML要素内部に、2番目に指定した「class名」持つHTML要素が対象となります。
以下の例では、 ボタンのクリック関数の最初の処理でclassが class="divchg msgchg" のテキストが全て「ああああああああ」に変わります。 (「メッセージ3」「メッセージ4」のところが「ああああああああ」となります)
2番目の処理ではclassが class="divchg" のHTML要素の内部のclassが class="msgchg" のHTML要素のテキストが「いいいいいいいい」に変わります。 (注意するのは「メッセージ3」のところが2つの処理に該当するため、表示が「いいいいいいいい」となります)<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>test jQuery</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <p>メッセージあああ</p> <div class="divchg"> メッセージ0<br /> <p class="msgchg">メッセージ1</p> <p>メッセージ2</p> <p class="divchg msgchg">メッセージ3</p> </div> <p>メッセージいいい</p> <div> <p class="divchg msgchg">メッセージ4</p> </div> <button class="btn">変更</button> <script> $(function () { //<button class="btn">のクリックイベントの関数を宣言 $(".btn").click(function(){ //1個の要素のクラスが<class="divchg msgchg">の全てのTEXTを変更 $('.divchg.msgchg').text("ああああああああ"); //<class="divchg">の<div>要素内の<class="msgchg">の全てのTEXTを変更 $('.divchg .msgchg').text("いいいいいいいい"); }); }); </script> </body> </html>上の例を以下に実際のHTMLで示します。
⇒「class名」AND「class名」
■「class名」OR「class名」
「class名」同士のORのセレクタの例を以下に示します。class名 指定は先頭に .(ドット) を付けます。
「class名」を ,(カンマ) で連結することで指定された「class名」を持ったHTML要素が対象となります。
以下の例では、classが class="msgchg1" class="msgchg2" class="msgchg5" class="msgchg6" の要素のテキストが全て「ああああああああ」に変わります。<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>test jQuery</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> </head> <body> <p>メッセージあああ</p> <div> <p class="msgchg1">メッセージ1</p> <p class="msgchg2">メッセージ2</p> <p class="msgchg3">メッセージ3</p> </div> <p class="msgchg4">メッセージ4</p> <div> <p class="msgchg5">メッセージ5</p> </div> <p class="msgchg6">メッセージ6</p> <button class="btn">変更</button> <script> $(function () { //<button class="btn">のクリックイベントの関数を宣言 $(".btn").click(function(){ //指定された複数クラスの要素のTEXTを変更 $('.msgchg1,.msgchg2,.msgchg5,.msgchg6').text("ああああああああ"); }); }); </script> </body> </html>上の例を以下に実際のHTMLで示します。
⇒「class名」OR「class名」