Фокус с междоменным Ajax в Opera - PullRequest
0 голосов
/ 06 ноября 2010

Вам понадобится Opera 9.62, чтобы понять, о чем идет речь ... Потому что это единственный браузер, который ведет себя странно, когда я выполняю кросс-доменные вызовы JavaScript (с включенным Ajax).Пожалуйста, рассмотрите следующие три простых файла и разместите их в соответствующих доменах.

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 (iframe of foo.html) в boo.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>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 (протестировано на версии 9.62), оно работает как чудо (я тестировал вSafari, Firefox, Chrome).В Opera это не работает и выдается ошибка с сообщением о нарушении безопасности.Кто-нибудь знает, в чем дело?Я нашел решение проблемы, и я опубликую его здесь чуть позже ( Я также хотел бы увидеть ваши решения ), но я также хотел бы узнать больше о проблеме -Кто-нибудь может объяснить это?

ОБНОВЛЕНИЕ : Я только что проверил это на новейшей Opera 10.63 , и у такой проблемы нет .Так что вам определенно нужно использовать Opera v9.62 для наблюдения за проблемой .

Ответы [ 3 ]

0 голосов
/ 06 ноября 2010

Я собирался предложить вам внедрить CORS, но это, похоже, еще не реализовано: http://dev.opera.com/forums/topic/693452

0 голосов
/ 07 ноября 2010

Позвольте мне показать вам код, который работает в 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>
0 голосов
/ 06 ноября 2010

Думаю, что версия Opera не поддерживает document.domain

Я знаю, что ни одна из версий Opera до 9 не поддерживала его, поэтому я предполагаю, что 9.62 также не поддерживает его.

Попробуйте установить домен на boo.example.com и посмотрите, работает ли он, на случай, если 9.62 его поддерживает.

Согласно http://www.opera.com/docs/specs/opera9/xhr/, он отлично поддерживает XMLHttpRequest, и поскольку он соответствует спецификациям W3C, var request = new XMLHttpRequest () должен работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...