Почему javascript не выполняется в файле .php, загруженном с Ext.Ajax.Request? - PullRequest
0 голосов
/ 02 декабря 2010

Я хочу загружать .php файлы через ajax, который выполняет скрипт ExtJS при загрузке, который, в свою очередь, изменяет существующие объекты ExtJS, уже присутствующие в DOM.

Однако я даже не могу заставить Javascript работать со страницы, которая загружается через Ext.Ajax.request. И никаких ошибок не появляется на панели Firebug Net. Выполняется код PHP, но не Javascript. Когда я вызываю страницу, загружаемую самостоятельно в браузере, она прекрасно выполняет Javascript.

Как я могу заставить Javascript выполняться на страницах, загруженных Ext.Ajax.request?

Ext.onReady(function(){

    var menuItemStart = new Ext.Panel({
        id: 'panelStart',
        title: 'Start',
        html: 'This is the start menu item.',
        cls:'menuItem'
    });

    var menuItemApplication = new Ext.Panel({
        id: 'panelApplication',
        title: 'Application',
        html: 'this is the application page',
        cls:'menuItem'
    });

    var regionMenu = new Ext.Panel({
        region:'west',
        split:true,
        width: 210,
        layout:'accordion',
        layoutConfig:{
            animate:true
        },
        items: [ menuItemStart, menuItemApplication ]
    });

    var regionContent = new Ext.Panel({
        id: 'contentArea',
        region: 'center',
        padding:'10',
        autoScroll: true,
        html: 'this is the content'
    });

    new Ext.Viewport({
        layout: 'border',
        items: [ regionMenu, regionContent ]
    });

    menuItemStart.header.on('click', function() {
       Ext.Ajax.request({
           url: 'content/view_start.php',
           success: function(objServerResponse) {
               regionContent.update(objServerResponse.responseText);
           }
       });
    });

    menuItemApplication.header.on('click', function() {
       Ext.Ajax.request({
           url: 'content/view_application.php',
           success: function(objServerResponse) {

               regionContent.update(objServerResponse.responseText);
           }
       });
    });
});

файл, который загружается через Ajax:

<script type="text/javascript">
    window.onload=function() {
        alert('from application view'); //is not executed
    }

    //Ext.onReady(function(){
    //    alert('from application view extjs'); //is not executed
    //}
</script>
<?php
echo 'this is the application view at ' . date('Y-m-d h:i:s');
?>

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Вы пытались передать true для второго параметра в Panel.load (что является опцией loadScripts )?

regionContent.update(objServerResponse.responseText, true);
2 голосов
/ 02 декабря 2010

Когда вы получаете ответ ajax, событие onload в окне уже запущено, поэтому функция не будет выполнена, потому что событие onload не будет запущено снова.Попробуйте только с предупреждением:

<script type="text/javascript">
    alert('from application view');
</script>
<?php
echo 'this is the application view at ' . date('Y-m-d h:i:s');
?>

ОБНОВЛЕНИЕ

Браузеры не выполняют внедренные сценарии таким образом, поэтому вы можете попробовать что-то вроде:

var scripts, scriptsFinder=/<script[^>]*>([\s\S]+)<\/script>/gi;
while(scripts=scriptsFinder.exec(responseText))
{
   eval(scripts[1]);
}
0 голосов
/ 08 декабря 2010

Обычно, когда вы вызываете update с ext, вы просто делаете update (string, true) и он выполняет сценарии, содержащиеся в строке.Тем не менее, ext core, похоже, не имеет этой функциональности, но нет документации по методу обновления (мне пришлось искать фактический код, чтобы подтвердить это.)

Если вы используете какой-то обычный EXT (например, ext-all) вы можете просто добавить

regionContent.update(objServerResponse.responseText,true);

, как это, и он должен оценить сценарии.Впрочем, для меня это не игра в кости - ext-all работает слишком медленно, но мне нужна функциональность eval.Возможно, мне придется взломать EXT.

...