3

我对 Google Chrome 中的 UserScripts 有一点问题,确切地说是进入 iframe 的对象窗口。通过 Google Chrome 控制台非常可行,通过 UserScript 非常不可能,或者到目前为止似乎如此。老实说,这似乎是故意的,好像有某种原因不允许我访问其他窗口对象。

document.body.innerHTML += "<iframe name='iframe'></iframe>";
console.log(top.frames.iframe);
console.log(window.frames.iframe);
console.log(unsafeWindow.frames.iframe);
console.log(document.getElementsByName('iframe')[0].contentWindow);
console.log(document.getElementsByName('iframe')[0].contentDocument.defaultView);

-->

chrome-extension://eelclpmekkanegjojjmaldeddncficoj/script.js:14 undefined
chrome-extension://eelclpmekkanegjojjmaldeddncficoj/script.js:15 undefined
chrome-extension://eelclpmekkanegjojjmaldeddncficoj/script.js:16 undefined
chrome-extension://eelclpmekkanegjojjmaldeddncficoj/script.js:17 undefined
chrome-extension://eelclpmekkanegjojjmaldeddncficoj/script.js:18 undefined

请问Chrome的问题是什么?我真的不明白为什么用户脚本对 javascript 的访问权限比普通脚本少,这意味着什么?顺便说一句,是的,iframe 在同一个域和协议上。:(

4

1 回答 1

2

Chrome 不支持 UnsafeWindow,试试 TamperMonkey,很确定它提供对该变量的只读访问。

contentWindow.document 不适用于 Chrome。contentDocument 应该可以工作。

此外,也不支持跨域的 XMLHttpRequest。其中大部分是出于安全目的。Chrome 中的用户脚本是内容脚本,它们无法访问网页或其他内容脚本定义的函数/变量。主要是为了脚本的安全和隔离,防止脚本相互冲突。

至于 document.getElementsByName('iframe')[0].contentWindow,我认为这是因为您尝试在 iframe 中添加的方式。对于初学者,不要将您的 iframe 命名为“iframe”,这始终是一种非常糟糕的做法。

与其尝试将其添加到正文的 innerHTML 中,不如使用 appendChild(),并将新的 iframe 对象附加到 document.body 中。此外,请尝试使用 document.body.getElementsByName,而不是 document.getElementsByName。

我为 firefox 编写了greasemonkey 脚本,Chrome 似乎过于严格。我希望你知道用户脚本的位置黑客。查看http://wiki.greasespot.net/Location_hack. 您可以在您的用户脚本中使用 Javascript ;) 并且现在只是让您知道,我会非常警告不要弄乱 iframe 和用户脚本。我已经为 Greasemonkey 编写了一个脚本,已经尝试了 6 个月,但不知何故,当我在 iframe 中涉及代码时,有一半的时间,结果是未定义的,而且我从来没有遇到过 javascript 的问题。此外,如果您将 .js 脚本对象从用户脚本注入到文档中,新代码仍然会受到某种影响,因此元素如何随机显示为未定义。经过 6 个月的尝试,我放弃了,我只有一个书签,只是手动将一个 .js 脚本注入到文档中。当然,您不必这样做,您可以使用位置破解从用户脚本中注入代码。但至于基于 iframe 的用户脚本编写整个脚本,我

于 2010-10-31T16:35:39.203 回答