Greasemonkey更新后报GM_xmlhttpRequest未定义,脚本AJAX请求失败求助
解决你的Greasemonkey脚本AJAX问题
我来帮你拆解下问题所在,一步步搞定这两个核心问题:
1. 为什么会出现GM_xmlhttpRequest is not defined?
这是Greasemonkey 4.x版本更新后的API变动导致的——原来下划线命名的GM_xmlhttpRequest被替换成了驼峰式的GM.xmlHttpRequest(注意是点语法,不是下划线),而且不再挂载到全局对象上,必须通过GM对象调用。这就是更新后报错的核心原因。
2. AJAX请求为什么会失败?
你的请求URL用的是http://php.net/,但脚本匹配的是https://php.net/*的页面,浏览器会严格拦截混合内容请求(从HTTPS页面发起HTTP请求),直接把URL改成https://php.net/就能解决这个问题。
另外,你代码里的alert(responseDetails)其实意义不大,因为responseDetails是一个包含响应头、响应文本等信息的对象,alert只会显示[object Object],换成alert(responseDetails.responseText)或者用console.log(responseDetails)来查看完整数据,调试起来更方便。
修正后的完整脚本
// ==UserScript== // @name _Starter AJAX request in GM, TM, etc. // @match *://php.net/* // @grant GM.xmlHttpRequest // @connect php.net // ==/UserScript== GM.xmlHttpRequest({ method: 'GET', url: 'https://php.net/', onload: function (responseDetails) { // 用console.log查看完整响应详情,调试更方便 console.log('响应详情:', responseDetails); // 弹出响应文本的长度,验证请求成功 alert('请求成功!响应文本长度:' + responseDetails.responseText.length); }, // 加上错误回调,方便排查后续问题 onerror: function(error) { console.error('请求出错:', error); alert('请求出错:' + error.error); } });
额外小提示
如果想要同时兼容Tampermonkey(它还支持旧的GM_xmlhttpRequest)和Greasemonkey,可以加个简单的兼容判断:
// 自动适配不同脚本管理器的AJAX API const gmXhr = typeof GM_xmlhttpRequest !== 'undefined' ? GM_xmlhttpRequest : GM.xmlHttpRequest; gmXhr({ // 你的请求配置项 });
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

