Открыть все спойлеры на странице
Может ли кто-нибудь написать скрипт (или помочь это сделать) для открытия всех спойлеров на странице по горячей клавише/ам или по кнопке (создаваемой скриптом рядом с первым, к примеру)?
|
страницу угадать надо?
|
var spoilers = [].slice.call(document.querySelectorAll('SPOILERS-SELECTOR')); if (!spoilers.length) return; var btn = document.createElement('button'); btn.type = 'button'; btn.innerHTML = 'Button'; btn.addEventListener('click', function() { spoilers.forEach(function(node) { node.dispatchEvent(new Event('click')); }); }); spoilers[0].parentNode.inserBefore(btn, spoilers[0]); |
Nexus,
строка 10 кавычка!!! |
рони, спасибо :)
|
Цитата:
Если имелось ввиду для какого сайта, то NNM-Club Nexus, Я правильно понимаю, что вместо SPOILERS-SELECTOR нужно вставить нужный в моём случае css-класс, то бишь https://i.imgur.com/MPIID0I.png и я его задействовал посредством расширения для браузера - Tampermonkey таким образом // ==UserScript== // @name New Userscript // @namespace [url]http://tampermonkey.net/[/url] // @version 0.1 // @description try to take over the world! // @author You // @match [url]https://nnm-club.me[/url] // @grant none // ==/UserScript== (function() { 'use strict'; var spoilers = [].slice.call(document.querySelectorAll('spoiler-wrap')); if (!spoilers.length) return; var btn = document.createElement('button'); btn.type = 'button'; btn.innerHTML = 'Button'; btn.addEventListener('click', function() { spoilers.forEach(function(node) { node.dispatchEvent(new Event('click')); }); }); spoilers[0].parentNode.inserBefore(btn, spoilers[0]); })(); Если правильно, то ничего не получается. Создаваемой js-ом кнопки нет или по-крайней мере я её не вижу, а при нажатии на спойлер - открывается только один. |
Capoeirista,
13 строка, точка где? |
Цитата:
Добавил точку к классу, но результат нулевой. |
Capoeirista, строку 22 на это замените:
node.querySelector('.clickable').dispatchEvent(new Event('click')); |
Capoeirista,
кнопка появилась? |
Nexus,
может класс hide убрать, вместо клика? |
Цитата:
|
рони, клик по ".clickable" открывает спойлер, проверил.
|
И строку 7 нужно заменить на это:
// @match [url]https://nnm-club.me*[/url] |
Цитата:
|
Цитата:
|
В название метода "insertBefore" буковки "t" не хватало :)
// ==UserScript== // @name New Userscript // @namespace [url]http://tampermonkey.net/[/url] // @version 0.1 // @description try to take over the world! // @author You // @match [url]https://nnm-club.me*[/url] // @grant none // ==/UserScript== (function(){ var spoilers = [].slice.call(document.querySelectorAll('.spoiler-wrap')); if (!spoilers.length) return; var btn = document.createElement('button'); btn.type = 'button'; btn.innerHTML = 'Button'; btn.addEventListener('click', function() { spoilers.forEach(function(node) { node.querySelector('.clickable').dispatchEvent(new Event('click')); }); }); spoilers[0].parentNode.insertBefore(btn, spoilers[0]); })(); |
Цитата:
ПС. В общем проблема была в match, кнопка появилась, но всё равно ни фига не работает. Нажимаю и ничего не происходит. // ==UserScript== // @name NNM Spoilers // @namespace [url]http://tampermonkey.net/[/url] // @version 0.1 // @description try to take over the world! // @author You // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; var spoilers = [].slice.call(document.querySelectorAll('.spoiler-wrap')); if (!spoilers.length) return; var btn = document.createElement('button'); btn.type = 'button'; btn.innerHTML = 'Button'; btn.addEventListener('click', function() { spoilers.forEach(function(node) { node.dispatchEvent(new Event('click')); }); }); spoilers[0].parentNode.insertBefore(btn, spoilers[0]); })(); |
Capoeirista, найдите отличия в своем коде и в том, что я в посте 17 выложил.
|
Цитата:
ПС. В общем с совпадением по домену что-то не захотело, прописал общую маску и ... БлагоДарю, Волшебник :) Не против, если опубликую на OpenUserJS и Greasy Fork? Как вставить перенос строки перед кнопкой? Это уже косметика, но всё же ... |
Capoeirista, не против, вряд ли он кому-то пригодится.
|
Цитата:
ПС. Как добавить новый абзац перед кнопкой? JQuery ещё хоть немного учил, а JS как-то хотел, но некогда. Хотел сам добавить, но что-то не получилось. https://i.imgur.com/CC1rk6o.png https://i.imgur.com/uaMNduL.png |
spoilers[0].insertAdjacentHTML('beforebegin', '<br>'); |
j0hnik,
БлагоДарю |
Цитата:
// ==UserScript== // @name NNM-Club Open Spoilers // @description Создаёт кнопку над первым спойлером, при нажатии на которую открываются все спойлеры на странице NNM-Club. Можно (не проверял, но по логике должно) переделать для другого сайта. Для этого нужно вместо (или добавить через запятую) CSS-класса .spoiler-wrap вставить селектор спойлера с нужного сайта. Добавлено для USBTor.Ru Новое в 0.4: Исключены от открытия скриптом спойлеры - "Список файлов в торренте" и "Похожие темы" // @license MIT // @icon [url]http://nnmclub.to/favicon.ico[/url] // @namespace [url]http://tampermonkey.net/[/url] // @version 0.4 // @author Nexus с сайта JavaScript.Ru // @match *://*/* // @grant none // ==/UserScript== (function() { var spoilers = document.querySelectorAll('div.postbody .spoiler-wrap, .sp-wrap'); if (!spoilers.length) { return; } var CLOSED_SPOILER_LABEL = 'Открыть все спойлеры'; var OPENED_SPOILER_LABEL = 'Закрыть все спойлеры'; var button = document.createElement('button'); button.type = 'button'; button.innerHTML = CLOSED_SPOILER_LABEL; button.dataset.isOpen = '0'; button.style.cssText = 'padding: 5px; border: solid 1px;'; button.addEventListener('click', function () { var spoilerIsOpen = this.dataset.isOpen === '1'; this.dataset.isOpen = +!spoilerIsOpen; this.textContent = spoilerIsOpen ? CLOSED_SPOILER_LABEL : OPENED_SPOILER_LABEL; [].forEach.call(spoilers, function (spoilerWrapper) { var clickTarget; if ( spoilerWrapper.classList.contains('sp-wrap') && spoilerIsOpen === spoilerWrapper.classList.contains('sp-opened') ) { clickTarget = spoilerWrapper.querySelector('.sp-head'); } else if (!spoilerWrapper.parentNode.classList.contains('center')) { clickTarget = spoilerWrapper.querySelector('.clickable'); } clickTarget && clickTarget.dispatchEvent( new Event('click', { bubbles: true }) ); }); }); var buttonContainer = document.createElement('div'); buttonContainer.style.margin = '8px auto'; buttonContainer.style.width = '98%'; buttonContainer.appendChild(button); spoilers[0].parentNode.insertBefore(buttonContainer, spoilers[0]); })(); |
Может кто поправить для сайта 4PDA?
И чтобы также открывались спойлеры внутри спойлеров. Например на странице https://4pda.to/forum/index.php?showtopic=949619 (function () { var spoilers = [].slice.call(document.querySelectorAll('div.postcolor .spoil')); if (!spoilers.length) { return; } var btn = document.createElement('button'); btn.type = 'button'; btn.innerHTML = 'Открыть все спойлеры'; btn.addEventListener('click', function () { spoilers.forEach(function (node) { if(node.parentNode.classList.contains('close')) return; node.querySelector('.block-title').dispatchEvent(new Event('click')); }); }); spoilers[0].insertAdjacentHTML('beforebegin', '<br>'); spoilers[0].parentNode.insertBefore(btn, spoilers[0]); })(); |
Цитата:
(function () { var spoilers = document.querySelectorAll('div.post-block.spoil'); if (!spoilers.length) { return; } var btn = document.createElement('button'); btn.type = 'button'; btn.innerHTML = 'Открыть все спойлеры'; btn.addEventListener('click', function () { spoilers.forEach(function (node) { node.classList.replace('close', 'open'); const imgs = node.querySelectorAll('img[data-src]'); imgs.forEach (img => img.src = img.dataset.src) }); }); spoilers[0].insertAdjacentHTML('beforebegin', '<br>'); spoilers[0].parentNode.insertBefore(btn, spoilers[0]); })(); Но там вообщето Ctrl + click по спойлеру открывает все спойлеры. |
Часовой пояс GMT +3, время: 21:48. |