从eval执行GM_xmlhttpRequest()

时间:2009-07-02 13:08:34

标签: greasemonkey

我有一个Greasemonkey脚本,它与(我的)服务器上的servlet通信。 servlet正在发回JavaScript代码,我在GM_xmlhttpRequest的onload处理程序中eval()。

到目前为止,一切正常。现在,我想使用GM_xmlhttpRequest个代码中的另一个eval()。在这里,我被困住了。我没有看到任何错误,但所有GM_*函数似乎都不在eval(responsetext)内。

如果我对onload处理程序中的GM_xmlhttpRequest进行硬编码(无eval()),则表明它正常工作。

3 个答案:

答案 0 :(得分:1)

Greasemonkey(GM)托管用户脚本,这意味着它可以向用户脚本添加函数和对象,当你调用eval()脚本运行unhosted(vanilla JavaScript正在运行它)而你没有获取GM API。

答案 1 :(得分:1)

可以解决此问题,您可以在GM_*'ed代码中将setTimeout设置为0来调用eval个函数。尝试类似:

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

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

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

答案 2 :(得分:0)

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

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

在从服务器加载的主逻辑javascript代码中,根本没有使用greasemonkey函数调用。如果我想与服务器通信,我会调用sendRequest。它有效。