@RainbowSpike

RainbowSpike

RainbowSpike
RainbowSpike

Дата рождения: 28.12.1981

Приморский инженер-эколог. Руководитель Комикслейта. Грамматический прапорщик

https://comicslate.org

61 я читаю 50 меня читают
1870 постов
3814 комментариев
RainbowSpike
24 Dec 2017
var spans = document.querySelectorAll('span.thumb');
for (var x in spans) {
 img = spans[x].querySelector('img');
}

ERROR: Execution of script 'Direct Image Link' failed! spans[x].querySelector is not a function

WTF?

24 Dec 2017

var x in spans даст в x какой-нибудь мусор вроде length. Да, это JS

24 Dec 2017

дальше пошли непечатные выражения от Спайка

24 Dec 2017

The for...in statement iterates over the enumerable properties of an object, in original insertion order.

The for...of statement iterates over data that iterable object defines to be iterated over.

#oknsz/4 в ответ на /3
24 Dec 2017

При чём до for..of разрабы js додумывались почти двадцать лет

#oknsz/6 в ответ на /4
24 Dec 2017

ошибку писать перестало. но выковырянные ссылки все с default.jpg

24 Dec 2017

бля. и нахуй я с Гризманки на Тамперманки пересел?

24 Dec 2017

в консоли, что характерно, всё работает. у ГМ консолепригодность чётче соответствует плагинопригодности

24 Dec 2017

tl;dr В первой версии ты полчаешь перечисление свойств объекта, во втором — только данных этого объекта (то, что объект определил как «данные»).

#oknsz/10 в ответ на /5
24 Dec 2017

В общем, если тебе важна поддержка старых версий браузеров делай обычный for() от нуля до длина - 1 (если у тебя что-то массивоподобное), иначе for…of.

#oknsz/11 в ответ на /5
24 Dec 2017

Tenno-Seremel, значит правильно я по жизни for (1;;++) использовал. а тут for in стоит, ну я и продолжил...

#oknsz/12 в ответ на /10
24 Dec 2017

так, но тогда как победить default?

 img = spans[x].querySelector('img');
 src[0] = img.getAttribute('src').replace('simg3\.','').replace('thumbnails','images').replace('thumbnail_','');

лог консоли
x = 0
img = [object HTMLImageElement]
src = default.png
src[0] = default.png

x = 1
img = [object HTMLImageElement]
src = default.png
src[0] = default.png
...

24 Dec 2017

по запросам
console.log('x = ' + x);
console.log('img = ' + img);
console.log('src = ' + img.getAttribute('src'));
console.log('src[0] = '+src[0]);
console.log('');

#oknsz/21 в ответ на /20
24 Dec 2017

то есть проблемы начинаются на стадии запроса getAttribute('src')

#oknsz/22 в ответ на /21
24 Dec 2017

Такого быть не может, ты что-то делаешь не так.

#oknsz/25 в ответ на /24
24 Dec 2017

Ты уверен, что в том время, когда выполняется твой скрипт, в этом атрибуте что-нибудь записано и именно то, что должно быть, а не что-то иное?

#oknsz/27 в ответ на /26
24 Dec 2017

И что? Это не гарантия :) Ты напечатай что у тебя и всё поймёшь.

#oknsz/30 в ответ на /29
24 Dec 2017

Возможно там вообще document-idle надо. Если и так не работает, то только Mutation observers :)

#oknsz/31 в ответ на /29
24 Dec 2017

Tenno-Seremel,
img = spans[x].getElementsByTagName('img')[0];

<img class="lazyload preview " data-original="https://simg3.gelbooru.com/thumbnails/0f/da/thumbnail_0fdafcc1572528f8373ef3d3f3eafd08.jpg" src="https://simg3.gelbooru.com/thumbnails/0f/da/thumbnail_0fdafcc1572528f8373ef3d3f3eafd08.jpg" alt="Image: 3918946" title=" 1girl armor asashio_(kantai_collection) bangs black_dress black_hair black_legwear blouse blue_eyes blush closed_mouth dress exoskeleton eyebrows_visible_through_hair full_body holding holding_weapon kantai_collection kurokaji long_hair long_sleeves looking_at_viewer pantyhose pinafore_dress rocket_launcher sidelocks simple_background smile solo squatting tsurime weapon white_background white_blouse  score:0 rating:safe" style="">

src[0] = img.getAttribute('src')

"https://simg3.gelbooru.com/thumbnails/0f/da/thumbnail_0fdafcc1572528f8373ef3d3f3eafd08.jpg"

src[0] = img.getAttribute('src').replace('simg3.','')

"https://gelbooru.com/thumbnails/0f/da/thumbnail_0fdafcc1572528f8373ef3d3f3eafd08.jpg"

src[0] = img.getAttribute('src').replace('simg3.','').replace('thumbnails','images')

"https://gelbooru.com/images/0f/da/thumbnail_0fdafcc1572528f8373ef3d3f3eafd08.jpg"

src[0] = img.getAttribute('src').replace('simg3.','').replace('thumbnails','images').replace('thumbnail_','');

"https://gelbooru.com/images/0f/da/0fdafcc1572528f8373ef3d3f3eafd08.jpg"
#oknsz/32 в ответ на /30
24 Dec 2017

Эти отрывки понятны только тебе :) Что за src[0]? Просто напиши кусок кода с этим блоком.

#oknsz/34 в ответ на /32
24 Dec 2017

Первый параметр String.prototype.replace() это регулярка, если что. // Пишу потому что вижу точку в той строке.

#oknsz/35 в ответ на /33
24 Dec 2017

Tenno-Seremel,

// ==UserScript==
// @name           Direct Image Link Gelbooru
// @description    Показывает прямые ссылки под эскизами
// @icon           http://gelbooru.com/favicon.png
// @include        http*://*gelbooru.com*
// @grant          none
// @run-at         document-idle
// ==/UserScript==

var spans = document.querySelectorAll('span.thumb');
for (var x = 0; x < spans.length; x++) {
 var img = '',
     src = [],
     links = [],
     labels = ['jpg', 'jpeg', 'gif', 'png'];

 img = spans[x].getElementsByTagName('img')[0];
 src[0] = img.getAttribute('src').replace('simg3\.','').replace('thumbnails','images').replace('thumbnail_','');
 spans[x].appendChild(document.createElement('br'));
 if (!img.className.match('webm')) {
  for (var i = 0; i <= 3; i++) {
   src[i] = src[0].replace('.jpg','.'+labels[i]);
   links[i] = document.createElement('a');
   links[i].setAttribute('href', src[i]);
   links[i].innerHTML = labels[i];
   links[i].style = 'font-size: x-small; margin-left: 3px;';
   spans[x].appendChild(links[i]);
  }
 } else {
  src[0] = src[0].replace('.jpg','.webm');
  links[0] = document.createElement('a');
  links[0].setAttribute('href', src[0]);
  links[0].innerHTML = 'webm';
  links[0].style = 'font-size: x-small; margin-left: 3px;';
  spans[x].appendChild(links[0]);
 }
}
#oknsz/36 в ответ на /34
24 Dec 2017

Хотя нет, строку тоже можно, тогда отбой :)

#oknsz/37 в ответ на /35
24 Dec 2017

Т.е. предположение было верным :) Ъ способ будет запилить mutation observer и следить за изменением атрибута. Там изначально заглушка, которая потом меняется скриптом.

#oknsz/39 в ответ на /38
24 Dec 2017

Ты в этом каменте из консоли что ли вывод элемента дал? Красавец :) К тому времени то оно конечно уже готово.

#oknsz/40 в ответ на /32
24 Dec 2017

вывод из консоли с дефолтом - в течение скрипта. с норм адресом - вручную, конечно

#oknsz/41 в ответ на /40
24 Dec 2017

бля. если эскиз не загружен (на страницу не влез), то всё равно default вылазит. нужно внетрить setInterval проверку в получение src до достижения не-default значения. или страницу прокручивать за 5 секунд

#oknsz/44 в ответ на /38
24 Dec 2017

У них, вероятно, просто умная загрузка и грузится только когда доскроллишь. Всё это решится mutation observer’ом. Правда ссылка будет появляться внезапно, так что проще сначала какие-то плейсхолдеры навтыкать, что б не плясало.

#oknsz/45 в ответ на /44
24 Dec 2017

Tenno-Seremel, не, МО не нужен здесь, он всё равно сможет отследить только когда сам прокрутишь. разницы с юзерскриптом, который сетинтервалит, пока не получит нужное, никакой, и тому тоже прокрутка до конца страницы нужна. и почти никакой разницы с текущим вариантом на 5 секунд

#oknsz/46 в ответ на /45
24 Dec 2017

это ещё не считая того факта, что лишь webm можно определить по классу, остальное приходится перебором ссылок jpg jpeg gif png находить. умела бы качалка сама расширения перебирать - было бы здорово

#oknsz/48 в ответ на /47
24 Dec 2017

А разница? И при чём тут прокрутка до конца страницы? Ты автоматический выкачивальщий делаешь что ли?

И таки вызывать скрипт только когда надо vs постоянно дёргать по таймеру разница всё же есть :) С mutation observer тебе не надо ждать 5 секунд. Как только данные поменяется твой скрипт встанет в строй.

#oknsz/49 в ответ на /46
24 Dec 2017

У картинок есть атрибут data-original, чего вы тут на ровном месте проблемы придумываете блэт

24 Dec 2017

lol. Вообще не в курсе как там устроена разметка.

#oknsz/52 в ответ на /50
24 Dec 2017

RainbowSpike, думаю, именно на его значение меняется атрибут src при выполнении скриптов, и не вижу причин не брать data-original сразу (если я правильно понял задачу)

#oknsz/53 в ответ на /51
24 Dec 2017

Открой разметку внутрях и посмотри. Не в DOM.

#oknsz/54 в ответ на /51
24 Dec 2017

Консоль показывает текущее состоянее DOM. Оно может не совпадать с изначальным, внезапно.

#oknsz/56 в ответ на /55

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.