操作方法

Shibuya

.JS

The next generation of browsers

amachang: seijro@gmail.com

Agenda

Rediscover JavaScript

10 年。

世界が JavaScript の真の実力を発見するのに要した時間である。

1995 年、Netscape 社の Brendan Eich により開発・設計された JavaScript は、「世界で最も誤解されたプログラミング言語」などと呼ばれもした、

ともすれば不遇とすらいい得る歳月を経て、あたりのそこここに満ち充ちていた「Web の旧来的なインタラクションの窮屈さを革命したい」という思いによって、ふたたび表舞台に招来された。

JavaScript は、Web の「あちら側」と「こちら側」とを取り結ぶ、もっとも古くてもっとも新しい、そして、もっとも重要な技術だ。次の 10 年を自らの手で創り出すために、我々は Shibuya.js を結成した。

Sby.JS

JavaScript は

再発見によって生かされた

そして、今再び

Next Generation

これは仕様(夢)の話ではない

目の前にある実装(現実)の話だ

何が出来るようになる?

何が出来るようになる?

エディタ関連

エディタ関連

Element.contentEditable

[MSDN] contentEditable Property

[HTML5] 5.2 The contenteditable attribute

Element.contentEditable

var editer = document.createElement('div');

// 要素を編集可能にする (文字列)
editer.contentEditable = 'true';
// 要素が編集可能か確認する (真偽値)
alert(editer.isContentEditable); // true

// HTML に直書きもできる
<div contenteditable="true"></div>

Demo

Element.contentEditable

Drag and Drop Events

[MSDN] DHTML Events

[HTML5] 5.3 Drag and drop

Drag and Drop Events

// drag イベントを監視
// IE だったら attachEvent('ondrag'

element.addEventListener('drag', function(e) {
    console.log(
        e.dataTransfer.getData('Text')
        + 'をドラッグ中'
    );
}, false);

Drag and Drop Events

// dragend イベントを監視
// IE だったら attachEvent('ondragend'

element.addEventListener('dragend', function(e) {
    console.log(
        e.dataTransfer.getData('Text')
        + 'をドラッグ完了!'
    );
}, false);

Drag and Drop Events

Drag and Drop Events

Copy and Paste Events

[MSDN] DHTML Events

Copy and Paste Events

// コピーの監視

elm.addEventListener('beforecopy', function(e) {
    // 残念ながらブラウザによってイベントの扱いが違う
}, false);

elm.addEventListener('copy', function(e) {
    // 残念ながらブラウザによってイベントの扱いが違う
}, false);

Copy and Paste Events

// 切り取りの監視

elm.addEventListener('beforecut', function(e) {
    // 残念ながらブラウザによってイベントの扱いが違う
}, false);

elm.addEventListener('cut', function(e) {
    // 残念ながらブラウザによってイベントの扱いが違う
}, false);

Copy and Paste Events

// 貼付けの監視

elm.addEventListener('beforepaste', function(e) {
    // 残念ながらブラウザによってイベントの扱いが違う
}, false);

elm.addEventListener('paste', function(e) {
    // 残念ながらブラウザによってイベントの扱いが違う
}, false);

Copy and Paste Events

Offline 関連

Offline 関連

Online / Offline Events

[HTML5] 4.10.1 Offline Web applications

Online / Offline Events

// オフラインモードの切り替えを監視
// ネットの接続を監視している訳ではない。
document.addEventListener('online', function(e) {
    alert(navigator.onLine); // true
}, false);

document.addEventListener('offline', function(e) {
    alert(navigator.onLine); // false
}, false);

Online / Offline Events

Offline Cache

Marking Resources for Offline Use

Offline Cache

// オフラインキャッシュに入れておく
navigator.offlineResources
                ­.add('http://example.com/offline.js');
// 後で使う
document.addEventListener('offline', function(e) {
    var script = document.createElement('script');
    script.src = 'http://example.com/offline.js';
    document.body.appendChild(src);
}, false);

Offline Cache

スタイルシート関連

スタイルシート関連

APIs for Alternate Style Sheets

[CSSOM] The DocumentStyle Interface

APIs for ASS

<!-- Style Sheet Set "hoge" (Preferred) -->
<link rel="stylesheet" title="hoge"
                                        href="/hoge1.css" .../>
<link rel="stylesheet" title="hoge"
                                        href="/hoge2.css" .../>

<!-- Style Sheet Set "fuga" (Alternate) -->
<link rel="alternate stylesheet" title="fuga" 
                                        href="/fuga1.css" .../>
<link rel="alternate stylesheet" title="fuga" 
                                        href="/fuga2.css" .../>

APIs for ASS

alert(document.selectedStyleSheetSet); // hoge
alert(document.lastStyleSheetSet); // null

// CSS の有効無効を切り替える
document.enableStyleSheetsForSet('fuga');
// document.selectedStyleSheetSet = 'fuga' と同じ

alert(document.selectedStyleSheetSet); // fuga
alert(document.lastStyleSheetSet); // fuga

APIs for ASS

// Preferred
alert(document.preferredStyleSheetSet); // hoge

// List
alert(document.styleSheetSets.length); // 2
alert(document.styleSheetSets[0]); // hoge
alert(document.styleSheetSets[1]); // fuga

APIs for ASS

getComputedStyle(elm, '')

[CSSOM] The ViewCSS Interface

getComputedStyle(elm, '')

var style =
    getComputedStyle(document.body, '');

// カスケーディングや継承を考慮した値が取れる
alert(style.display); // block

getComputedStyle(elm, '')

getMatchedCSSRules(elm, '')

[WebKitDOM] DOMWindow Interface Reference

getComputedStyle(elm, '')

// 当たってる CSS ルールを取得する
var rules = getMatchedCSSRules(elm, '');

alert(rules.length); // ルールの数

alert(rules[0].selectorText);
alert(rules[0].style.color);
alert(rules[1].selectorText);
alert(rules[1].style.backgroundColor);

getComputedStyle(elm, '')

レイアウト関連

レイアウト関連

Element.getClientRects()

[MSDN] getClientRects Method

[CSSOM] The ElementLayout Interface

Element.getClientRects()

// 一行一行のボックス情報が取得できる。
var rects = elm.getClientRects();
// すべての行の左右はボーダー辺まで
// 最初の行は上のボーダーを含み、
// 最後の行は下のボーダーを含む。
alert(rects[0].top);
alert(rects[0].bottom);
alert(rects[0].left);
alert(rects[0].right);

Demo

Element.getClientRects()

Element.getBoundingClientRect()

[MSDN] getBoudingClientRect Method

[CSSOM] The ElementLayout Interface

Element.getBoundingClientRect

// 要素のボーダー辺で囲まれた領域の
// ボックス情報を取得を取得出来る
var rect = elm.getBoundingClientRect();

alert(rect.top);
alert(rect.bottom);
alert(rect.left);
alert(rect.right);

Element.getBoundingClientRect

document.elementFromPoint(x, y)

[MSDN] elementFromPoint Method

[CSSOM] The ElementLayout Interface

document.elementFromPoint

// 一番左上の要素を取得
var elm = document.elementFromPoint(0, 0);

document.elementFromPoint

Element.clientXXXX

[MSDN] Measuring Element Dimension and Location

[CSSOM] The ElementLayout Interface

Element.clientXXXX

dom 関連

DOM 関連

DOM 3 XPath

[W3C] DOM 3 XPath

DOM 3 XPath

// document 中の全ての div 要素を取得
var result = document.evaluate(
                        '//div', document, null, 6, null);

for (var i = 0; i < result.snapshotLength; i ++) {
    var element = result.snapshotItem(i);
    alert(element.nodeType); // 1
    alert(element.nodeName); // div
}

DOM 3 XPath

Element.getElementsByClassName(class)

[HTML5] 2.4 DOM tree accessors

Element.getElementsByClassName

// こんな要素を
// <div class="class1 class2">hoge</div>

// これで取得
var elm = ancestor
            .getElementsByClassName('class1');

Element.getElementsByClassName

Node.compareDocumentPosition(n)

[W3C] DOM 3 Core - Interface Node

Node.compareDocumentPosition

[elm1, elm2, elm3].sort(function(a, b) {
    if (a.compareDocumentPosition(b) &
        Node.DOCUMENT_POSITION_PRECEDING)
        return 1;
    else if (a.compareDocumentPosition(b) &
        Node.DOCUMENT_POSITION_FOLLOWING)
        return -1;
    else return 0;
});

Node.compareDocumentPosition

Node.compareDocumentPosition

Node.textContent

[W3C] DOM 3 Core - Interface Node

Node.textContent

elm.textContent = '<hoge>'

// ちゃんと実体参照になっている
alert(elm.innerHTML); // &lt;hoge&gt;

Node.textContent

Element.insertAdjacentElement(t, e)

[MSDN] insertAdjacentElement Method

Element.insertAdjacentElement

document.body
    .insertAdjacentElement('afterBegin', elm);

// <body>
//          <- ここに挿入される
//   :
//   :
// </body>

Element.insertAdjacentElement

言語仕様関連

DOM 関連

getter / setter

JavaScript Getters and Setters

JavaScript 1.8

var Klass = function(v) { this._value = v };
Klass.prototype = {
    get value() { return this._value },
    set value(v) { return this._value = v }
};
Klass.prototype.__defineGetter__(
    'value2', function() { return this._value * 2 });
var methodClosure =
    Klass.prototye.__lookupSetter__('value');

getter / setter

JavaScript 1.8

[MDC] New in JavaScript 1.8

JavaScript 1.8

[4, 2, 3, 1].sort(function(a, b) a - b);

var it = ([i, j] 
            for each (i in [1, 2, 3])
            for each (j in [4, 5, 6]))
alert(it.next()); // 1, 4
alert(it.next()); // 1, 5

var n = ([1, 2, 3].reduce(function(a, b) a + b, 0)

JavaScript 1.8

arguments のバグ

arguments のバグ

var shift = Array.prototype.shift;

function hoge() {
    //...

    var callback = shift.apply(arguments);
    var self = shfit.apply(arguments);
    callback.apply(self, arguments);
}

arguments のバグ

Array の関数群

[MDC] New in JavaScript 1.6

Array の関数群

var array = [1, 2, 3, 4, 5, 6].filter(
                        function(i) { return i < 3 });

alert(array); // 1, 2

Array の関数群

その他

その他

showModalDialog

[MSDN] showModalDialog Method

showModalDialog

// alert のように実行が停止されるため、
// 以下のように復帰値を取得できる。
var value = shwoModalDialog('http://example.org/dialog.html');

// open されたほう
window.returnValue = 'hoge';
window.close();

Demo

showModalDialog

まとめ

かなりの IE の独自仕様を

HTML5 CSSOM が取り入れ

ようやく各ブラウザが

足並みを揃えだした

あとは IE 8

めっちゃ期待してます><

おしまい!