1

我有一个与(我的)服务器上的 servlet 通信的小 Greasemonkey 脚本。servlet 正在发回 JavaScript 代码,我在GM_xmlhttpRequest.

到目前为止,一切正常。现在,我想使用GM_xmlhttpRequest从该eval()ed 代码中发送另一个。在这里我被困住了。我没有看到任何错误,但所有GM_*功能似乎都无法在eval(responsetext).

GM_xmlhttpRequest如果我在 onload 处理程序中硬编码(否eval()),它工作正常。

4

3 回答 3

1

Greasemonkey (GM) 托管用户脚本,这意味着它可以向用户脚本添加函数和对象,当您调用 eval() 脚本运行非托管(香草 JavaScript 正在运行它)并且您没有得到 GM API里面。

于 2009-07-02T13:14:16.023 回答
1

可以解决此问题,您可以使用set to from 'ed 代码调用GM_*函数。尝试类似:setTimeout0eval

function myFunction()
{
  GMXmlHttpRequest(...)
}

eval('setTimeout(myFunction, 0)');

更好的解决方案是使用一个为您执行此操作Function.prototype的函数进行扩展。safeCall每当您有任何eval将调用GM_*函数的 'ed 代码时,您都需要safeCall在该调用链中的某个位置。

于 2009-07-02T20:57:16.653 回答
0

还有另一种解决方案。我有类似的问题,我不想把我所有的逻辑都放在用户脚本中,因为如果我改变它们,用户需要自己更新它们。所以我想做的是将主逻辑与加载逻辑分开,主逻辑将在开始时由用户脚本加载并评估它们。

所以我做了一个函数“sendRequest”,它是 GM_xmlhttpRequest() 的包装器,无论如何我都需要它,因为方法、服务器 url 和 onError 回调对于我的应用程序总是相同的,所以我只是将它们放入我的“sendRequest”函数中使 xmlhttprequest 简单。

在从服务器加载的主要逻辑javascript代码中,根本没有greasemonkey函数调用。例如,如果我想与服务器通信,我将改为调用 sendRequest。有用。

于 2011-12-29T20:17:28.953 回答