- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在创建一个 GreaseMonkey 脚本来改进 Stack Overflow 使用的 10k 工具的用户界面。我遇到了一个无法重现且坦率地说很奇怪的问题,这让我和 JavaScript room 中的其他人感到困惑。在 SO Chat 上。 several lengthy 之后我们还没有找到原因debugging sessions .
可以找到有问题的脚本here . Source - Install
问题出现在第 85 行,'vodoo' 注释之后的行:
return (t + ' (' + +(+f.offensive + +f.spam) + ')');
可能看起来有点奇怪,但是两个变量和内部括号前面的+
是类型强制,里面的+
是加法,其他的用于连接。
没有什么特别的,但细心的读者可能会注意到内部括号上的类型强制是不必要的,因为两者都已经被类型强制转换为数字,并且当它们连接成字符串时类型强制结果是无用的。不是这样!删除 +
会破坏脚本,导致 f.offensive
和 f.spam
被连接起来而不是加在一起。
进一步添加 console.log
只会让事情变得更加困惑:
console.log(f.offensive + f.spam); // 50
console.log('' + (+f.offensive + +f.spam)); // 5, but returning this yields 50 somehow
console.log('' + (+f.offensive + +f.spam) + ''); // 50
来源:https://chat.stackoverflow.com/transcript/message/203261#203261
问题是这是不可重现的——运行像这样的脚本
console.log('a' + (+'3' + +'1') + 'b');
在 Firebug 控制台中产生正确的结果,正如
(function(){
return 'a' + (+'3' + +'1') + 'b';
})();
即使提取大块代码并在控制台中运行它们也不会重现此错误:
$('.post-menu a[id^=flag-post-]').each(function(){
var f = {offensive: '4', spam: '1'};
if(f){
$(this).text(function(i, t){
// Vodoo - please do not remove the '+' in front of the inner bracket
return (t + ' (' + +(+f.offensive + +f.spam) + ')');
});
}
});
聊天室中的 Tim Stone 有 reproduction instruction对于那些低于 10k 的人。
这个错误只出现在 Firefox 中 - Chrome 似乎没有出现这个问题,让我相信这可能是 Firefox 的 JavaScript 引擎或 Greasemonkey 附加组件的问题。我说得对吗?
我可以在JavaScript room中找到如果您需要更多详细信息和/或想要对此进行讨论。
最佳答案
作为用户脚本进程的一部分,一个<script>
使用通过调用 toString()
检索到的代码将标签注入(inject)到页面中在您定义的功能上。通常这会很好,但似乎 Firefox 3.6.13 使用的 javascript 引擎中存在一个错误,该错误重新定位表达式中的括号,导致在 toString()
时以非常不同的方式对其进行评估。 -ified 函数被处理。
为了说明这个问题,我们可以在Firebug中运行如下代码:
function f() { var a = '', b = '1', c = '2'; return a + '(' + (+b + +c) + ')'; };
f.toString();
这给了我们这个输出:
function f() {
var a = "", b = "1", c = "2";
return a + ("(" + + b + + c + ")");
}
您会注意到返回表达式已被修改。括号已被重新定位到之前位于它们之外的字符串之外,导致变量 b
和 c
被强制转换为字符串并连接起来。这给出了意想不到的结果,因为预期的添加从未发生。不幸的是,即使使用 Number()
也会出现这种行为。或 parseInt()
胁迫b
和 c
.
有几个小的修改可以改变这个,但最清楚的是预先将加法的结果保存到一个变量中:
$(this).text(function(i, t){
var c = +f.offensive + +f.spam;
return (t + ' (' + c + ')');
});
幸运的是,这个问题似乎没有出现在 Firefox 4 beta 中,所以希望这个问题已经得到解决。另外,Matthew Flaschen已经慷慨地继续前进并且filed a bug report (标记为 559438 的副本),以便开发人员在任何一种情况下都意识到这个问题。
关于javascript - Firefox 上 Greasemonkey 脚本中 JavaScript 中的类型强制和字符串连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4469044/
这个问题在这里已经有了答案: 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
我是一名优秀的程序员,十分优秀!