Windows 10自定义协议JS调用失败,其他方式正常的问题求助
问题解决方案
问题1:JavaScript调用自定义协议失败
Fetch API 仅支持 HTTP/HTTPS/WSS 等标准网络协议,完全不支持自定义URL协议,所以用fetch调用fdmyalbsif:会直接报错。
正确的JavaScript调用方式有两种:
方法1:直接修改window.location.href
function Save_Result() { // 参数格式:协议名://参数集合(无需额外加引号,后续在批处理中解析) const protocolUrl = `fdmyalbsif://AAA BBB CCC`; window.location.href = protocolUrl; } Save_Result();
方法2:创建隐藏a标签模拟点击(避免页面跳转)
function Save_Result() { const protocolUrl = `fdmyalbsif://AAA BBB CCC`; const a = document.createElement('a'); a.href = protocolUrl; a.style.display = 'none'; document.body.appendChild(a); a.click(); document.body.removeChild(a); } Save_Result();
问题2:参数传递不符合预期
注册表配置修正
当前注册表command项使用"%1" "%2" "%3" "%4"是错误的——系统会把包含fdmyalbsif://前缀的完整协议URL作为%1传递,%2及以后参数全部为空,这就是你看到"fdmyalbsif:\\%20AAA%20BBB%20TTT" "" "" ""的原因。
修改注册表命令,仅传递%1,参数解析逻辑交给批处理:
reg add HKEY_CLASSES_ROOT\FDMyAlbsIF\shell\open\command /t REG_SZ /d "d:\MiAlbs\Manipulate_Files.bat" "%1" /f
批处理参数解析逻辑
在批处理中需要先剥离协议前缀,再解码URL编码(如%20转空格),同时处理多行字符串:
示例Manipulate_Files.bat代码:
@echo off setlocal enabledelayedexpansion :: 移除协议前缀 set "full_arg=%~1" set "params=!full_arg:*fdmyalbsif://=!" :: 解码URL编码字符 :: 处理换行符:%0A 转为实际换行 set "params=!params:%0A=^ !" :: 处理空格:%20 转为实际空格 set "params=!params:%20= !" :: 可按需添加其他编码转换,比如%22转双引号 :: 测试:输出到临时文件 echo !params! > "d:\temp\test_params.txt" :: 如需拆分参数,可按空格分割 :: for %%p in (!params!) do ( :: echo 单个参数:%%p :: ) endlocal
多行字符串传递注意事项
在JavaScript中传递多行字符串时,需先对换行符做URL编码(\n转%0A),确保批处理能正确还原:
function Save_Result() { const multiLineParam = `AAA BBB CCC`; // 编码特殊字符 const encodedParam = encodeURIComponent(multiLineParam); const protocolUrl = `fdmyalbsif://${encodedParam}`; window.location.href = protocolUrl; } Save_Result();
内容的提问来源于stack exchange,提问作者FDavidov
相关产品推荐
相关产品推荐

