Javascript 在内容脚本中侦听AJAX响应何时更改textarea val
我正在为一个文本编辑器编写一个Javascript 在内容脚本中侦听AJAX响应何时更改textarea val,javascript,ajax,google-chrome-extension,content-script,firefox-addon-webextensions,Javascript,Ajax,Google Chrome Extension,Content Script,Firefox Addon Webextensions,我正在为一个文本编辑器编写一个WebExtension。当用户单击一个按钮时,format编辑器触发一个ajax请求,然后返回格式化文本。我需要我的插件来监听文本区域中的更改 我尝试过使用onchange或oninput,但是当收到响应时,这些事件不会被触发。ajax响应使用此函数设置正文(不是我自己的): ajax响应如下所示: {“Body”:“Hello World”,“Error”:“} 是否可以从Web扩展内容脚本处理此ajax请求/响应?以某种方式侦听DOM中textarea的val
WebExtension
。当用户单击一个按钮时,format
编辑器触发一个ajax请求,然后返回格式化文本。我需要我的插件来监听文本区域中的更改
我尝试过使用onchange
或oninput
,但是当收到响应时,这些事件不会被触发。ajax响应使用此函数设置正文(不是我自己的):
ajax
响应如下所示:
{“Body”:“Hello World”,“Error”:“}
是否可以从Web扩展内容脚本处理此ajax请求/响应?以某种方式侦听DOM中textarea
的val
中的更改?我能听到并截获回应吗
ajax请求在网站的javascript代码中发送和接收,与我正在为编辑器使用的内容脚本(WebExtension代码)隔离开来。请求是这样的
function fmt() {
loading();
var data = {"body": body()};
if ($(opts.fmtImportEl).is(":checked")) {
data["imports"] = "true";
}
$.ajax("/fmt", {
data: data,
type: "POST",
dataType: "json",
success: function(data) {
if (data.Error) {
setError(data.Error);
} else {
setBody(data.Body);
setError("");
}
}
});
}
编辑
注入ajaxComplete
处理程序:
$(document).ajaxComplete(function(event, jqxhr, options) {
if(options.url === "/fmt") {
console.log("fmtted");
$('#code').change();
}
});
当收到ajax
响应时,将调用目标站点标题。但是,当尝试使用注入脚本修改DOM
时(例如,通过调用change()
或onchange()
),出于安全原因,会引发错误:拒绝访问属性“apply”
的权限错误。.val(值)
是否分派更改
事件。调用.change()
或触发器(“更改”)
如果您不知道何时调用setBody
,您可以使用.ajaxStop()
在$(opts.codeEl)
上调用.change()
,直到最后一次$.ajax()
调用完成
$(函数(){
让选项={
codeEl:document.querySelector(“textarea”)
}
$(opts.codeEl).on(“更改”,函数(事件){
console.log(“已更改”)
});
函数(文本){
$(opts.codeEl).val(文本)
}
让url=url.createObjectURL(
新斑点([
JSON.stringify({
“身体”:“你好,世界”,
“错误”:”
})
], {
类型:“application/json”
})
);
$.get(url)
.then(功能(数据){
revokeObjectURL(URL);
setBody(JSON.stringify(数据))
});
$(文档).ajaxComplete(函数(事件、jqxhr、选项){
如果(options.url==url){
控制台日志(“ajaxStop”);
$(opts.codeEl).change();//触发'change'事件
}
});
})
您是否试图检查服务器对$.ajax()的响应
调用或更改文本区域的事件1.此文本编辑器是否提供自己的js API和事件订阅?2.您可能需要使用@guest271314检查更改event@wOxxOm是的…我想。我会调查那些链接now@guest271314总的来说,我对javascript有很多不确定的地方,但是编辑文本区域不会更改DOM AFAIK,因此mutationObserver
不会注册anything@guest271314因此,ajaxComplete
将在ajax请求通过时触发?即使ajax请求以外来代码发送和接收?@Nevermore“外来代码”是什么意思?您是否可以在问题中包含所有相关的javascript
?@Nevermore,是的,它将始终执行,但您只需将旧的textarea值与当前值进行比较。此外,您还必须在一个@guest271314中钩住ajaxComplete“我更新了我的问题,指定ajax调用是在我的内容脚本中的一个独立脚本中进行的——我认为wOxxOm是有问题的,但我需要先了解您编写的代码,然后才能真正了解“钩子”调用ajaxComplete
函数意味着…基本上,我需要将您上面编写的侦听器注入到独立脚本中?如果您可以控制html
文档
,您可以在文档
处插入答案的.ajaxComplete()
部分。或者,简单地说,就是链入.change()
到.val()
。您也可以尝试从扩展名使用。
$(document).ajaxComplete(function(event, jqxhr, options) {
if(options.url === "/fmt") {
console.log("fmtted");
$('#code').change();
}
});