時をかける少女を初めて観た(今さら)

マコトのタイムリープは、過去に戻ったときに未来から来た自分が過去の自分に遭遇するということがなく(あくまで魂は同一)、いわゆるドラえもん的なパラレルワールドの概念とは違う。

要は過去に戻るというよりも、自分だけ未来体験をした上で、ある時点からリスタートすることができると言うべきか。
もっと極端に言えば、タイムリープなどではなく、超絶リアルな予知夢を見てそれを回避するルートを選択できるという感じだろうか。


そうなると、チアキのほうは遠い未来から来ているという設定で、自分が存在したことのない時代に移動しており、マコトのそれとは全く異質なものになるね。
と思った。


チアキが、「未来では時間の行き来が自由にできるようになっている」という発言は、タイムリープのきっかけを与えた装置(梅干みたい)によって発現するだけでなく、個人の精神力やスキルのような何らかの他の要因もあるっぽいのかな。もしくは時間を操作するための装置は、あの梅干だけではないのであろうな。

とはいえ、時間をジャンプする限度数「チャージ」の仕様はふたりとも同じようで、それにはどんな説明が可能なのだろう。

fancyboxを動的なDOMに適用させる

通常の場合はこれでOK

  $('.link').fancybox();


けれど、Ajaxとかで後から追加されたDOMにはこれでは対応できない。
こうやったらうまくいくようだ。

  $(document).on('hover','.link',function(){
    $.fancybox(this);
    return false;
  });

最後にreturn falseしておかないと単なるリンク処理が発動してしまうので必要。

今のやりたい事についてまとめてみる

仕事に関することから、個人的なことなど関わらず。

定義:やりたいこと=全くやれていないこと || やっているが不十分なこと。

  • ruby及びrailsの勉強
  • HTML5とかjavascriptのこと
  • 色々な積読の消化
  • 色々な録画の消化
  • xperia arc カスタマイズ
  • 運動・スポーツ(バスケとかフットサル)
  • 将棋(棋力:24で1級)
  • 旅行
  • 昔の友だちに会う

関数定義と関数リテラルしたときのコンストラクタ名

■関数定義したコンストラクタ

function A(){}
var a=new A;
console.log(a.__proto__, a instanceof A); // A{}, true

■関数リテラルしたコンストラクタ

var B=function(){};
var b=new B;
console.log(b.__proto__, b instanceof B); // Object{}, true

Bは一見、Bという名のコンストラクタのように見えるが、実際には無名関数の参照に過ぎないということになる。
bのコンストラクタは無名だが、bはBのインスタンスである。という結果はかなり気持ち悪い。

個人的には、後者の関数リテラルで書くほうがjavascript的だなと思うところはあったけど、こうして見るとちょっと問題となりそうにも見える。
コンストラクタ名を比較できないとか?


ここまで書いておいて、同様のことを扱ってる記事がないかと探したら、ありました。
http://qiita.com/items/5df25f771d4602fd6293


それから、以前にprototypeをリテラルで初期化したときのインスタンス
の振る舞いについて書いていた。別の話か
http://ynsyns.hateblo.jp/entry/2012/03/29/203801

jQueryのloadメソッドのこと

jQuery[v1.4.2]のloadメソッドで2度もはまったのでメモ。
これ。$(selector).load(url,data,callback)
このurlの書式がセレクタ有り無しの場合でレスポンスの挙動が変わる。

結論から

セレクタ有りでloadすると、レスポンス内のscriptが抜かれる。

サンプル

以下サンプルはdataとcallbackは使用しないパターンとして省略。
この場合、windowの読み込みが完了したときに"/foo/bar #hoge"を非同期でリクエストして
結果を#resに流しこむ。

■アクセスする側の部分的コード

<div id="res">
</div>

<script>
$(window).bind('load',function(){
  var url='/foo/bar #hoge';  //#hogeの内容を取ってきて
  $('#res').load(url);
});
</script>

アクセス先にセレクタ指定があるときは、レスポンス内容のscriptが抜かれる。(2回目)

jQuery[v1.4.2]のload辺りを見てみる

var sb = J(), tb = /<script(.|\s)*?\/script>/gi, ub = /select|textarea/i, vb = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i, N = /=\?(&|$)/, ka = /\?/, wb = /(\?|&)_=.*?(&|$)/, xb = /^(\w+:)?\/\/([^\/?#]+)/, yb = /%20/g, zb = c.fn.load;
c.fn.extend({load: function(a, b, d) {
        if (typeof a !== 
        "string")
            return zb.call(this, a);
        else if (!this.length)
            return this;
        var f = a.indexOf(" ");
        if (f >= 0) {
            var e = a.slice(f, a.length);
            a = a.slice(0, f)
        }
        f = "GET";
        if (b)
            if (c.isFunction(b)) {
                d = b;
                b = null
            } else if (typeof b === "object") {
                b = c.param(b, c.ajaxSettings.traditional);
                f = "POST"
            }
        var j = this;
        c.ajax({url: a,type: f,dataType: "html",data: b,complete: function(i, o) {
                if (o === "success" || o === "notmodified")
                    j.html(e ? c("<div />").append(i.responseText.replace(tb, "")).find(e) : i.responseText);
                d && j.each(d, [i.responseText, o, i])
            }});
        return this
    },
周辺のことはともかく、まず注目する部分。
j.html(e ? c("<div />").append(i.responseText.replace(tb, "")).find(e) : i.responseText);

レスポンスを返す時に、eをチェックしている。

eは何?
var f = a.indexOf(" ");
if (f >= 0) {
    var e = a.slice(f, a.length);
    a = a.slice(0, f)
}

アクセス先のURLに半角スペースがあれば、eにセレクタ相応部分の文字列を格納している。

立ち戻る。
j.html(e ? c("<div />").append(i.responseText.replace(tb, "")).find(e) : i.responseText);

eが存在する(true)とき、responseText内のtbを空文字列に置換した上で、
新しい空divに、セレクタ要素を流しこむ。

tbは最初に宣言してあったね。

tb = /<script(.|\s)*?\/script>/gi,

というわけでscript抜かれる。

まとめ

loadメソッドではセレクタ無しではscript抜かれず、セレクタ有りではscriptが抜かれる。

※ちなみにv1.8.2での当該ソース部分でのコメント

// inject the contents of the document in, removing the scripts
// to avoid any 'Permission Denied' errors in IE

なんで抜かれるん!って思ったけどちょっと分かった。
要するに、もしセレクタ内のscriptを取得してしまうと、
セレクタ範囲外におけるscriptとの依存関係が不明で、
動作保証できないし危険だということだと思う。

DOM配列をforEachで回す

まず、古いブラウザは無視する前提として。


DOM配列は通常の配列と違うので、ArrayのforEachってできないので、こうやったら回せるメモ。

Array.prototype.forEach.call(data,function(item){
  console.log(item);
  //any statement...
})
/*
dataには、document.querySelectorAll('div')などの、
純DOMオブジェクトを入れたら良いです
*/


Array.prototypeが面倒くさいというなら、これでもいけるね。
配列インスタンスリテラル

[].forEach.call(data,function(item){
  console.log(item);
  //any statement...
})


無名callback関数には引数3つ渡せる。
第1はひとつのエレメント、第2はインデックス、第3は配列全体

[].forEach.call(data,function(item,i,list){ //引数名は任意
  console.log(item,i,list);
  //any statement...
})