簡単な解説
- はてなのサーバにスクリプト本体が置かれる
- ブックマークレットには呼び出しコードだけが書かれている
- サイトにscript要素を追加して実行(サイトコンテキスト)
推測入り
- Hatena::Letが作られた当時、IE6の508文字(英数バイト?)制限が厳しかった
- http://koumeis.hatenablog.jp/entry/20090525/1243260713
- ブックマークレット 文字数 制限 - Google 検索
- IE6で開発が停滞していた/IEのシェアがあった ので、世の中にはIE6を使う人がいた
- 必然的に500文字前後で自動的にLOADER経由に切り替わる仕組みにした
- http://secondlife.hatenablog.jp/entry/20100515/1273919432
- それが現在まで使われていた
@require
すると短くてもLOADER経由になる
- https既定(固定)のサイトが増加
- httpsでhttpからのリソースロードがブロックされるように
- 各ブラウザのセキュリティ強化 Chrome 20台中後半〜 その後Firefoxも
- Hatena::Letのロード元はhttp (https不可)
- ユニークかつ強力な機能 「Debuglet」がhttpsでは機能しなくなった
- LOADER経由だと暗黙的に実行されない
- なるべくLOADER回避して使えるようにしていた
- もうすぐ消えるIE8の時点で2000+前後文字数利用できる
- モバイルの事情はわからない
- LOADER制約緩くなるといいですね、と思っていた
http://space.hatena.ne.jp/~/14217943783080792432/14217943783080792434/36
- 既存含む全スクリプトが一律LOADER経由になった。回避のため短く書くのは無意味に
- window.open()の挙動やhttpsで動かす為にLOADER回避したい
@javascript_url
でLOADERの抑制が可能に(javascript:コンテキスト)
- javascript:-contextで動いていた短いコードもsite-contextになる
- コードの挙動が変わる、httpsで動かなくなる
- タブが開くはずの
window.open()
がサイトコンテキストになると - ポップアップになってしまう e.g. Chrome(mium)
- ポップアップブロッカーに引っかかる e.g. Firefox
/*
* @title open new tab/window
* @description assert open new tab/window or pop-up
* @include http://*
* @contributor noromanba
* @license CC0 Univ PD http://creativecommons.org/publicdomain/zero/1.0/
*/
(function () {
window.open('about:blank');
})();
javascript:"http%3A%2F%2Flet.st-hatelabo.com%2Fnoromanba%2Flet%2FhJmcuLLwxJ0z.bookmarklet.js%20%28arg%29".replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28"script"%29%3Bs.charset%3D"utf-8"%3Bs.src%3Durl%2B"%3Fs%3D"%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B
- LOADERの介入を回避する為に
@javascript_url
というアノテーションが出来た - 従来どおりLOADERを通さなくなる
@require
や長大コードでは未検証
/*
* @title open new tab/window w/ @javascript_url
* @description assert open new tab/window or pop-up
* @include http://*
* @contributor noromanba
* @license CC0 Univ PD http://creativecommons.org/publicdomain/zero/1.0/
* @javascript_url
*/
(function () {
window.open('about:blank');
})();
javascript:%28function%28%29%7Bwindow.open%28%27about%3Ablank%27%29%3B%7D%29%28%29%3B%0D
手元でやってる
- httpsで使いたい
- mixed content ブロックの回避
- 自発的なクリックだと認識させたい
window.open()
など
- 適当なブックマークを編集
- Packedなコードをコピペ
javascript:
を先頭に付ける
- ただし、元々LOADER経由の場合はそのままでは動かない場合あり
@require
してる場合- LOADERのPackコードがセミコロン抜けなのでエラーになる。逐一手動補完する必要あり
- 要因色々あるのでまだ割り切れない
- LOADER化されない不具合の対応らしいけど未体験
- http://space.hatena.ne.jp/~/14217943783080792432/14217943783080792434/35
@javascript_url
も実験段階
@javascript_url
(実験的)
このフィールドが指定されていると、無名関数に入れて外部 JavaScript ファイルとして読み込むのではなく、できるだけコードを短縮して
javascript:
URL に直接埋め込みます。
正しく扱えるコードの長さはブラウザーにより異なります。また、 構文によってはただしく短縮できないことがあります。
この機能は実験的なものであり、将来的に変更または削除する可能性があります。
極力LOADERは避けたい
- 長いスクリプトのLOADER化する判定が直ってほしい
- 根本的に直るとうれしい
- LOADER化される文字数が2000+〜 になるとうれしい
- 一律LOADER化は過去の遺産が死んでしまう場合がある
- 新しく使う・普通に使う人に負担がかからないのがいちばんよい
window.open()
などよく使われているのでハマリそう@javascript_url
に気づけるか
極論
- https 接続可能にする
- https://let.st-hatelabo.com
- https://let.hatelabo.jp (Debuglet)