JavaScript/jQuery {Article014}

説明文の表示 ライブデモを見る▶
ようこそ「JavaScript/jQuery」へ...

ASP.NETのトレース機能(Trace.Write, Trace.Warn)をJavaScriptに組み込む

ASP.NETにはトレース機能があってデバッグするときとても便利です。 プログラムをデバッグするときに「Trace.Write()」または「Trace.Warn()」でデバッグに必要な情報をWebページ上に表示させることができます。 JavaScriptにも「console.log()」「console.warn()」「console.error()」などがありますがデバッグ情報はブラウザのコンソールウィンドウ(※)上に表示されます。 ここではASP.NETのWebページにトレース情報を表示するJavaScript版の「TraceWrite()」を紹介します。 ASP.NETのListViewとObjectDataSourceのイベントをトレースするサンプルは「Article022」で紹介しています。 AmazonのMWS APIのレスポンスをトレースするサンプルは、 「Article005 - Amazon JP」 「Article006 - Amazon US」 「Article007 - Amazon CA」 「Article008 - Amazon AU」で紹介しています。 また、AmazonのMWS APIのレスポンスをXML形式で表示するサンプルは、 「Article001 - Amazon JP」 「Article002 - Amazon US」 「Article003 - Amazon CA」 「Article004 - Amazon CA」で紹介しています。

click image to zoom!
図1
※: JavaScriptのconsole.logをWindowsのGoogle Chromeに表示するには[F12]を押して「Console」タブをクリックします。 図1をクリックすると拡大表示します。
console.log('Hello JavaScript!');
console.log(5);
console.log(true);
console.log(null);
console.log({ 'color': 'red', 'font-size': '35px' });
console.warn('warning message...');
console.error('found error: error message...');

作成手順

  1. VS2019(Visual Studio 2019 or Visual Studio 2022)を起動したら新規のWebフォーム「Article014.aspx」を作成します。

  2. Webフォームのヘッダータグ内「<head>...</head>」にSTYLEタグを追加して以下のようなCSSを入力します。
    
    Article014.aspx:
    
    <style>
        table.article014-table {
            background-color: #FFFFFF;
            border-collapse: collapse;
            border-color: #999999;
            border-style: none;
            border-width: 1px;
            font-size: medium;  
        }
    
        table.article014-table tr:nth-child(even) {
            background: #FFFFFF;
        }
    
        table.article014-table tr:nth-child(odd) {
            background: #F0F0F0;
        }
    
        table.article014-table tr th{
            background-color: rgba(0,0,0,0.8);  
            color:  white;
            text-align: left;
            font-size: smaller;
        }
    
        table.article014-table tr td{   
            font-size: smaller;
        }
    </style>
    
  3. Webフォームのヘッダータグ内「<head>...</head>」にSCRIPTタグを追加してjQuery、String.format、TraceWriteのライブラリーを取り込みます。 さらにSCRIPTタグを追加して、次のようなJavaScript/jQueryのコードを入力します。

    TIP:「html.replace(/</g, '&lt;');」をWebページ上に表示させるには「&」を「&amp;」のように記述します。
    
    Article014.aspx:
        
    <script src="https://code.jquery.com/jquery-3.6.0.slim.min.js" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" crossorigin="anonymous"></script>
    <script src="js/StringFormat.js"></script>
    <script src="js/TraceWrite.js"></script>
    <script type="text/javascript">
    
        // jQuery Document Ready Event...
        $(function () {
    
            // TraceWriteOption(), TraceWrite()
    
            var opt = new TraceWriteOption();
            opt.trace = true;
            opt.foreColor = 'red';
            opt.bgColor = 'white';   
    
            $('.run1JQ').click(function () {
                var e = $('#myId')[0];
                opt.foreColor = 'red';
                TraceWrite('Run 1(JQ): id={0}'.format(e.id), opt);
            });
    
            $('.run1JS').click(function () {
                var e = document.getElementById('myId');
                opt.foreColor = 'blue';
                TraceWrite('Run 1(JS): id={0}'.format(e.id), opt);
            });
    
            $('.run2JQ').click(function () {
                var es = $('div');
                opt.foreColor = 'red';
                TraceWrite('Run 2(JQ): number of div elements={0}, tagName[0]={1}'.format(es.length, es[0].tagName), opt);
            });
    
            $('.run2JS').click(function () {
                var es = document.getElementsByTagName('div');
                opt.foreColor = 'blue';
                TraceWrite('Run 2(JS): number of div elements={0}, tagName[0]={1}'.format(es.length, es[0].tagName), opt);
            });
    
            $('.run3JQ').click(function () {
                var es = $('.myClass');
                opt.foreColor = 'red';
                TraceWrite('Run 3(JQ): number of class elements={0}, class={1}'.format(es.length, es[0].className), opt);
            });
    
            $('.run3JS').click(function () {
                var es = document.getElementsByClassName('myClass');
                opt.foreColor = 'blue';
                TraceWrite('Run 3(JS): number of class elements={0}, class={1}'.format(es.length, es[0].className), opt);
            });
    
            $('.run4JQ').click(function () {
                var es = $('div.myClass');
                opt.foreColor = 'red';
                TraceWrite('Run 4(JQ): number of class elements={0}, class={1}'.format(es.length, es[0].className), opt);
            });
    
            $('.run4JS').click(function () {
                var es = document.querySelectorAll('div.myClass');
                opt.foreColor = 'blue';
                TraceWrite('Run 4(JS): number of class elements={0}, class={1}'.format(es.length, es[0].className), opt);
            });
    
            $('.run5JQ').click(function () {
                var text = $('#myId').text('Hello jQuery!').text();
                opt.foreColor = 'red';
                TraceWrite('Run 5(JQ): text={0}'.format(text), opt);
            });
    
            $('.run5JS').click(function () {
                document.getElementById('myId').textContent = 'Hello JavaScript!';                                
                var text = document.getElementById('myId').textContent;
                opt.foreColor = 'blue';
                TraceWrite('Run 5(JS): text={0}'.format(text), opt);
            });
    
            $('.run6JQ').click(function () {
                var html = $('#myId').html('<span style="color: red;">Hello jQuery!</span>').html();
                html = html.replace(/</g, '&lt;');    // replaceAll()  
                html = html.replace(/>/g, '&gt;');    // replaceAll() 
                opt.foreColor = 'red';
                TraceWrite('Run 6(JQ): html={0}'.format(html), opt);
            });
    
            $('.run6JS').click(function () {
                document.getElementById('myId').innerHTML = '<span style="color: blue;">Hello JavaScript!</span>';
                var html = document.getElementById('myId').innerHTML;
                html = html.replace(/</g, '&lt;');    // replaceAll()  
                html = html.replace(/>/g, '&gt;');    // replaceAll()  
                opt.foreColor = 'blue';
                TraceWrite('Run 6(JS): html={0}'.format(html), opt);
            });
    
        });
    
    </script>
    
    String.format()ライブラリーの内容です。なお「String.format()」については、 「Article012」で解説していますのでそちらを参照してください。
    
    StringFormat.js:
    
    String.prototype.format = String.prototype.f = function () {
        var s = this,
            i = arguments.length;
    
        while (i--) {
            s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
        }
        return s;
    };
    
    今回紹介するTraceWrite()ライブラリーの内容です。 このライブラリーはTraceWriteOption()とTraceWrite()から構成されています。 TraceWriteOption()ではTraceWrite()のオプションを定義します。引数として「trace」「foreColor」「bgColor」を指定します。 引数「trace」はbool型で「true, false」を指定します。引数「foreColor」と「bgColor」ではCSSの前景色、背景色を指定します。 TraceWriteOption()のデフォルト値は「trace=true, foreColor=#000, bgColor=#fff」です。

    TraceWrite()では引数(msg)で指定したデータをDIV要素(id="trace")に出力します。これでWebページ上にトレース情報として表示されます。
    
    TraceWrite.js:
    
    // TraceWriteOption()
    
    function TraceWriteOption(trace, foreColor, bgColor) {
        this.trace = trace ? trace : true;
        this.foreColor = foreColor ? foreColor : '#000';
        this.bgColor = bgColor ? bgColor : '#fff';
    }
    
    
    // TraceWrite()
    
    function TraceWrite(msg, option) {
        if (!option) {
            option = {};    // avoid undefined exception
        }
    
        this.trace = option.trace ? option.trace : true;
        this.foreColor = option.foreColor ? option.foreColor : '#000';
        this.bgColor = option.bgColor ? option.bgColor : '#fff';
    
        if (this.trace) {
            var trace = $('div#trace');
            var traceData = $(trace).html();
            var str = '{0}<br /><span style="color: {1}; background-color: {2};">{3}</span>'.format(traceData, this.foreColor, this.bgColor, msg);
            $(trace).html(str);
        }
    }
    
  4. WebフォームにHTMLのTABLEタグを追加して以下のような表を配置します。さらにDIV(id="myID")とDIV(id="trace")を配置します。 「DIV(id="myID")」はサンプルを実行するときに使用します。「DIV(id="trace")」にはトレース情報が表示されます。
    
    <table border="1" class="article014-table">
    <tr>
    <th rowspan="2">Run1</th>
    <td><a class="run1JQ" href="#trace" title="Run jQuery">$('#myId')</a></td>
    </tr>
    <tr>
    <td><a class="run1JS" href="#trace" title="Run JavaScript">document.getElementById('myId')</a></td>
    </tr>
    <tr>
    <th rowspan="2">Run 2</th>
    <td><a class="run2JQ" href="#trace" title="Run jQuery">$('div')</a></td>
    </tr>
    <tr>
    <td><a class="run2JS" href="#trace" title="Run JavaScript">document.getElementsByTagName('div')</a></td>
    </tr>
    <tr>
    <th rowspan="2">Run 3</th>
    <td><a class="run3JQ" href="#trace" title="Run jQuery">$('.myClass')</a></td>
    </tr>
    <tr>
    <td><a class="run3JS" href="#trace" title="Run JavaScript">document.getElementsByClassName('myClass')</a></td>
    </tr>
    <tr>
    <th rowspan="2">Run 4</th>
    <td><a class="run4JQ" href="#trace" title="Run jQuery">$('div.myClass')</a></td>
    </tr>
    <tr>
    <td><a class="run4JS" href="#trace" title="Run JavaScript">document.querySelectorAll('div.myClass')</a></td>
    </tr>
    <tr>
    <th rowspan="2">Run 5</th>
    <td><a class="run5JQ" href="#trace" title="Run jQuery">$('#myId').text('Hello jQuery!').text()</a></td>
    </tr>
    <tr>
    <td>
    <a class="run5JS" href="#trace" style="font-size: 9px;" title="Run JavaScript">document.getElementById('myId').textContent = 'Hello JavaScript!';
    document.getElementById('myId').textContent</a>
    </td>
    </tr>
    <tr>
    <th rowspan="2">Run 6</th>
    <td><a class="run6JQ" href="#trace" title="Run jQuery">$('#myId').html('<span style="color: red;">Hello jQuery!</span>').html()</a></td>
    </tr>
    <tr>
    <td>
    <a class="run6JS" href="#trace"  style="font-size: 9px;" title="Run JavaScript">document.getElementById('myId').innerHTML = '<span style="color: blue;">Hello JavaScript!</span>';
    document.getElementById('myId').innerHTML</a>
    </td>
    </tr>
    </table>
    
    <hr />
    <div id="myId" class="myClass">JavaScript vs jQuery</div>
    <hr />
    <div id="trace">Trace Data:</div>
                    
    

操作手順

  1. サンプルが表示されたら「Run 1-6」の右側のリンクをクリックします。 上段がjQuery、下段がJavaScriptのコードを実行します。

  2. リンクをクリックすると「Trace Data:」に実行結果が表示されます。 「赤」がjQuery、「青」がJavaScriptの実行結果です。

  3. たとえば、Run 1の「$('#myId')」をクリックするとjQueryの「$('#myId')」が実行されます。 そして、実行結果として「$('#myId')」で見つけたHTML要素のid属性を「Run 1(JQ): id=myId」のように表示します。