简体   繁体   English

简单的用户脚本很慢,有时无法正常工作

[英]Simple Userscript is slow and sometimes doesn't work correctly

just as a side note I am new to JS and this is my first script.顺便说一句,我是 JS 新手,这是我的第一个脚本。

I am writing a small script that should allow me to open the biggest available image in a flickr page in an unfocused newtab using a keyboard shortcut.我正在编写一个小脚本,它应该允许我使用键盘快捷键在未聚焦的新标签页中打开 flickr 页面中最大的可用图像。

I am currently facing two problems:我目前面临两个问题:

  1. The script is slow at loading, meaning that if I change the image in the slideshow using the arrow keys, I will need to wait 1 or 2 seconds before pressing the keyboard shortcut to open the image in the newtab.脚本加载速度很慢,这意味着如果我使用箭头键更改幻灯片中的图像,我需要等待 1 或 2 秒,然后才能按下键盘快捷键在新选项卡中打开图像。 If I don't wait, it will open one of the previous images from the slideshow in the newtab depending on how fast I was skipping through them.如果我不等待,它将根据我跳过它们的速度,在新标签中打开幻灯片中以前的图像之一。 (It should always open the image I am currently viewing in a newtab) (它应该始终打开我当前在新标签中查看的图像)

  2. I use log(mainurl) to print the current contents of "mainurl" which is the link to the biggest available size of the current opened image.我使用 log(mainurl) 打印“mainurl”的当前内容,这是指向当前打开图像的最大可用大小的链接。 but for some reason it is always giving me the url of one of the previous images depending on how fast I am skipping through the slideshow (even though the correct image is opened in the newtab).但由于某种原因,它总是给我前面一张图片的 url,这取决于我跳过幻灯片的速度(即使在新标签中打开了正确的图片)。

Here is a URL to a flickr account if you want to check the script.如果您想检查脚本,这里是一个 flickr 帐户的 URL。 (it must be run in the photostream [slideshow mode]) URL to flickr photostream (必须在照片流中运行[幻灯片模式]) URL 到 flickr 照片流

This is the code I wrote这是我写的代码

// ==UserScript==
// @name         Flickr Max NewTab
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Open Max sized flickr image in a new tab using key shorcut
// @author       Newbie
// @include     /flickr\.com/
// @grant       GM_openInTab
// @require     https://code.jquery.com/jquery-3.3.1.min.js
// ==/UserScript==

var page ='';
var sizes = [];
var links = [];
var length = 0;
var mainurl = '';

function geturl() { // function used to get the link of biggest image
    var action = function (sourceCode) {
        sizes = sourceCode.match(/modelExport: {.+?"sizes":{.+?}}/i); // extract the part of html that containes modelExport:
        links = sizes[0].match(/"displayUrl":"[^"]+"/ig); // extract the urls dictionary from the dictionary modelExport:
        length = links.length; //get the length of the dictionary "links"
        // extract the last(biggest) url from the links dictionary and put them in an array "links"
        mainurl = links[links.length-1].replace(/"displayUrl":"([^"]+)"/i, "$1").replace(/\\/g, "").replace(/(_[a-z])\.([a-z]{3,4})/i, '$1' + "." + '$2');
    }
    $.get(document.URL, action);
}

function log(x) {
    console.log(x);
}
// function used to get to run the url grabber everytime you change the image in slideshow using arrowkeys
function navigation (e) {
    if (e.keyCode == 37 || e.keyCode == 39) {
        geturl();
        log(mainurl);// log to check the current contents of mainurl
    }
}
// function used to open image in a newtab when "alt + Q" are pressed
function newtab (e) {
    if (e.altKey && e.keyCode == 81) {
        GM_openInTab(mainurl);
    }
}

geturl(); //run the function

document.addEventListener('keyup', navigation);
document.addEventListener('keydown', newtab);

Thanks a lot for any help !非常感谢您的帮助!

It's best to intercept the existing fast request made by the site to its server API (you can inspect it in devtools network panel) instead of making an additional slow request.最好拦截站点向其服务器 API 发出的现有快速请求(您可以在 devtools 网络面板中检查它),而不是发出额外的慢速请求。

For that we will use unsafeWindow and hook XMLHttpRequest prototype.为此,我们将使用unsafeWindow和钩子XMLHttpRequest原型。 Also run the script at document-start so it attaches the interceptor before the page makes the request.还要在document-start处运行脚本,以便在页面发出请求之前附加拦截器。

// ==UserScript==
// @name        Flickr Max NewTab
// @match       https://www.flickr.com/*
// @grant       GM_openInTab
// @run-at      document-start
// ==/UserScript==

const xhrOpen = unsafeWindow.XMLHttpRequest.prototype.open;
unsafeWindow.XMLHttpRequest.prototype.open = function (method, url) {
  if (/method=[^&]*?(getPhotos|getInfo)/.test(url)) {
    this.addEventListener('load', onXhrLoad, {once: true});
  }
  return xhrOpen.apply(this, arguments);
};

const imgUrls = {};

function onXhrLoad() {
  const json = JSON.parse(this.response);
  const photos = json.photos ? json.photos.photo : [json.photo];
  for (const {id, url_o} of photos) {
    imgUrls[id] = url_o;
  }
}

document.addEventListener('keydown', e => {
  if (e.altKey && e.code === 'KeyQ' && !e.shiftKey && !e.ctrlKey && !e.metaKey) {
    const id = location.pathname.split('/')[3];
    const url = imgUrls[id];
    if (url) GM_openInTab(url, true);
  }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM