JavaScript



2012年 5月 3

120503-0001
https://twitter.com/#!/javascript_j/status/197743453881380865
ココらへんのツイートからふとやってみようかと。
もともとのツイートはこのあたり

SublimeLinter

Kronuz/SublimeLinter – github
リアルタイムで構文チェックを行なってくれる。
JavaScriptの他にも下記の言語に対応している(みたい)

  • CoffeeScript
  • CSS
  • java
  • Javascript
  • Objective-J
  • perl
  • php
  • python
  • ruby

Sublime Package Controlをインストール

SublimeLinterをインストールするには Sublime Package Control をインストール必要がある。
Sublime Package Control – a Sublime Text 2 Package Manager by wbond

SublimeLinterのインストール

Sublime Package Control をインストールすると メニューに preference> Package Control が追加されるので選択する。
メニュー

Install Package を選択。
sublime text2 Package Control

テキストボックスに「SublimeLinter」を入力する。一部でも可。
選択すれば自動でインストール開始する。
Package Control: install package

Node.jsとnpmをインストール

node.js site
JavaScriptでJSHintやJSLintを使うにはNode.jsが必要。
普通にmac用のインストーラー(node-v0.6.16.pkg )をダウンロードしてインストール。

Node was installed at

   /usr/local/bin/node

npm was installed at

   /usr/local/bin/npm

Make sure that /usr/local/bin is in your $PATH.

JSHintのインストール

uipoet/sublime-jshint

  • JSHintはJSLintのフォーク。
  • JSLintを作った人はJavaScript Good Partsの著者らしい
    • JSLintはC言語並みにチェックが厳しいみたいなのでJSHintを使う
macbook:~ clicktx$ sudo npm install -g jshint
Password:
npm http GET https://registry.npmjs.org/jshint
npm http 304 https://registry.npmjs.org/jshint
npm http GET https://registry.npmjs.org/argsparser
npm http GET https://registry.npmjs.org/minimatch
npm http 200 https://registry.npmjs.org/argsparser
npm http GET https://registry.npmjs.org/argsparser/-/argsparser-0.0.6.tgz
npm http 200 https://registry.npmjs.org/minimatch
npm http GET https://registry.npmjs.org/minimatch/-/minimatch-0.0.5.tgz
npm http 200 https://registry.npmjs.org/argsparser/-/argsparser-0.0.6.tgz
npm http 200 https://registry.npmjs.org/minimatch/-/minimatch-0.0.5.tgz
npm http GET https://registry.npmjs.org/lru-cache
npm http 200 https://registry.npmjs.org/lru-cache
npm http GET https://registry.npmjs.org/lru-cache/-/lru-cache-1.0.6.tgz
npm http 200 https://registry.npmjs.org/lru-cache/-/lru-cache-1.0.6.tgz
/usr/local/bin/jshint -> /usr/local/lib/node_modules/jshint/bin/hint
jshint@0.6.3 /usr/local/lib/node_modules/jshint
├── argsparser@0.0.6
└── minimatch@0.0.5 (lru-cache@1.0.6)

動作確認

Preferences->Package Settings->SublimeLinter->Settings – Default から下記の場所を false->trueに変えるとより強調される。

    // If true, lines with errors or warnings will have a gutter mark.
    "sublimelinter_gutter_marks": false,

    // If true, the find next/previous error commands will wrap.
    "sublimelinter_wrap_find": false,

SublimeLinterの動作

エラーがあるところは強調や下線等してくれる。
ただ、jQueryのコードとかになるとエラーばっかりになってしまうのが…。
手動モードにしたほうがいいのかも。

ちなみにちょっと頑張ったんだけど、Perlの構文チェックを有効にする方法が分かりませんでした…。

書籍

SublimeTextの本出たみたいですね!


Filed under: JavaScript,Mac

Trackback Uri






2011年 8月 24

とあるスクリプトで最初の実行時には正常に動作するのだけれど、同一ページを再訪問(リロードではなく)した時に不具合が出た。

webkit系のブラウザで不具合が確認できたのだけれど、どうやらgetElementById()でnullが帰っている様子。

ググってみると同じような現象で悩んでいる人もいるみたい。DOM構築前だとnullが帰る事もあるのが原因のようだ。

onLoadイベントとかはjQuery使っているのなら簡単に実装できるのだけれど、純粋JSで書いているスクリプトだし、他所様に配信するスクリプトなので解決方法を探る。

jQuery使っているのなら、$.ready(function(){…}) でいいのだろうけど、そうはいかない。じゃあ、onLoadイベントに登録すればいい。いいのだけど、onLoadイベントは1つしか実行できないので工夫が必要になる。

  • Javascript onloadが複数ある場合の対処法 ~FancyZoomとCubeブログシールを共存させる : ブログ・カスタマイズ徒然記
  • ここら辺の記事を参考に How to use multiple window.onload events with external scripts – Javascript FAQ – Tek-Tips にある addOnloadEvent を組み込んで対処する。

    処理的には document.write() でかいたHTML中にあるIDが付いたタグの中に別処理で作成したHTMLを放り込むもの。

    実行したい関数には引数を指定しているので、
    addOnloadEvent(function(){ print_image(hoge,fuga) });
    みたいな感じにすればonLoadイベントとして実行してくれる。

    そうすることで、getElementById()でnullが帰らなくなる。


    Filed under: JavaScript

    Trackback Uri






    2011年 6月 12

    とあるスクリプトで javascriptでiframeを書き、そのフレームをさらに書き換える・・・というものがあるのですが、スクリプトをページ内に複数設置すると、chromeでエラーになってしまうので回避策。

    今までは

    document.write('<IFRAME id="フレーム名" name="フレーム名" ....></IFRAME>');

    で描写して、ターゲットとなるiframeを

    var target_iframe = frames[フレーム名];

    で取得していたのですが、これが2度目以降の実行時にundefinedとなってしまう。

    var target_iframe = document.getElementById(ifrname).contentWindow;

    でもやはり取得できず。
    他のブラウザでは問題ないので気が付かなかったのだけれど、chromeのみ症状が出た。

    DOMでiframeを追加

    解決策としてはDOMでiframeを追加する事で望んだ結果が得られた。

    var iframe = document.createElement('IFRAME');
    iframe.setAttribute('id', 'フレーム名');
    iframe.setAttribute('name', 'フレーム名');
    ...
    document.body.appendChild(iframe);

    .. continue reading ..


    Filed under: JavaScript

    Trackback Uri






    2010年 7月 1

    IEの6,7,8を判別するJavascript
    JavaScriptでIEかどうかをたったの1行で判別する方法

    この両者のスクリプトを合わせてみた。
    ライブラリを使いたくない(or使えない)状況で役に立つかも。
    ちなみに「IEの6,7,8を判別するJavascript」のコードは間違っていたので少々修正。

    if (typeof document.body.style.maxHeight != "undefined") {
        if (!/*@cc_on!@*/false){
            // Not IE.
            alert('Not IE.');
        }else if (document.documentMode >=8) {
            // IE8
            alert('IE8');
        }else {
            //IE7, IE8(IE7 mode)
            alert('IE7, IE8(IE7 mode)');
        }
    } else {
        // IE6, older browsers
        alert(' IE6, older browsers');
    }

    Windows XP の IE8、IE7、FireFox、Chromeで確認OK.
    Mac の Safari、FireFox、Opera、Chrome でもOK.


    Filed under: JavaScript

    Trackback Uri






    2010年 7月 1

    相変わらずクソな実装のIE。
    他のブラウザで全部動くのにIE 7.0 以下の挙動はホントにクソ。
    先人の方々に感謝感激雨あられですわ。

    IEでのgetAttribute,setAttributeのバグ

    // NG
    element.getAttribute("class");
    element.setAttribute("style", "background-color: #fff; color: #000;");
    element.setAttribute("onclick", "clickHandler(event);");
    
    // OK
    element.getAttribute("className");
    element.style.cssText = "background-color: #fff; color: #000;";
    element.setAttribute("onclick", new Function("clickHandler(event);"));

    IEでsetAttribute()とremoveAttribute()がうまく動かない問題 (ウップス!!なかわけ)

    しかも、かなり重要なことを発見しました。
    
    属性名を小文字で書かないとうまく動かない!!(IE7で確認)
    
    setAttribute("onClick", new Function(""));
    
    ではダメなのです。うまく処理されません。
    
    setAttribute("onclick", new Function(""));

    あー、これも引っかかってたわ。

    ただし、上記の対応をすると他のブラウザで動かない。IE8 でもエラーが出る。IE 7以下用に振り分けないとダメなのか。。。

    まぁ、そろそろIE7以下は捨ててもいいよ・・・ね?

    結局

    ベタにHTMLを document.write() で書けばいい訳で・・。
    クロスブラウザにするには手間ががかかる・・。


    Filed under: JavaScript

    Trackback Uri