自分のための jQuery 備忘録
メモさがすよりQiita見るかググる方が早いから、ここにメモ追加していく。
jQuery
オブジェクト拡張
//$('<div>')を拡張する
jQuery.extend( this , $('<div>') );
input checkbox
チェックする/しない。
$('<input>').prop('checked',true);
$('<input>').prop('checked',false);
チェック状態取得
$('<input>').prop('checked'); // true or false
click
クリックを設定した元情報
$('<button>').click(function(e){
console.log( $(this) );//これがbutton
});
こう書けば、たとえbuttonに子要素が追加されて、それの部分を押されてclickが発動したとしても確実にbutton要素を取れる。
これは $('<button>').attr("msg","help");
みたいにattrに何か仕込んでいたものを取得する時に役立つ。
Javascript
formdata
基本
var fd = new FormData();
fd.append('key',value);
fdではオブジェクトは送信できない。
var obj = {
hoge:"fuga",
};
fd.append('key',obj);//NG
なのでjson文字列なんかにして送信して、サーバー側でobjectに戻す必要がある。
JSON
オブジェクトをjson文字列にする
JSON.stringify(obj);
json文字列をオブジェクトにする
JSON.parse(jsonString);
objectのコピー
var origin = { hoge:"huga"};
var newObj = {};
Object.assign( newObj , origin );
//=> newObj = { hoge:"huga"}; になる
正確にはマージらしい。
なので、以下のような場合だと思ったようにならない。
var origin = [{ hoge:"huga"}];
var newObj = {};
Object.assign( newObj , origin );
//=> newObj = {"0",{ hoge:"huga"}}; になる
ちなみにnewObjの初期値がnullだとエラー。undefinedも多分ダメ。
どんなものでもコピーしたい場合は以下にするとよいかも。
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に仕込んでやる。
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回返してやる必要がある。
最初にここに来る
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();
});
次に本ちゃんがくる
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の人のデータだけ更新
hogeModel.update( {userId:"hoge"}, {$set: setData }, callback);
{upsert: true} .. データが存在すれば更新。なければ挿入。便利。
hogeModel.update( {id:'abc' ,userId:'hoge'}, data , {upsert: true} ,callback);
クエリにundefinedを突っ込むと指定なしと一緒
hogeModel.update( {userId:undefined}, {$set: setData }, callback);
エラーが出ると思うじゃないですか。
出ないんですよ。
指定なしと一緒みたい。
どうも仕様ぽいなぁ。
使っているバージョンは4.1.3