「先っぽだけだから!」
一番信用のないセリフNo.1
思い立ち
あるサイト用に、最初に見つけた画像を開く bookmerklet を作成しようと考えていた。
基本 ワンライナー は嫌いだが、bookmerklet となると少々事情が異なる。
今回は 新しく開く 動作を行うため、何度も実行されてしまうと、よもやセルフな ブラクラ になるのでなんとか避けたい。
そんな訳で butter better の な 犬 解 を模索してみた。
思案
① querySelectorAll + forEach
document.querySelectorAll('img[src]').forEach((img) => window.open(img.src));
('A`).。oO (1回ででええねんで...)
② Optional Chaining
window.open(document.querySelector('img[src]')?.src);
('A`).。oO (必ずopnenが処理されちゃって、無い時にエラーになっちゃって意味ないなぁ...)
③ if文
let img = document.querySelector('img[src]');
if(img) {
window.open(img.src);
}
('A`).。oO (if文書きたくないなぁ...変数もわざわざ作りたくないでござる...)
④ querySelector + スプレッド構文
[...document.querySelector('img[src]')].forEach((img) => window.open(img.src));
('A`).。oO (ぬるぅ....)
⑤ スプレッド構文 + Optional Chaining
[...document.querySelector('img[src]')?].(略);
('A`).。oO (そんな構文はねぇ...)
⑥ 関数
let f = function(val, callback) {
if(val) {
callback.call(val);
}
};
f(document.querySelector('img[src]'), (img) => window.open(img.src));
('A`).。oO (これならif文のほうがマシ...)
解
querySelectorAll + スプレッド構文 + slice + forEach
[...document.querySelectorAll('img[src]')].slice(0, 1).forEach((img) => window.open(img.src));
('A`).。oO (要素数が 0 or 1 で querySelectorAll の forEach がイキるぜ!)
おまけ( bookmarklet)
javascript:(function() {[...document.querySelectorAll('img[src]')].slice(0, 1).forEach((img) => window.open(img.src));})();
('A`).。oO (やっぱ bookmarklet には ワンライーナー の方が良い...)
余談
Selector とか Spread とか、なんか WIXOSS みたいだなと思った。
(iTMSでサントラ売ってるからみんな買うべし。井内舞子さん最高。)