jQuery Javascript Node.js 備忘録

# 自分のための jQuery 備忘録
メモさがすよりQiita見るかググる方が早いから、ここにメモ追加していく。

## jQuery
### オブジェクト拡張

```js
//$('<div>')を拡張する
jQuery.extend( this , $('<div>') );
```

### input checkbox
#### チェックする/しない。

```js
$('<input>').prop('checked',true);
$('<input>').prop('checked',false);
```

#### チェック状態取得

```js
$('<input>').prop('checked'); // true or false
```

### click
#### クリックを設定した元情報

```js
$('<button>').click(function(e){
    console.log( $(this) );//これがbutton
});
```

こう書けば、たとえbuttonに子要素が追加されて、それの部分を押されてclickが発動したとしても確実にbutton要素を取れる。
これは `$('<button>').attr("msg","help");` みたいにattrに何か仕込んでいたものを取得する時に役立つ。




## Javascript
### formdata
#### 基本

```js
var fd = new FormData();
fd.append('key',value);
```

#### fdではオブジェクトは送信できない。

```js
var obj = {
    hoge:"fuga",
};
fd.append('key',obj);//NG
```

なのでjson文字列なんかにして送信して、サーバー側でobjectに戻す必要がある。


### JSON
#### オブジェクトをjson文字列にする

```js
JSON.stringify(obj);
```

#### json文字列をオブジェクトにする

```js
JSON.parse(jsonString);
```

### objectのコピー

```js
var origin = { hoge:"huga"};
var newObj = {};
Object.assign( newObj , origin );
//=> newObj = { hoge:"huga"}; になる
```

正確にはマージらしい。
なので、以下のような場合だと思ったようにならない。

```js
var origin = [{ hoge:"huga"}];
var newObj = {};
Object.assign( newObj , origin );
//=> newObj = {"0",{ hoge:"huga"}}; になる
```

ちなみにnewObjの初期値がnullだとエラー。undefinedも多分ダメ。
どんなものでもコピーしたい場合は以下にするとよいかも。

```js
var origin = { hoge:"huga"};
//一度json文字列に変換
var str    = JSON.stringify( origin );
//json文字列からobjectに戻す
var newObj = JSON.parse(str);
```




## Node.js
### CORS(Cross-Origin Resource Sharing)
- ブラウザがオリジン(HTMLを読み込んだサーバのこと)以外のサーバからデータを取得する仕組み。
- 各社のブラウザには、クロスドメイン通信を拒否する仕組みが実装されている。 
- これは、クロスサイトスクリプティングを防止するため。

#### expressでCORSを許可する場合
##### 以下をPOSTなどのアクセスが来た時のresに仕込んでやる。

```js
app.post('/hoge',function(req,res){
    res.setHeader("Access-Control-Allow-Origin","*");
    res.setHeader("Access-Control-Allow-Methods","POST, GET, OPTIONS, PUT, DELETE");
    res.setHeader("Access-Control-Allow-Headers", "Content-Type");
    res.send("hi!");
});
```

##### PUTの場合の注意点
PUTの場合、POSTと違って、preflightという先触れのようなものが来る。「今からCORSでPUTアクセスするけどいいっすか？」みたいなやつ。
まずそれに応答してから本ちゃんのPUTリクエストが来るらしい。
なので、2回返してやる必要がある。

###### 最初にここに来る

```js
app.options('/*',function(req,res){
    res.setHeader("Access-Control-Allow-Origin","*");
    res.setHeader("Access-Control-Allow-Methods","POST, GET, OPTIONS, PUT, DELETE");
    res.setHeader("Access-Control-Allow-Headers", "Content-Type");
    res.send();
});
```

###### 次に本ちゃんがくる

```js
app.put('/hoge',function(req,res){
    res.setHeader("Access-Control-Allow-Origin","*");
    res.setHeader("Access-Control-Allow-Methods","POST, GET, OPTIONS, PUT, DELETE");
    res.setHeader("Access-Control-Allow-Headers", "Content-Type");
    res.send("hi!");
});
```

という感じぽい。
もっと効率良いやり方がありそうなんだけどよくわからん。



## MongoDB Mongoose
### userIdがhogeの人のデータだけ更新

```js
hogeModel.update( {userId:"hoge"}, {$set: setData }, callback);
```

### {upsert: true} .. データが存在すれば更新。なければ挿入。便利。

```js
hogeModel.update( {id:'abc' ,userId:'hoge'}, data , {upsert: true} ,callback);
```

### クエリにundefinedを突っ込むと指定なしと一緒

```js
hogeModel.update( {userId:undefined}, {$set: setData }, callback);
```

エラーが出ると思うじゃないですか。
出ないんですよ。
指定なしと一緒みたい。
どうも仕様ぽいなぁ。
使っているバージョンは4.1.3