Диалоговое окно jQuery UI + WebKit + HTML-ответ со скриптом - PullRequest
0 голосов
/ 04 марта 2010

Еще раз столкнулся с большой проблемой! :)

Итак, вот материал:

на стороне клиента, у меня есть ссылка. Нажав на нее, JQuery делает запрос сервер получает ответ в виде содержимого HTML, а затем отображает диалоговое окно интерфейса пользователя с этим содержимым.

Вот код функции запроса:

function preview(){
    $.ajax({
        url: "/api/builder/",
        type: "post",
        //dataType: "html",
        data: {"script_tpl": $("#widget_code").text(),
               "widgets": $.toJSON(mwidgets), 
               "widx": "0"},
        success: function(data){
            //console.log(data)
            $("#previewArea").dialog({
                bgiframe: true,
                autoOpen: false,
                height: 600,
                width: 600,
                modal: true,
                buttons: {
                    "Cancel": function() {
                                $(this).dialog('destroy');
                              }
                }
            });
            //console.log(data.toString());
            $('#previewArea').attr("innerHTML", data.toString());
            $("#previewArea").dialog("open");
        },
        error: function(){
            console.log("shit happens");
        }
    })
}

Ответ (data):

<html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  <script type="text/javascript">var smakly_widget_sid = 0 ,widgets = [{"cols": "2","rows": "2","div_id": "smakly_widget","wid": "0","smakly_style": "small_image",}, ] </script>  <script type="text/javascript" src="/media/js/smak/smakme.js"></script>  </head>  <body>  preview <div id="smakly_widget" style="width:560px;height:550px"> </div>  </body> </html>

Как видите, есть скрипт для загрузки: smakme.js, как-то нет выполнить в браузерах на основе WebKit (я пробовал в Safari и Chrome), но в Firefox, Internet Explorer и Opera все работает как положено!

Вот этот скрипт:

String.prototype.format = function(){
    var pattern = /\{\d+\}/g;
    var args = arguments;
    return this.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
}

var turl = "/widget"

var widgetCtrl = new(function(){

    this.render_widget = function (w, content){
        $("#" + w.div_id).append(content);
    }

    this.build_widgets = function(){
        for (var widx in widgets){
            var w = widgets[widx],
                iurl = '{0}?sid={1}&wid={2}&w={3}&h={4}&referer=http://ya.ru&thrash={5}'.format(
                    turl, 
                    smakly_widget_sid, 
                    w.wid, 
                    w.cols, 
                    w.rows, 
                    Math.floor(Math.random()*1000).toString()),
                content = $('<iframe src="{0}" width="100%" height="100%"></iframe>'.format(iurl));
            this.render_widget(w, content);
        }
    }
})

$(document).ready(function(){
    widgetCtrl.build_widgets();
})

Это какая-то проблема безопасности или что-то еще?

1 Ответ

0 голосов
/ 05 марта 2010

Я думаю, вам нужна ссылка на jQuery в ответе (в любом случае это не повредит).

Я попытался воспроизвести проблему путем локального хранения HTML и JavaScript, и мне пришлось вставить ссылку на jQuery. Я использовал ссылку на Google-версию jQuery и вставил ее сразу после строки с meta:

<script
    type="text/javascript"
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
</script>

Однако я не увидел никакой разницы между Firefox 3.6 и Google Chrome 3.0.195.38. Сценарий успешно выполнен в Google Chrome, когда была включена ссылка на jQuery.


Переформатированная версия ответа (без ссылки на jQuery):

<html>
    <head>
        <meta
          http-equiv="Content-Type"
          content="text/html; charset=UTF-8">
        <script type="text/javascript">
          var smakly_widget_sid = 0 ,
              widgets =
                [
                  {
                    "cols": "2",
                    "rows": "2",
                    "div_id": "smakly_widget",
                    "wid": "0",
                    "smakly_style": "small_image",
                  },
                ]
        </script>

        <script
          type="text/javascript"
          src="/media/js/smak/smakme.js">
        </script>
    </head>

    <body>
        preview
        <div
          id="smakly_widget"
          style="width:560px;height:550px">
        </div>
    </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...