如何在没有基本URL的情况下从JavaScript发送请求?

如何在没有基本URL的情况下从JavaScript发送请求?,javascript,jquery,ajax,sap,Javascript,Jquery,Ajax,Sap,我想从JavaScript向一个简单的URL发送一个请求,这样基本URL就不会添加到请求URL中。例如,请求应发送到以下URL(,不带基本URL): SAPEVENT:一些文本?2 我使用jQuery的$.ajax函数来实现它,但没有成功 下面是一个JSFIDLE: JS代码: function sendEvent(id) { $.ajax("SAPEVENT:SOME_TEXT?" + id); } sendEvent(2); 我在JS控制台中看到以下错误: XMLHttp

我想从JavaScript向一个简单的URL发送一个请求,这样基本URL就不会添加到请求URL中。例如,请求应发送到以下URL(,不带基本URL):
SAPEVENT:一些文本?2

我使用jQuery的
$.ajax
函数来实现它,但没有成功

下面是一个JSFIDLE:

JS代码:

function sendEvent(id) {
    $.ajax("SAPEVENT:SOME_TEXT?" + id);
}    
sendEvent(2);
我在JS控制台中看到以下错误:

XMLHttpRequest无法加载sapevent:SOME_TEXT?2。跨来源请求 只支持HTTP。(jquery-2.1.0.js:8556)

我甚至设置了参数
crossDomain:true
,但没有帮助:

JS代码:

function sendEvent(id) {
    $.ajax({
        url: "SAPEVENT:SOME_TEXT?" + id,
        crossDomain: true
    });
}
sendEvent(2);
它以同样的错误结束

它在HTML中正常工作,如下所示:

正常工作的HTML代码

<FORM action="SAPEVENT:PRESS_ME">
    <A HREF="SAPEVENT:CLICK_ON_ME">Click on me to send an event!</A> 
    <INPUT TYPE="submit" VALUE="Press me to send an event!"/>
</FORM>

但我需要在JavaScript中实现它,以便可以在JavaScript中的URL中动态设置请求参数。 您知道如何在JS中实现它,以便将请求发送到URL
SAPEVENT:SOME_TEXT?2
,而不使用基本URL

关于所用浏览器的附加信息:该错误仅在Chrome中显示。IE和Firefox没有显示错误,但也没有发送请求


SAP人员的其他信息:我知道有一个声明说这是不可能的,但一位同事已确认,他已在一个HTML页面中成功测试了此类功能,该页面使用了与我上面复制的相同的代码(请参阅上面和下面的HTML代码)。所以SAP注释是错误的。我知道如何在HTML中实现这个功能,但我不知道如何在JS中实现它。这就是问题所在

不知道SAP视图,但对我来说,这似乎是Web服务器上的常见行为。我假设SAPEVENT在运行时被服务器解析为更常规的URI。只解析视图,而不解析CSS和JS等资源,因此JS文件中的SAPEVENT占位符不会被解析,JS解释器也不会接受它作为有效URI。解决这个问题的一个常见方法是在HTML中创建一个隐藏表单,或者只创建一个包含服务器生成的所需值的隐藏输入。比如说

SAP视图:

<input type="hidden" id="my_event_url" value="SAPEVENT:PRESS_ME">

我没有与SAP合作的经验,但我认为您缺少一个关键部分

在您提供的示例中,
SAPEVENT:CLICK\u ON\u ME
根本不是一个http url,而是使用参数
CLICK\u ON\u ME
调用本地计算机上处理
SAPEVENT
-协议的任何内容。我猜您的计算机上安装了某种客户端,可以为您执行此操作(包含有关如何完成此操作的更多信息)

错误消息谈论跨域内容的原因可能是它试图将其解释为
host:port


换句话说,由于这不是一个http url,因此没有一个web服务器在另一端工作,因此您无法对其执行ajax请求。

任何web服务器都不会处理
SAPEVENT:
内容。SAP GUI使用嵌入式Internet Explorer并注册自定义协议处理程序。尝试使用ajax技术是没有用的,因为您需要访问客户机的容器,而不是服务器。重申:您不想在任何地方“发送请求”,您想让浏览器确信发生了某个本地导航事件”。包含有关该主题的更多信息。

我终于用JavaScript实现了它。感谢访问。 我修改了此网页中显示的解决方案,以便在JavaScript中添加链接而不是表单。 这是JS中的工作解决方案:

var targetUrl = "SAPEVENT:SOME_TEXT?2";

function sendSapEvent(targetUrl) {
    var link = document.createElement("a");
    link.setAttribute("style", "display:none;");
    link.setAttribute("href", targetUrl);

    // Move the click function to another variable
    // so that it doesn't get overwritten.
    link._click_function_ = link.click;

    document.body.appendChild(link);
    link._click_function_();
}

sendSapEvent(targetUrl);
您也可以在这个JSFIDLE中找到它:

它工作了!它向URL
sapevent:SOME_TEXT?2发送请求


我决定使用链接而不是表单元素,因为我无法使用表单传递请求参数。

如果您以“/”开头URL,它将将将其附加到当前域。$.ajax(“/SAPEVENT:SOME_TEXT?123”)将在您当前打开但我没有以“/”开头URL的情况下请求/“我不希望在请求URL中包含基本URL,也就是说,我不希望yourdomain.com/SAPEVENT:SOME_TEXT?123,但我只希望SAPEVENT:SOME_TEXT?123作为请求URL。它适用于我的问题中的HTML示例,但不适用于JS。我理解你的意思,但我的问题中的HTML示例有效:。它发送的请求仅包含“SAPEVENT:PRESS_ME”作为请求URL。那么为什么我不能在JS中实现它呢?感谢您的澄清,我在SAP上有0的经验,我假设SAP交付给浏览器,而不仅仅是他们自己的客户端,所以我认为这是一段需要由Web服务器解析的代码。@vwegert:我已经知道您提到的SAP说明。我无法访问您提供的链接,因为它需要登录,但这里有一个链接。不过,本说明与用于HTML的SAPGui相关,但我们使用的是经典的SAPGui。一位同事使用一个外部HTML页面成功地测试了这种情况,如我的问题中包含的HTML示例所示,该示例工作正常。我知道如何使它在HTML页面中工作,但我不能使它在JS中工作。这个解决方案不起作用。它不会改变URL的传递方式。我在多个不同的版本中尝试了它,也就是说,还做了一些小的修改,但是没有成功。我得到的错误与我的问题中提到的相同。我明白了,我从vwegert的回答中得知,SAP客户端是一个嵌入式IE,并且使用自定义协议,我已经在考虑不寻常的URI了。JS中的
alert(window.location.protocol)
返回什么?如果返回的不是'SAPEVENT',则XHR限制生效。您可能可以使用IE自己的
XDomainRequestvar targetUrl = "SAPEVENT:SOME_TEXT?2";

function sendSapEvent(targetUrl) {
    var link = document.createElement("a");
    link.setAttribute("style", "display:none;");
    link.setAttribute("href", targetUrl);

    // Move the click function to another variable
    // so that it doesn't get overwritten.
    link._click_function_ = link.click;

    document.body.appendChild(link);
    link._click_function_();
}

sendSapEvent(targetUrl);