Диалог YUI с использованием ajax-запроса - хотите выполнить JavaScript, возвращенный из Java, но вне области видимости - PullRequest
0 голосов
/ 01 октября 2010

У меня есть диалог YUI, который отправляет форму сервлету Java.Сервлет возвращает html и javascript.Я беру ответ и помещаю его в div на странице, а затем проверяю javascript, который находится внутри div.

Моя проблема в том, что я получаю сообщение об ошибке в консоли firebug, говорящее «YAHOO не определен» каккак только сервлет вернется.

Я не включаю файлы YUI js в сервлет, поскольку я не думал, что они мне понадобятся, я ожидаю, что файлов, включенных в заголовок главной страницы, будет достаточно.

Если я удаляю все ссылки на YUI из javascript, возвращаемого моим сервлетом, тогда все работает хорошо.

Что я должен сделать, чтобы прекратить получать эту ошибку, как только мой сервлет вернется?*

Мой сервлет возвращает что-то вроде:

<div id="features">some html to display</div>
<script id="ipadJS" type='text/javascript'>
var editButton1 = new YAHOO.widget.Button('editButton1', { onclick: { fn: editButtonClick, obj: {id: '469155', name : 'name 1'}  } });
var editButton2 = new YAHOO.widget.Button('editButton2', { onclick: { fn: editButtonClick, obj: {id: '84889', name : 'name 2'}  } });
</script>

Вот код, который я использовал для создания диалога, я использую функцию handleSuccess, чтобы поместить свой ответ от моего сервлета на страницу (обратите внимание, что хотя я не активно помещаю javascript на страницу, он все равно выдает ошибку «YAHOO не определено».):

YAHOO.namespace("ipad");

YAHOO.util.Event.onDOMReady(function () {

    // Remove progressively enhanced content class, just before creating the module
    YAHOO.util.Dom.removeClass("createNewFeature", "yui-pe-content");

    // Define various event handlers for Dialog
    var handleSubmit = function() {
        this.submit();
    };
    var handleCancel = function() {
        this.cancel();
    };
    var handleSuccess = function(o) {
        var response = o.responseText;
        var div = YAHOO.util.Dom.get('features');
        div.innerHTML = response;
    };


    var handleFailure = function(o) {
        alert("Submission failed: " + o.status);
    };

    // Instantiate the Dialog
    YAHOO.ipad.createNewFeature = new YAHOO.widget.Dialog("createNewFeature", 
                            { width : "450px",
                              fixedcenter : true,
                              visible : false, 
                              constraintoviewport : true,
                              buttons : [ { text:"Submit", handler:handleSubmit, isDefault:true },
                                      { text:"Cancel", handler:handleCancel } ]
                            });

    // Validate the entries in the form to require that both first and last name are entered
    YAHOO.ipad.createNewFeature.validate = function() {
        var data = this.getData();
                return true;
    };

    YAHOO.ipad.createNewFeature.callback = { success: handleSuccess,
             failure: handleFailure,
             upload: handleSuccess };

    // Render the Dialog
    YAHOO.ipad.createNewFeature.render();

    var createNewFeatureShowButton = new YAHOO.widget.Button('createNewFeatureShow');

    YAHOO.util.Event.addListener("createNewFeatureShow", "click", YAHOO.ipad.clearFeatureValues, YAHOO.ipad.clearFeatureValues, true);

    var manager = new YAHOO.widget.OverlayManager(); 
    manager.register(YAHOO.ipad.createNewFeature);
});

1 Ответ

1 голос
/ 02 октября 2010

Я точно не знаю ваш вариант использования, но если вам просто нужно создать несколько кнопок на лету, основываясь на ответе сервера, то IMO было бы лучше вернуть данные JSON или XML с переменными данными, а затем создатькнопок.Что-то вроде

var reply = eval('(' + o.responseText + ')');

var editButton1 = new YAHOO.widget.Button('editButton1', 
                     { onclick: { fn: editButtonClick, 
                      obj: {id: reply[id], name : reply[name]}
  } })

И если вы действительно хотите добавить узел скрипта, тогда должен работать следующий подход:

   var response = o.responseText;

   var snode = document.createElement("script");
   snode.innerHTML = response;
   document.body.appendChild(snode);
...