ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2010/07/08

[JavaScript][VBScript]VBScript + Javascriptで簡単プロジェクト内ツール。その2

0埋めはsliceを使え。

数値の0埋め処理のやり方

3桁0埋め

function zeroPadding3(num){
return ("000" + num).slice(-3);
}

日付型は6/31日とかセットするとちゃんと7/1になってくれる。

//月は0で1月、5で6月
alert(new Date(2010,5,31));

実行結果
Thu Jul 1 00:00:00 UTC+0900 2010

ショートカットを実装するにはshortcuts.jsが便利。

サンプル
shortcut.add("Ctrl+B",function() {
alert("The bookmarks of your browser will show up after this alert...");
}

参考URL:

setTimeoutの繰り返しは自己呼び出しで

function hoge(){
alert("hoge");
setTimeout(hoge,1000);
}
ただしこれをhogeと関数オブジェクトで呼び出さずに
hoge()とするとブラウザが壊れるので要注意。

以上で細々とした備忘終わり。

[JavaScript][VBScript]VBScript + Javascriptで簡単プロジェクト内ツール。その1

プロジェクトでIE6上で動く VBScript + JavaScript + HTML のツールを作ってみた。
なんで今更?IE6?

会社の中では未だに頑固にIE6が標準だーって会社は多いのさ。

本当は HTML5 + JavaScript で作りたかったけど仕方ない。
会社のみんなにChromeやFireFoxを強制的にインストールさせるのは面倒だからね。

要件はある固定長インターフェースファイルを使ったテスト用に、

  • テキストファイルを別のフォーマットに変えてくれ。(ファイルI/O)
  • 要件は流動的に変わる。インクリメンタルにイテレーティブに。
  • 実装工数はインフラの空き時間を使って。

この用件ならhttpアクセスで画面はHTMLインターフェースでやるのが適当かなと思った。
ついでに皆標準的に入れてるブラウザはIE6。

ファイル I/O 部位を VBScript に任し、
他の挙動を JavaScript で制御するのが適当か?
以下その場合の注意点

VBScript のファイルI/Oを有効化するにはIE6の設定変更が必要

  1. メニューバーの【ツール(T)】より【インターネットオプション】を起動します。
  2. 【セキュリティ】タブを選択し、【レベルのカスタマイズ(C)...】ボタンをクリックします。
  3. 【スクリプトを実行しても安全だとマークされている ActiveXコントロールのスクリプト実行】を有効にします。

これを画面の最下部に常に表記。

で、まずはFile I/O部のVBScriptコード

注意点は読み込んだ内容をJavaScriptに渡す場合、
配列渡しはうまくいかなかったので、
適当な区切り文字をはさんで渡し、JavaScript側でSpritしたことと、
動的な配列が定義出来なかったのでReDimとPreserveを多様したこと

書き込み

Function FileOutput(FULLPATH,TXT)
Dim objFSO, objFile


Set objFSO = CreateObject("Scripting.FileSystemObject")
If Err.Number = 0 Then
Set objFile = objFSO.OpenTextFile(FULLPATH, 8, True)
If Err.Number = 0 Then
objFile.Write(TXT & vbcrlf)
objFile.Close
Else
WScript.Echo "file open error: " & Err.Description
End If
Else
WScript.Echo "error: " & Err.Description
End If

Set objFile = Nothing
Set objFSO = Nothing
End function

読み込み

''指定されたパスのファイルを読み取りJavaScriptに渡す。
Function FileInput(FULLPATH)
Dim objFSO, objFile
Dim cnt,max
Dim ret

Dim Arr()
ReDim Arr(10)

Set objFSO = CreateObject("Scripting.FileSystemObject")
If Err.Number = 0 Then
Set objFile = objFSO.OpenTextFile(FULLPATH, 1, false)
If Err.Number = 0 Then
cnt = 0
max = 10

While (objFile.AtEndOfStream=false)
Arr(cnt) = objFile.ReadLine
cnt = cnt + 1

''cntが配列の配列数に達した時、定義し直して10配列数を増やす。
if cnt = max then
max = max + 10
''Preserveを入れると配列の中身を壊さずに再定義出来る。
ReDim Preserve Arr(max)
End if
Wend
objFile.Close
Else
WScript.Echo "file open error: " & Err.Description
End If
Else
WScript.Echo "error: " & Err.Description
End If

''区切り文字を使って配列を連結する。
For Each buf in Arr
ret = ret & buf & "区切"
Next

Set objFile = Nothing
Set objFSO = Nothing

FileInput = ret

End function


2010/01/30

[JavaScript]BookMarklet覚書

BookMarkletはJavaScriptで作られた一行のプログラムです。
javaScriptで書いたものを一行にすればとりあえず動くと思って下さい。

サンプル実行方法はブラウザのURL入力欄に張り付けとシンプルなものです。


もっとも単純なHello,world!

javascript:alert('Hello,world!'); 

上記コードをブラウザのURL入力欄に入れてみてください。
Hello, world!とポップアップウィンドウが表示されるはずです。

処理を関数化したHello,world!

javascript:(function(){function%20helloWorld(){alert('Hello,world!');}helloWorld();})(); 


先程までとまったく同じ動きをするプログラムですが、

javascript:(function(){
//スクリプト内容
})(); 
というフォーマットに従って書いています。

通常BookMarkletの変数はvar宣言してもグローバル変数になってしまうのですが、
このように無名ファンクションのインスタンス呼び出しにすることで変数をローカル扱いすることができます。


また関数を内部で定義し、後に呼び出すといったことも出来ます。

javascript:(function(){function%20msgAlert(msg){alert(msg);}
var%20txt;txt='Hello,world!';msgAlert(txt);})(); 

時々出てくる'%20'は半角スペースのURLエンコードです。
これ以外にも日本語を使用するためにはURLエンコードが必要になります。
URLエンコードはサイトを探せばなんなりと出てきますのでGoogle先生にでもお尋ねください。



2009/02/25

[JavaScript]tbodyのinnerHTML

ちょちょいとした計算ツールを使用するのにJavaScriptは便利だ。

だが問題がある、IEとFirefoxでは同一のスクリプトが動いたり動かなかったりすることがある。

今回はtbodyタグに関する話。

計算結果を表形式で表したい時にHTMLのtableタグを使用する。
得にtbodyタグの中身を可変編集することはよくするテクニックの一つだ。

以下のコードを見てもらいたい。

---HTML
<table>
<thead>
<tr>
<th>index</th><th>内容</th>
</tr>
</thead>
<tbody id="tableBody"></tbody>
</table>

---javaScript

function main(){
//HTML上のtbodyを取得
var tb = document.getElementById("tableBody");
//書き込む内容を作成
var tbHTML = '<tr><td>1</td><td>hoge</td></tr>'
           + '<tr><td>2</td><td>hogehoge</td></tr>';
tb.innerHTML = tbHTML;
}

上記コードはFireFoxやChromeだと動くのだが、
IEでは動かない。

ナンデエエエと思って調べてみると。
Internet Explorer で 
PRB エラー設定 table.innerHTML

tbodyのinnerHTMLは読取り専用だと!

なのでこう書かないといけない。

---javaScript
function main(){
//HTML上のtbodyを取得
var tb = document.getElementById("tableBody");
//DOMオブジェクトを作成
var tr = document.createElement('tr');
        var td1 = document.createElement('td');
        var td2 = document.createElement('td');

        //作成したオブジェクトを組み合わせてtbodyの中を作成
        for(var i = 1; i < 3; i++){
            td1.innerHTML = i;
            td2.innerHTML = (i==1) ? "hoge"
                                               : "hogehoge";

            tr.appendChild(td1);
            tr.appendChild(td2);
    tb.appendChild(tr);
        }
}