你需要Opera 9.62才能看到这一切......因为当我进行跨子域JavaScript调用(涉及Ajax)时,这是唯一表现出奇怪的浏览器。请考虑以下三个简单文件并将它们放在适当的域中。
{p}foo.html
(boo.html iframe的父级)foo.example.com
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>foo</title>
<script type='text/javascript'>
document.domain = 'example.com';
function sendRequest() {
window.frames['boo'].sendRequest();
}
</script>
<head>
<body>
<input type="submit" value="sendRequest" onclick="sendRequest();" />
<iframe name="boo" src="http://boo.example.com/boo.html"></iframe>
</body>
</html>
boo.html
的 boo.example.com
(iframe of foo.html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>boo</title>
<script type='text/javascript'>
document.domain = 'example.com';
function sendRequest() {
var request = null;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
request = new ActiveXObject('Microsoft.XMLHTTP');
}
if (request) {
request.open('GET', 'http://boo.example.com/helloworld.php', true);
request.onreadystatechange = function() {
if (request.readyState == 4) {
var result = request.responseText;
alert(result);
}
}
request.send('');
}
}
</script>
<head>
<body>
</body>
</html>
在helloworld.php
boo.example.com
<?php
echo 'Hello World!';
?>
如果你在Opera以外的浏览器中测试上述代码(在v9.62上测试过),它就像一个魅力(我在Safari,Firefox,Chrome中测试过)。在Opera中,它不起作用,并且抛出了安全违规消息的错误。有谁知道这是怎么回事? 我找到了问题的解决方案,我稍后会在这里发布(我也希望看到你的解决方案),但我想了解更多关于这个问题的信息。 - 任何人都可以解释一下吗?
更新:我刚刚在最新的 Opera 10.63 上测试了它,没有出现这样的问题。所以你肯定需要使用Opera v9.62来观察问题。
答案 0 :(得分:0)
认为Opera的版本不支持document.domain
我知道9之前没有一个Opera版本支持它,所以我猜测9.62也不支持它。
尝试将域名设置为boo.example.com,看看是否有效,以防9.62支持它。
根据http://www.opera.com/docs/specs/opera9/xhr/,它确实支持XMLHttpRequest,因为它遵循W3C规范,var request = new XMLHttpRequest()应该可以正常工作。
答案 1 :(得分:0)
我打算建议你实施CORS,但似乎还没有实现:http://dev.opera.com/forums/topic/693452
答案 2 :(得分:0)
让我向您展示在Opera 9.62中运行的代码......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>boo</title>
<script type='text/javascript'>
document.domain = 'example.com';
function sendRequest() {
setTimeout(function() {
var request = null;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
request = new ActiveXObject('Microsoft.XMLHTTP');
}
if (request) {
request.open('GET', 'http://boo.example.com/helloworld.php', true);
request.onreadystatechange = function() {
if (request.readyState == 4) {
var result = request.responseText;
alert(result);
}
}
request.send('');
}
}, 1);
}
</script>
<head>
<body>
</body>
</html>