相关疑难解决方法(0)

浏览器检测与特征检测

我将在一段时间内扮演一个魔鬼的拥护者.我一直在想为什么浏览器检测(与特征检测相反)被认为是一种不好的做法.如果我测试某个版本的某个浏览器并确认,某个功能的行为是以某种可预测的方式进行的,那么决定做特殊情况似乎没问题.原因在于它将来会万无一失,因为这部分浏览器版本不会改变.另一方面,如果我检测到DOM元素具有函数X,则不一定意味着:

  1. 此功能在所有浏览器中的工作方式相同,并且
  2. 更重要的是,即使在未来的所有浏览器中,它也会以相同的方式工作.

我只是偷看了jQuery源代码,他们通过在DOM中插入一个精心构建的HTML片段然后检查它的特定功能来进行特征检测.这是一种明智而坚实的方式,但我会说,如果我在我的小小的个人JavaScript(没有jQuery)中做了类似的事情,那将会有点太沉重.它们还具有几乎无限的QA资源的优势.另一方面,你经常看到人们做的是他们检查函数X的存在,然后基于此,他们假设函数将在具有此函数的所有浏览器中以某种方式运行.

我没有说任何意义上的功能检测不是一件好事(如果使用得当),但我想知道为什么浏览器检测通常会立即被解雇,即使它听起来合乎逻辑.我想知道这是否是另一个时髦的事情.

html javascript dom cross-browser

43
推荐指数
3
解决办法
3万
查看次数

为什么window(和unsafeWindow)与用户脚本和<script>标签不一样?

在开发这个小用户时我遇到了一个问题.当我想XMLHttpRequest用我的脚本阻止正在运行的网站中的每一个时,没有发生任何事情(至少在Chrome上):

function main() {
  // Override XHR.open with a custom function
  window.XMLHttpRequest.prototype.open = function() {
    // Nothing... so it's supposed to block every xhr.open() call
  }
}
main();
Run Code Online (Sandbox Code Playgroud)

更换时同样的事情windowunsafeWindow.

然而,当我使用这个小技巧时,一切都像魅力一样:

// No more call to main(), and:
var script = document.createElement("script");
script.textContent = "(" + main.toString() + ")();";
document.body.appendChild(script);
Run Code Online (Sandbox Code Playgroud)

每次调用xhr.open都被我的自定义函数替换,不再需要AJAX.

所以我猜这个window元素在main从脚本内部调用时与从<script></script>容器中调用时的元素不同.有人能解释一下为什么吗?

javascript greasemonkey scope userscripts

18
推荐指数
1
解决办法
1万
查看次数

从Greasemonkey访问变量到页面,反之亦然

我在test.js中有以下代码,它在</ body>之前运行:

alert('stovetop');
alert(greasy);
Run Code Online (Sandbox Code Playgroud)

我在test.user.js中有以下代码:

(function () {

    'use strict';
    var greasy = 'greasy variable';
    document.title = 'greasy title';

}());
Run Code Online (Sandbox Code Playgroud)

'炉灶'得到警报,所以我知道页面javascript工作,并document.title得到更改,所以我知道脚本javascript工作.但是,在网页上我收到错误:

错误:ReferenceError:未定义greasy源文件:/test.js

如何从网页上访问由Greasemonkey设置的变量,反之亦然?

javascript firefox greasemonkey firefox-addon

9
推荐指数
1
解决办法
2万
查看次数

JavaScript检查是否为Chrome,Firefox和Opera安装了浏览器扩展程序


如果没有为Chrome,Firefox和Opera 安装扩展程序, 我想在我们的网站上显示自定义栏(通知如:安装我们的插件.).如果安装了扩展,则不会显示任何内容.

这个想法是:
1.用户访问我们的网站和一个显示消息的栏 - "嘿,安装我们的扩展".
2.安装用户点击安装和扩展.用户无需打开它.
3.用户再次访问我们的网站,并且在安装扩展程序后,该栏不会再次出现.
我们只讨论安装检查,而不是cookie.

到目前为止,我只能为Chrome找到解决方案:http://blog.kotowicz.net/2012/02/intro-to-chrome-addons-hacking.html
和Firefox:http://webdevwonders.com/detecting- firefox-add-ons /
Opera从未被提及过.

有没有办法为Opera做到这一点,基于检查扩展的一部分的本地资源的想法:
chrome-extension:// - 扩展ID - /blank.gif
Firefox chrome:// firebug /内容/ blank.gif

或者: 有没有一种简单的方法可以检查Chrome,Firefox和Opera是否安装了扩展程序?

javascript firefox opera

6
推荐指数
1
解决办法
6805
查看次数