- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Firefox 上的 Greasemonkey 和 Chrome 上的 Tampermonkey 中使用用户脚本已有一年半多了。它在每个网页上添加了一个滚动到顶部按钮。我尝试添加另一个站点以包含在 Greasemonkey 中,但后来它似乎破坏了它。现在,滚动到顶部按钮不会显示在 Firefox 中的任何网站上,但完全相同的用户脚本在 Tampermonkey 上的 Chrome 中工作没有问题。我没有创建这个脚本。我在 Userscripts.org 崩溃之前从它那里得到了它。下面是脚本。有谁知道脚本中可能需要更改哪些内容才能使其再次与 Greasemonkey 兼容?
我在 xUbuntu 和 Greasemonkey 3.4.1 上使用 Firefox 41.0。我的 Chrome 是 45.0.2454.101,Tampermonkey 是 3.11。
// ==UserScript==
// @name Scroll To Top Button
// @version v1.3.2
// @include http://*
// @include https://*
// ==/UserScript==
(function(global) {
if(global !== window) return;
function _(id) {
return document.getElementById(id);
}
function bind(context, name) {
return function() {
return context[name].apply(context, arguments);
}
}
global.addEventListener('scroll', scrollHandler, false);
function scrollHandler() {
!scroll.isScrolling && ((scroll.getScrollY() > 0) ? scroll.showBtn() : scroll.hideBtn());
}
var scroll = {
__scrollY : 0,
isScrolling : false, //is scrolling
imgBtn : null,
isBtnShow : false,
pageHeight : 0,
speed : 0.75,
init : function() {
var document = global.document,
div = document.createElement('div'),
css;
css = '#__scrollToTop{font:12px/1em Arial,Helvetica,sans-serif;margin:0;padding:0;position:fixed;display:none;left:92%;top:80%;text-align:center;z-index:999999; width:74px;height:50px;' +
'cursor:pointer;opacity:0.5;padding:2px;}' +
'#__scrollToTop:hover{opacity:1;}' +
'#__scrollToTop span.__scroll__arrow{ position:relative;top:20px;background:none repeat scroll 0 0 #eee;border-style:solid; border-width:1px;' +
'border-color:#ccc #ccc #aaa; border-radius:5px;color:#333;font-size:36px;padding:5px 8px 2px;}' +
' #__scroll__scroll{height:50px;width:50px;float:left;z-index:100001;position:absolute;} ' +
'#__scroll__util{font:12px/1em Arial,Helvetica,sans-serif;text-align:center;height:44px;width:20px;float:right;position:absolute;left:54px;z-index:100000; ' +
'border-style:solid; border-width:1px;border-color:#ccc #ccc #aaa; border-radius:2px;top:5px;display:none;}' +
'#__scroll__util span{display:block;height:18px;padding-top:4px;text-align:center;text-shadow:2px 2px 2px #888;font-size:16px;} ' +
'#__scroll__util span:hover{background-color: #fc9822;}';
GM_addStyle(css);
div.id = '__scrollToTop';
div.title = 'Back To Top';
div.innerHTML = '<div id="__scroll__scroll">' +
'<span class="__scroll__arrow">▲</span>' +
'</div>' +
'<div id="__scroll__util">' +
'<span name="__hide" title="Hide the Button">x</span>' +
'<span name="__bottom" title="Scroll to the bottom">▼</span>' +
'</div>';
document.body.appendChild(div);
div.addEventListener('mousedown', bind(this, 'control'),false);
div.addEventListener('mouseover', bind(this, 'showUtil'),false);
div.addEventListener('mouseout', bind(this, 'hideUtil'),false);
this.util = _('__scroll__util');
this.pageUtil = _('__scroll__page');
this.pageHeight = document.body.scrollHeight;
return this.imgBtn = div;
},
getImgBtn : function() {
return this.imgBtn || this.init();
},
show : function(elem) {
elem.style.display = 'block';
},
hide : function(elem) {
elem.style.display = 'none';
},
showBtn : function() {
if(this.isBtnShow) return;
this.isBtnShow = true;
this.show(this.getImgBtn());
},
hideBtn : function() {
if(!this.isBtnShow) return;
this.isBtnShow = false;
this.hide(this.getImgBtn());
},
getScrollY : function() {
//this piece of code is from John Resig's book 'Pro JavaScript Techniques'
var de = document.documentElement;
return this.__scrollY = (self.pageYOffset ||
( de && de.scrollTop ) ||
document.body.scrollTop);
},
closeBtn : function(event) {
event.preventDefault();
event.stopPropagation();
this.hideBtn();
window.removeEventListener('scroll', scrollHandler, false);
},
showUtil : function() {
this.show(this.util);
},
hideUtil : function() {
this.hide(this.util);
},
scroll : function() {
if(!this.isScrolling) {
this.isScrolling = true;
}
var isStop = false,
scrollY = this.__scrollY;
if(this.direction === 'top') {
isStop = scrollY > 0;
this.__scrollY = Math.floor(scrollY * this.speed);
} else {
isStop = scrollY < this.pageHeight;
this.__scrollY += Math.ceil((this.pageHeight - scrollY) * (1 - this.speed)) + 10;
}
this.isScrolling = isStop;
window.scrollTo(0, this.__scrollY);
isStop ? setTimeout(bind(scroll, 'scroll'), 20) : (this.direction === 'top' && this.hideBtn());
},
control : function(e) {
var t = e.target, name = t.getAttribute('name');
switch(name) {
case '__bottom':
this.scrollToBottom();
break;
case '__hide' :
this.closeBtn(e);
break;
default :
this.scrollToTop();
break;
}
},
scrollToTop : function() {
this.direction = 'top';
this.scroll();
},
scrollToBottom : function() {
this.direction = 'bottom';
var bodyHeight = global.document.body.scrollHeight,
documentElementHeight = global.document.documentElement.scrollHeight;
this.pageHeight = Math.max(bodyHeight, documentElementHeight);
this.scroll();
}
};
//Autoscroll
(function() {
var isAutoScroll = false;
var autoScroll = {
__autoScrollID : 0,
isAutoScroll : false,
defaultSpeed : 1,
currentSpeed : 1,
intervalTime : 100,
reset : function() {
this.isAutoScroll && (this.currentSpeed = this.defaultSpeed);
},
startOrStop : function() {
var that = this;
if(that.isAutoScroll) {
that.isAutoScroll = false;
clearInterval(that.__autoScrollID);
} else {
that.isAutoScroll = true;
that.__autoScrollID = setInterval(function() {
global.scrollBy(0, that.currentSpeed);
}, that.intervalTime);
}
},
fast : function() {
this.isAutoScroll && this.currentSpeed <= 10 && this.currentSpeed++;
},
slow : function() {
this.isAutoScroll && this.currentSpeed > 1 && this.currentSpeed--;
},
keyControl : function(e) {
if(e.target != global.document.body && e.target != global.document.documentElement) return false; // only when the cursor focus on the page rather than the input area can trigger this event.
var charCode = e.charCode,
key = this.keyMap[charCode];
key && this[key]();
},
keyMap : {
'100' : 'slow', // press 'd', slow the speed of the scroll
'102' : 'fast', // press 'f', speed scroll
'114' : 'reset', // press 'r', reset the autoscroll's speed
'115' : 'startOrStop' //when you click 's' at the first time, the autoscroll is begin, and then you click again, it will stop.
}
};
global.addEventListener('keypress', bind(autoScroll, 'keyControl'), false);
}())
}(window.top))
最佳答案
在新行的 //==/UserScript==
之前添加:
// @grant GM_addStyle
事实上,我很惊讶它到现在为止仍然有效,因为 Greasemonkey 需要 @grant
一年多了。
关于javascript - 用户脚本在 Chrome 上的 Tampermonkey 中有效,但在 Firefox 上的 Greasemonkey 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957523/
这个问题在这里已经有了答案: How to call Greasemonkey's GM_ functions from code that must run in the target page s
是否可以使用 Greasemonkey 脚本跨域存储数据?我想允许从使用相同 Greasemonkey 脚本的多个网站访问 Javascript 对象。 最佳答案 是的,这就是 GM_setvalue
我有一个简单的 Greasemonkey 脚本: // ==UserScript== // @name hello // @namespace http://www.webmonkey.com //
我想写一个非常简单的 greasemonkey 脚本,因为我讨厌“你确定吗?”我经常使用的网站上的 javascript 确认。我只是将它用于个人用途,不会发布它或任何东西。经过一番谷歌搜索后,我找到
这是一个有点奇怪的具体问题。 我正在编写一个可以跨十个域运行的 Greasemonkey 脚本。这些网站都具有相同的结构,但每个网站的域名不同。例如,脚本将运行: http://first-domai
我为一个域制作了一个greasemonkey脚本,现在如何让它只运行一次?就像每次访问域时它都会启动一样,我不希望这样。如何使其仅运行一次,然后删除自身或使其处于非事件状态? 谢谢。 最佳答案 如果您
我发现了很多类似的问题,但没有一个是平等的,也没有正确的解决方案。这是一个非常奇怪的问题。 我有一个简单的 Greasemonkey 脚本来测试这个问题: // ==UserScript== // @
我正在写一个 Greasemonkey 脚本,如何实现自动更新? 可以将脚本放入 GitHub 存储库并设置 @version数字? 然后......是一些自动的方式如何做到这一点?或者我必须手动检查
我现在正在研究用户脚本。我知道 Opera 与 Greasemonkey 脚本的许多方面兼容,但与其他方面不兼容。 GM functions emulation script在 Opera 上将需要,
最近在写一个用户脚本时,我发现页面上下文中的变量是可用的。 console.log(window) 在 Tampermonkey 和 Greasemonkey 中都没有导致错误。 我很困惑。全局变量不
看完后Greasemonkey recommends users to install Tampermonkey or Violentmonkey . 我已经安装了 Tampermonkey,现在我正
我在一堆 div 和一个表单中包含了一些输入值。我对 js 的了解有限,想在页面加载时使用油脂猴来设置值。 下面显示了获取值的 div 和表单的顺序。
有没有办法使用用户脚本将一些设置保存到不是 cookie 的本地计算机? 如果设置不是全局的,则很难制作用于多个域的用户脚本。 来自评论: "I am using scriptish " 。 最佳答案
我有一个带有以下元块的油脂猴脚本- // ==UserScript== // @name TDF Improved Dark Skin // @namespace TDF // @incl
我有用于Firefox的Greasemonkey脚本。该脚本包括此元块和一些代码行。 我想在服务器上更新脚本,然后自动更新浏览器的脚本。 requireSecureUpdates选项已关闭。 我究竟做
我正在按照说明将 Greasemonkey 脚本传输到 Tampermonkey:How to Transfer All Greasemonkey userscripts to Tampermonke
This question already has an answer here: My very simple Greasemonkey script is not running? (1个答案)
我需要在公司内部网站上托管用户脚本。我如何构建 href这样 Greasemonkey 会在点击链接时安装用户脚本吗? 我尝试了一个简单的 Install Userscript但是 Chrome 和
例如,在远程网页中,有如下代码片段: function foo(){ this.bar = 0; } 在我的油脂猴子脚本中,我想创建此类的对象: var _foo= unsafeWindow['fo
我想在文档中选择文本后调用函数。以下代码无效 var showSelWin = document.getElementById('innerwindow'); var txt = ' '; if (d
我是一名优秀的程序员,十分优秀!