【发布时间】:2015-07-08 23:11:31
【问题描述】:
我正在维护一个使用 Javascript 的网站。该脚本使用 jQuery 并从通常托管该站点的服务器加载一些内容。
为了方便维护站点,我在 iMac 上运行站点的本地副本。当我使用 Safari 时,这工作得很好。但是 Firefox、Opera 和 Chrome 拒绝工作。我想这是因为跨域策略。 (我无法用 IE 进行测试,因为 IE 必须在我的 iMac 上的虚拟机中运行,因此无法访问任何本地文件)
在 Firefox 和其他浏览器中是否有一个设置,我可以告诉浏览器可以使用本地 javascript 从本地 html 页面 ajax 加载位于远程服务器上的文件?
简而言之:这是我的 html 页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>some title</title>
<link rel="stylesheet" type="text/css" href="../css/stylesheet.css">
<script src="../js/jquery-2.1.3.min.js"></script>
<script src="../js/myScript.js"></script>
</head>
<body>
<!-- some content with a div-container to receive the ajax-content -->
</body>
</html>
这是 myScript.js:
var errorMsg = function (msg) {
//insert the message into the html-page
};
var JSONerror = function (jqXHR, textStatus, errorThrown ) {
var msg = 'JSON-answer: '+jqXHR.responseText;
msg += '<br>'+'JSON-Errorstatus: '+textStatus;
if ($.type(errorThrown) === 'string') {
msg += '<br>'+'Error: '+errorThrown;
}
errorMsg(msg);
};
var JSONreceive = function (JSONobj, StatusString, jqXHR) {
//insert the data in JSONobj into the html-page
}
var StartAJAX = function () {
$.ajax({
url: 'http://my.domain.tld/cgi-bin/myPerlScript.pl',
data: "lastID=" + lastID
+ '&qkz=' + Math.random(),
dataType: "json",
success: JSONreceive,
error: JSONerror
});
};
还有一个事件监听器,它监听页面滚动和调整大小并检查其他一些约束(例如:是否已经有一个 ajax 调用在进行中?)。此侦听器调用StartAJAX。
当它在 Safari 中我的页面的本地副本 (file:///User/...) 上调用 StartAJAX 时,我将 Ajax 内容完美地插入到我的 html 文档中。在其他浏览器中,我将错误消息插入到 html 页面中。它是:
JSON-答案:未定义
JSON-错误状态:错误
错误:
为什么它在 Safari 中有效,而在 Firefox、Chrome 和 Opera 中无效?
如何使这些浏览器正常工作?
(我需要在所有浏览器上测试它,因为所有浏览器都以不同的方式呈现相同的html-domument,但我不想在每次更改后将所有文件上传到服务器只是为了测试它。)
编辑:
看了一些答案,我想澄清一点,我显然没有说清楚:
我正在网络浏览器中搜索设置
- 我不会更改我的远程网络服务器 (Apache) 的设置
- 我不会操作远程计算机上的任何文件 (.htaccess)
- 我不会在本地 iMac 上设置网络服务器
- 我不会在我的 Javascript 文件中更改 AJAX 调用的代码
- 我不会更改远程服务器上 Perl 脚本的代码
我可以告诉你原因:
我只是做一个简短的维护,我懒得在编辑后将每个操作过的文件上传到远程机器。网络服务器的设置适合实际操作。我不想更改它们(并且可能在完成工作之前忘记更改)。脚本也是如此:你们中的一些人想要更改的那些部分现在可以正常工作。没有理由接触 Ajax-Calls,因为它们在生产环境中没有任何问题。
我只想让那些愚蠢的浏览器 Firefox、Opera 和 Chrome 表现得像 Safari 并正确处理 Ajax 调用。
顺便说一句:
请任何人解释一下在 Firefox、Opera 或 Chrome 中通过 Ajax 从其他域调用数据的风险如此之大,而在 Safari 中做同样的事情似乎是无害的?
【问题讨论】:
-
根据您的编辑,您不愿意接受任何答案,尽管它们是正确的。每个浏览器都有浏览器限制。如果您想让 Firefox、Chrome 和 Opera 像 Safari 一样运行,您需要联系这些浏览器的制造商并请求添加您需要的功能。此外,还提供了几个解决 CORS 问题的选项以及参考资料,以便您可以了解有关 AJAX 调用如何跨不同域工作的更多信息。这里没有任何人可以改变浏览器的设计方式。
-
@Rob:你的答案是目前最有可能赢得赏金的人。但赏金今天并没有结束。 3天结束,浏览量不到60次。这给了我 3 天的时间来希望另外 60 人阅读我的问题,并且其中一个人能找到更好的答案。如果在 3 天内没有答案告诉我如何操作浏览器以便它们根据需要执行 ajax 调用,那么我将接受您的回答。所以请耐心等待!
标签: javascript jquery ajax cross-browser cross-domain