Опера искажает HTML в диалоге - PullRequest
0 голосов
/ 02 ноября 2011

Отлаживая сложное приложение на основе jQuery, которое не работало в браузере Opera, я проследил проблему до того факта, что Opera разрушает мое DOM-дерево, когда я загружаю некоторый HTML-код внутри виджета JQuery UI Dialog. Это шаблон HTML (действительный фрагмент HTML 4.0.1 в соответствии с W3C Validator):

<form action="" method="post">
    <p>Form starts here.</p>
    <p><input type="text" size="30" value="input in paragraph"></p>
    <table>
    <tr>
        <td><input type="text" size="30" value="input in table"></td>
    </tr>
    </table>
    <p>Form ends here.</p>
</form>

... и это сгенерированный HTML, который видит Opera:

<p class="ui-dialog-content ui-widget-content" style="width: auto; min-height: 0px; height: 230px" scrolltop="0" scrollleft="0">
    <form action="" method="post">
        <p>Form starts here.</p>
        <p><input type="text" size="30" value="input in paragraph"/></p>
    </form>
    <table>
        <tbody>
            <tr>
                <td><input type="text" size="30" value="input in table"/></td>
            </tr>
        </tbody>
    </table>
    <p>Form ends here.</p>
</p>

Я написал небольшой тест. Вы должны сохранить шаблон HTML как "form.html" в том же каталоге, что и этот документ HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- UTF-8 sin BOM (€ÁÑ) -->
<html>
<head><title>Bug DOM Opera</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<style type="text/css"><!--
*{
    font-size: 10pt !important;
    font-family: sans-serif;
}
h1{
    font-size: 12pt !important;
}
form{
    margin: 0.25em 0;
    padding: 0.25em;
    border: 1px solid black;
}
input{
    background-color: #C77C7A;
}
form input{
    background-color: #7CC592;
}
--></style>
<script type="text/javascript"><!--
jQuery(function($){
    // Open form in dialogue on button click
    $("button").click(function(){
        var $dialogo = $('<p>No data yet</p>')
            .dialog({
                modal: true,
                width: 500,
                height: 300,
                close: function(){
                    $(this).dialog("destroy");
                }
            }).dialog("open");
        $.ajax({
            url: "form.html",
            dataType: "html",
            success: function(data, textStatus, XMLHttpRequest){
                $dialogo.html(data);
            }
        });
    });

    // Open form on load (no dialogue)
    $("<div></div>").appendTo("body").load("form.html");
});
//--></script>
</head>
<body>

<h1>Bug DOM Opera</h1>
<p><button>Open dialogue</button></p>

</body>
</html>

Если вы запустите его в Opera, вы увидите, что можете вставить HTML-шаблон с обычным AJAX, и все в порядке (показано зеленым фоном в элементах <input>). Однако, если вы внедрите его в виджет Dialog, структура DOM изменится (красный фон). Он работает как положено в Firefox, Chrome и Internet Explorer.

Я пропустил ошибку в моем коде? Я обнаружил ошибку в Opera или jQuery UI?

1 Ответ

1 голос
/ 02 ноября 2011

После долгого расследования я могу сказать вам, что это ошибка операционной системы в текущей версии Opera.

html-метод Jquery говорит:

Этот метод использует браузерсвойство innerHTML.Некоторые браузеры могут не создавать DOM, который точно копирует предоставленный источник HTML.Например, Internet Explorer до версии 8 преобразует все свойства href в ссылках в абсолютные URL-адреса, а Internet Explorer до версии 9 будет некорректно обрабатывать элементы HTML5 без добавления отдельного слоя совместимости.

Но ничего об опере.В настоящее время я использую Opera стабильную 11.51, и у меня есть ошибка, о которой вы говорите.Но если вы используете Opera Next, то есть Opera 12.00 alpha.Вы можете скачать его здесь: http://my.opera.com/desktopteam/blog/

Он работает правильно.

Так что я не знаю, как это исправить для текущей версии Opera ... но мы знаем, что это ошибкасформируйте innerhtml текущей версии Opera:)

Надеюсь, что это поможет вам, и надеемся, что вы найдете решение, позволяющее работать в текущей стабильной версии Opera.

...