Диалог YUI с использованием запроса ajax - хотите выполнить javascript, возвращенный из Java, но вне области действия

У меня есть диалоговое окно 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);
});

person Simon    schedule 01.10.2010    source источник
comment
Вы должны привести какой-нибудь рабочий пример, на который мы можем посмотреть.   -  person jira    schedule 01.10.2010


Ответы (1)


Я точно не знаю ваш вариант использования, но если вам просто нужно создать несколько кнопок на лету на основе ответа сервера, то было бы лучше, 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);
person jira    schedule 02.10.2010
comment
Привет, спасибо за ваш ответ. Вы в значительной степени на месте. На самом деле я возвращаю как javascript, так и html. Я внес изменения в свой код, чтобы вернуть XML-документ, содержащий javascript и html в качестве отдельных узлов. Возвращаемый сейчас javascript в основном представляет собой массив объектов json. Я оцениваю ответ, а затем перебираю массив, генерирующий кнопки, которые мне нужны, с использованием данных json. - person Simon; 08.10.2010