我有一个Greasemonkey脚本,它与(我的)服务器上的servlet通信。 servlet正在发回JavaScript代码,我在GM_xmlhttpRequest
的onload处理程序中eval()。
到目前为止,一切正常。现在,我想使用GM_xmlhttpRequest
个代码中的另一个eval()
。在这里,我被困住了。我没有看到任何错误,但所有GM_*
函数似乎都不在eval(responsetext)
内。
如果我对onload处理程序中的GM_xmlhttpRequest
进行硬编码(无eval()
),则表明它正常工作。
答案 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。它有效。