您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Makes details section more prominent by moving it up to below the download button.
// ==UserScript== // @name DeviantART Details Raised // @version 2019.04.10 // @description Makes details section more prominent by moving it up to below the download button. // @author Obsidian // @namespace https://greasyfork.org/en/users/318252-obsidian // @grant none // @include /^https?://www\.deviantart\.com/.+/art/.*-[0-9]+/ // @include /^https?://www\.deviantart\.com/.+/gallery/ // @include /^https?://www\.deviantart\.com/tag/.+/ // @include /^https?://www\.deviantart\.com/(.+/)*\?.+/ // @include /^https?://www\.deviantart\.com/(.+/)*/ // @include /^https?://www\.deviantart\.com$/ // @run-at document-start // ==/UserScript== (function() { var strScript = 'var insertionListener = function(event){ \r\n' + ' if(event.animationName === "nodeInserted"){ \r\n' + ' if(!!event.target.className && event.target.className.indexOf("dev-metainfo-content dev-metainfo-stats")>0){ \r\n' + ' /* console.log("Node has been inserted: " + event.target); */ \r\n' + ' moveDetailsSection(event.target.parentElement); \r\n' + ' } \r\n' + ' } \r\n' + '}; \r\n' + 'function moveDetailsSection(root) { \r\n' + ' if(typeof root === "undefined" || root===null){root = document;} \r\n' + ' /* console.log(root.className); */ \r\n' + ' var destNode = root.getElementsByClassName("dev-meta-actions")[0]; \r\n' + ' if(typeof destNode === "undefined"){return;} \r\n' + ' var wrapper = document.createElement("div"); \r\n' + ' destNode.parentNode.insertBefore(wrapper, destNode.nextElementSibling); \r\n' + ' var hrNode; \r\n' + ' hrNode = root.getElementsByClassName("dev-metainfo-details")[0].previousElementSibling; \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-details")[0] ); \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-details")[1] ); \r\n' + ' wrapper.appendChild( hrNode ); \r\n' + ' hrNode = root.getElementsByClassName("dev-metainfo-stats")[0].previousElementSibling; \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-stats")[0] ); \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-stats")[1] ); \r\n' + ' wrapper.appendChild( hrNode ); \r\n' + ' console.log("Details/Stats section moved"); \r\n' + ' /** extra: detect and move ".dev-metainfo-license" **/ \r\n' + ' if(root.getElementsByClassName("dev-metainfo-license").length > 0){ \r\n' + ' hrNode = root.getElementsByClassName("dev-metainfo-license")[0].previousElementSibling; \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-license")[0] ); \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-license")[1] ); \r\n' + ' wrapper.appendChild( hrNode ); \r\n' + ' console.log("License section moved"); \r\n' + ' } \r\n' + ' /** extra: detect and move ".dev-metainfo-camera" **/ \r\n' + ' if(root.getElementsByClassName("dev-metainfo-camera").length > 0){ \r\n' + ' hrNode = root.getElementsByClassName("dev-metainfo-camera")[0].previousElementSibling; \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-camera")[0] ); \r\n' + ' wrapper.appendChild( root.getElementsByClassName("dev-metainfo-camera")[1] ); \r\n' + ' wrapper.appendChild( hrNode ); \r\n' + ' console.log("Camera section moved"); \r\n' + ' } \r\n' + '} \r\n' + 'document.addEventListener("animationstart", insertionListener, false); \r\n' + 'document.addEventListener("webkitAnimationStart", insertionListener, false)'; var strCss = '@keyframes nodeInserted { \r\n' + ' from { opacity: 0.99; } \r\n' + ' to { opacity: 1; } \r\n' + '} \r\n' + '.dev-view-meta * { \r\n' + ' animation-duration: 0.001s; \r\n' + ' animation-name: nodeInserted; \r\n' + '}'; var cssNode = window.document.createElement('style'); cssNode.type = 'text/css'; var cssTxt = window.document.createTextNode(strCss); cssNode.appendChild(cssTxt); var scriptNode = window.document.createElement('script'); scriptNode.type = 'text/javascript'; scriptNode.async = true; scriptNode.setAttribute('id', 'insertion-listener'); scriptNode.onload = function(){ // remote script has loaded }; var scriptTxt = window.document.createTextNode(strScript); scriptNode.appendChild(scriptTxt); var inject_elements = function(){ window.document.getElementsByTagName('head')[0].appendChild(cssNode); window.document.getElementsByTagName('head')[0].appendChild(scriptNode); }; // Test if readyState was fired yet and append the elements if(/comp|inter|loaded/.test(document.readyState)){ // In case DOMContentLoaded was already fired, the document readyState will be one of "complete" or "interactive" or (nonstandard) "loaded". inject_elements(); }else{ document.addEventListener("DOMContentLoaded", inject_elements, false); } }());