您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Fix Deviantart's SitBack page for flash-less browsers.
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // Hush /* jshint multistr: true */ // ==UserScript== // @name leanforward // @namespace https://greasyfork.org/en/users/24734-ctag // @description Fix Deviantart's SitBack page for flash-less browsers. // @version 01.02.02 // @author Christopher Bero // @license LGPL-3.0 http://www.gnu.org/licenses/lgpl-3.0.en.html // @homepageURL https://github.com/ctag/leanforward // @resource license http://www.gnu.org/licenses/lgpl-3.0.txt // @include /.*justsitback\.deviantart\.com.*/ // @grant GM_xmlhttpRequest // @grant GM_info // @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js // @run-at document-idle // ==/UserScript== // Variables var _DEBUG = false; var divContent = document.getElementById("sitbackcontent"); var imageLoad; var imageDisp; var deviationData = []; var imageIndex = 0; var timerID; // RSS Request Variables var queryData; var rssUrl; var rssBase = 'http://backend.deviantart.com/rss.xml?type=deviation'; var reqJson; // http RSS request options var limit = 20; // fetch 20 images at a time var offset = 0; // offset from front, incremented by 'limit' var rssEnd = false; // Boolean, are we out of RSS data? // Transition variables var delay = 10000; if (_DEBUG) console.log("Running leanforward.user.js [" + GM_info.script.version + "]"); /** * getQueryVariable * Get the rssQuery GET variable from the sitback URL */ function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); if (pair[0] == variable) { return pair[1]; } } return (false); } function displayNext() { imageIndex++; if (imageIndex >= deviationData.length) { imageIndex = 0; } //if (_DEBUG) console.log("Setting image to: ", imageLoad.attr('src')); console.log("Loading image: " + imageIndex); imageDisp.attr('src', imageLoad.attr('src')); imageLoad.attr('src', deviationData[imageIndex].image.url); if (imageIndex === (deviationData.length - limit + 1)) { console.log("End of images! Getting more..."); //window.clearInterval(timerID); doTransfer(); } } function addGetVar(url, name, value) { url = url + '&' + name + '=' + value; return url; } function buildQueryURL() { if (!queryData) { queryData = getQueryVariable('rssQuery'); } rssUrl = addGetVar(rssBase, 'q', queryData); rssUrl = addGetVar(rssUrl, 'limit', limit); rssUrl = addGetVar(rssUrl, 'offset', offset); offset += limit; console.log("Build Query URL: ", rssUrl); } function loopStart() { timerID = window.setInterval(displayNext, delay); } function loopStop() { window.clearInterval(timerID); } function transferComplete(data) { if (_DEBUG) console.log("Transfer Complete: "); var xml = $.parseXML(data.responseText); var parsed = $(xml); var items = parsed.find('item'); $.each(items, function () { item = $(this); deviation = {}; deviation.image = {}; deviation.title = item.find('title').text(); deviation.description = item.find('description').text(); deviation.url = item.find('link').text(); // A url to the page deviation.copyright = item.find('media\\:copyright, copyright').text(); deviation.copyrightUrl = item.find('media\\:copyright, copyright').attr('url'); deviation.image.url = item.find('media\\:content, content').attr('url'); deviation.image.width = item.find('media\\:content, content').attr('width'); deviation.image.height = item.find('media\\:content, content').attr('height'); deviation.image.medium = item.find('media\\:content, content').attr('medium'); deviationData.push(deviation); if (_DEBUG) console.log("New image data: ", deviation); }); //if (_DEBUG) console.log("transfer complete data: ", data.responseText); // var reg = /<media:content url=\"(.*)\" height/mg; // gross, I know. // var match = reg.exec(data.responseText); // while (match !== null) { // deviationData.push(match[1]); // match = reg.exec(data.responseText); // } //if (_DEBUG) console.log("Images: ", deviationData); if (!imageDisp.attr('src')) { imageDisp.attr('src', deviationData[0].image.url); imageLoad.attr('src', deviationData[1].image.url); imageIndex = 0; loopStart(); } } function transferFailed(error) { console.log("http Request Error: ", error); } function doTransfer() { console.log("Getting an additional " + limit + " images, already have " + deviationData.length); buildQueryURL(); // Send cross-site RSS request GM_xmlhttpRequest({ method: "GET", synchronous: false, timeout: delay, url: rssUrl, onload: transferComplete, onerror: transferFailed, onabort: transferFailed, ontimeout: transferFailed }); } function setup() { // console.log("Doc domain: ", document.domain); // document.domain = "deviantart.com"; // Doesn't work here // console.log(document.domain); divContent.textContent = ""; var img1 = document.createElement("img"); var img2 = document.createElement("img"); img1.id = "img_load"; img1.className = "img_loading"; img2.id = "img_disp"; img2.className = "img_displayed"; divContent.appendChild(img1); divContent.appendChild(img2); imageLoad = $("#img_load"); imageDisp = $("#img_disp"); imageLoad.css({ "max-width": "100%", "max-height": "100%", "display": "none" }); imageDisp.css({ "max-width": "100%", "max-height": "100%", "display": "block", "margin": "0 auto" }); console.log("Done with setup()"); } /** * DO THINGS */ // Throw something on the page. divContent.textContent = "Oh, hello there! Give us just a second to fetch your images..."; // Setup the page setup(); // Kick off the RSS feed loop doTransfer(); /** * ONLY UNUSED CODE BELOW HERE */ // googleUrl = document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=-1&q=' + encodeURIComponent(rssUrl); // function getRSS(rssURL) { // $.ajax({ // url: rssURL, // type: "GET", // crossDomain: true, // dataType: 'json', // success: function(xml) { // deviationData.length = xml.responseData.feed.entries.length; // console.log("Array Length: ", deviationData.length); // for (var i = 0; i < deviationData.length; i++) { // deviationData.push(xml.responseData.feed.entries[i].mediaGroups[0].contents[0].url); // //console.log("Image: ", deviationData[i]); // } // document.getElementById("sitbackcontent").textContent = ""; // setupImage(); // // timerID = window.setInterval(displayNext, 5000); // //displayNext(); // }, // error: function(jqXHR, textStatus, errorThrown) { // console.log('Unable to load feed, Incorrect path or invalid feed'); // // console.log('URL: ', googleUrl); // // console.log("Returned text: ", textStatus); // } // }); // }