gpt4 book ai didi

javascript - 如何在用户脚本中处理多个 AJAX 结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:21:54 26 4
gpt4 key购买 nike

我目前正在开发一个 Greasemonkey 脚本来翻译 <textarea>内联网应用中的字段,使用 Google Translation API。

但有些文本太大,无法仅通过一个请求进行翻译。尝试时出现此错误:

Request entity too large

无论如何,我找到了一种将文本切割成片段的方法,并在单独的请求中发送它们。棘手的是我应该如何替换原始文本区域中的那些片段,尤其是在正确的位置。

在尝试了几种方法都没有成功之后,我在文本区域中插入了占位符,对应于必须翻译的文本片段:

{1}
{2}
...

但现在在我的 XHR 的成功回调中,我必须用翻译后的文本替换占位符。问题是,我的 XHR 在 for 里面循环,遍历包含原始文本片段的表,当请求完成时,循环早就结束了,我不知道如何将翻译放在哪里。

代码如下:

//Array text[] contains the fragments of original text
var translated_text = [];
var l = text.length;
for(var i = 0; i < l; i++)
{
var fullurl = apiurl+encodeURIComponent(text[i]);
GM_xmlhttpRequest({
method: 'GET',
url: fullurl,
headers:
{
'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
},
onload: function(responseDetails)
{
var destination = "{"+i+"}";
if(responseDetails.status == 200)
{
var data = $.parseJSON(responseDetails.responseText);
translated_text[i] = data.responseData.translatedText.replace(/&quot;/g,"\"").replace(/&#39;/g,"\"").replace(/&gt;/g,">");
textarea.text(textarea.text().replace("{"+i+"}",translated_text[i]));
}
else
{
alert('Request Failed : '+responseDetails.status+"\nError : "+responseDetails.statusText);
}
}
});
}

PS:我不能使用 jQuery 的 AJAX 方法,因为这是一个跨域请求,所以新的 $.when功能不能在这里使用(很遗憾)

最佳答案

更新:使用较新版本的 Greasemonkey 和 Tampermonkey,您现在可以通过 contextDoc :

GM_xmlhttpRequest ( {
method: 'GET',
url: fullurl,
context: i,
headers: {
'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
},
onload: function (responseDetails) {
var destination = "{" + responseDetails.context + "}"; // context is `i`
if (responseDetails.status == 200) {
var data = $.parseJSON (responseDetails.responseText);
translated_text[i] = data.responseData.translatedText.replace (/&quot;/g,"\"")
.replace (/&#39;/g,"\"").replace (/&gt;/g,">")
;
textarea.text (textarea.text ().replace ("{"+i+"}",translated_text[i]) );
}
else {
alert (
'Request Failed : '+responseDetails.status+"\nError : "
+ responseDetails.statusText
);
}
}
} );

对于其他/较旧的平台,要使用i 的值,您需要将其包装在JavaScript closure 中. 一种方法是:

( function (i)  {
GM_xmlhttpRequest ( {
method: 'GET',
url: fullurl,
headers: {
'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
},
onload: function (responseDetails) {
var destination = "{"+i+"}";
if (responseDetails.status == 200) {
var data = $.parseJSON (responseDetails.responseText);
translated_text[i] = data.responseData.translatedText.replace (/&quot;/g,"\"")
.replace (/&#39;/g,"\"").replace (/&gt;/g,">")
;
textarea.text (textarea.text ().replace ("{"+i+"}",translated_text[i]) );
}
else {
alert (
'Request Failed : '+responseDetails.status+"\nError : "
+ responseDetails.statusText
);
}
}
} );
} ) (i);

关于javascript - 如何在用户脚本中处理多个 AJAX 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5191850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com