首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用iframe和Greasemonkey/Scriptish时,"eval不是一个函数“

使用iframe和Greasemonkey/Scriptish时,"eval不是一个函数“
EN

Stack Overflow用户
提问于 2012-09-27 03:02:17
回答 1查看 1.9K关注 0票数 2

有没有办法让这段代码在Greasemonkey/Scriptish中工作,或者我必须把它注入到网页本身?

代码语言:javascript
复制
body = document.getElementsByTagName("body")[0];
fakeConsole = 'window.top._console';
injected = document.getElementById("sandbox") ? true : false;
sandboxframe = injected ? document.getElementsById("sandbox") : document.createElement('iframe');
sandbox = null;

if (!injected) {
   body.appendChild(sandboxframe);
   sandboxframe.setAttribute('id', 'sandbox');
   sandboxframe.setAttribute('style', "display:none")
}

var p = sandboxframe.contentWindow.eval('1 + 1');
console.log(p);

下面的代码在使用source时可以正常工作:

代码语言:javascript
复制
 <script type="text/javascript" src="test.js"></script>

但在Greasemonkey脚本中使用时,我注意到有某种我不太熟悉的安全屏障,并尝试使用unsafeWindow绕过XPCNativeWrapper。

请说明一下这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-27 10:16:11

几件事:

  1. 该代码有一个错误;getElementsById不是一个函数。
  2. 该代码在 1.0或更高版本中可以正常工作,如果指令适用的话。下面有更多关于这方面的内容。
  3. For Scriptish,所有其他浏览器,以及@grant none不可能实现的Greasemonkey场景;你将不得不注入“注入”()代码。
  4. 正如Jeremy J Starcher所说,应该尽可能地避免eval()eval()使性能、维护、调试和安全性变得更加困难。

对于Greasemonkey 1.0及更高版本:

在某些情况下,Greasemonkey不再使用XPCNativeWrapper。参见the doc for the @grant directive

因此,这意味着(1)如果您的脚本没有使用GM_函数,(2)脚本指定了@grant none,那么您的代码将按原样运行( getElementsById输入错误除外)。

请注意,没有其他脚本引擎可以做到这一点。(为了更好的理由。Greasemonkey关于@grant和沙箱的新行为充其量也是有争议的。)

如果您希望使用GM_函数,则必须注入iframe代码。请参阅下一节。

对于脚本、特权Greasemonkey、Chrome等:

Scriptish、沙盒Greasemonkey、Chrome等在各自的沙盒中都不能很好地处理iframe。(请参阅these Q's, for example。)

从GM/userscript运行这类代码的唯一可靠方法是注入它。如下所示:

代码语言:javascript
复制
function gmMain () {
    body = document.getElementsByTagName("body")[0];
    fakeConsole = 'window.top._console';
    injected = document.getElementById("sandbox") ? true : false;
    sandboxframe = injected ? document.getElementById("sandbox") : document.createElement('iframe');
    sandbox = null;

    if (!injected) {
       body.appendChild(sandboxframe);
       sandboxframe.setAttribute('id', 'sandbox');
       sandboxframe.setAttribute('style', "display:none")
    }

    var p = sandboxframe.contentWindow.eval('1 + 1');
    console.log(p);
}

addJS_Node (null, null, gmMain);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12608620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档