Как я могу получить доступ JQuery / Javascript к элементам, сгенерированным extJS? - PullRequest
3 голосов
/ 15 ноября 2010

Я создаю простой сайт с помощью extJS.

Я могу успешно прикреплять события кликов из JQuery и из extJS, но только к элементам, которые я создаю в HTML в самом теге body.

Однако события, которые я прикрепляю к элементам, сгенерированным extJS, либо не действуют, либо приводят к тому, что сайт extJS не генерируется.

Например, все примеры в этом уроке простоне работают (и они показывают именно то, что я хочу сделать: манипулировать DOM изнутри extJS), но если я пытаюсь получить доступ к элементу DOM изнутри extJS, как он утверждает, я просто получаю ошибку, что этот элемент "является нулевым"как на скриншоте ошибки ниже. Что я не понимаю в extJS, почему все элементы, к которым я пытаюсь получить доступ с помощью get (), имеют значение null?

Как я могу изменить следующий код, чтобы я мог прикрепитьсобытия для сгенерированных extJS элементов, например, для div "myPanel"?

Вот ошибки, которые я получаю в Firebug: alt text

, хотя div myPanel существует: alt text

@ Mchl, getCmp, похоже, не работает: alt text

<html>
<head>
    <title>New Backend Layout</title>
    <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css"/>
    <script type="text/javascript" src="adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="ext-all.js"></script>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>


    <style type="text/css">
        html, body {
            font: normal 12px verdana;
            margin: 0;
            padding: 0;
            border: 0 none;
            overflow: hidden;
            height: 100%;
        }

        .empty .x-panel-header {
            background-color: #FFFF99;
        }

        .empty .x-panel-body {
            text-align:left;
            color: #333;
            background-color: #FFFFCC;
            padding: 10px;
            font-size:11px;
        }

        .withtabs .x-panel-header {
            background-color: #FFFF99;
        }
        .withtabs .x-panel-body {
            text-align:left;
            color: #333;
            background-color: #FFFFCC;
            font-size:11px;
        }

        .subpanel .x-panel-body {
            padding: 5px;
        }

        .withtabs .x-tab-panel-header {
            background-color: #CCFF99;
        }

        .withtabs .x-tab-strip {
            background-color: #CCFF99;
        }


    </style>
    <script type="text/javascript">

            google.load("jquery", "1.4.3");
            google.setOnLoadCallback(function() {
                $('#testInHtml').css("background-color","yellow"); //changes color of element
                $('#ext-gen9').css('background-color', 'red'); //does not change color of element
            }); 

        Ext.onReady(function() {

            var item1 = new Ext.Panel({
                title: 'Start',
                html: 'Welcome',
                cls:'empty'
            }); 

            var item2 = new Ext.Panel({
                title: 'Application',
                html: 'the application',
                cls:'empty'
            }); 


            var accordion = new Ext.Panel({
                region:'east',
                margins:'5 5 5 0',
                split:true,
                width: 210,
                bodyStyle: 'background: #FFFFCC',
                layout:'accordion',
                layoutConfig:{
                    animate:true
                },
                items: [item1, item2]
            });

            var content = new Ext.Panel({
                id: 'myPanel',
                region:'center',
                margins:'5 0 5 5',
                cls:'empty',
                bodyStyle:'background:ivory; font-size: 13pt',
                html:'<p id="test123">This is where the content goes for each selection.</p>',
//              listeners: {
//                  click: function() {
//                      alert('was clicked333'); //has no effect
//                  }
//              }
            });

            //Ext.get('myPanel').on('click', function() { alert('was clicked2');}); //causes extJS-generated site not to appear  

            Ext.get('testInHtml').on('click', function() {alert('was clicked');}); //works
            //Ext.get('ext-gen9').on('click', function() {alert('was clicked');}); //causes extJS-generated site not to appear             

            var viewport = new Ext.Viewport({
                layout:'border',
                items:[content, accordion]
            });


        });
    </script>
</head>
<body>
<p id="testInHtml">this is a test</p>
</body>
</html>

@ arun, «this», кажется, содержит правильный элемент, но не меняет фонcolor (хотя в примере только для jquery без extJS, который я тестировал), и я никак не могу манипулировать им с помощью любых других атрибутов css:

alt text

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Попробуйте использовать метод делегат , предоставленный jQuery .

JQuery("body").delegate("#myPanel", "click", function(){
    //Your handler
});

Подробнее здесь learningjquery jquery api

Я не проверял этот код, а просто еще одно направление, в которое вы можете заглянуть

0 голосов
/ 18 ноября 2010

Пожалуйста, посмотрите мой ответ на другой (дубликат?) вопрос .

Глядя на код в этом вопросе (который вы не полностью опубликовали в другом вопросе) причинаExt.get () и Ext.getCmp () не работают для вас, потому что Panel еще не отображалась во время их вызова (поэтому вызовы возвращают null).Так как вы добавляете определения Panel в область просмотра как элементы, они не визуализируются до тех пор, пока область просмотра не будет создана и обработана (это особенное преимущество Ext, поскольку она поддерживает отложенный рендеринг для повышения производительности).Таким образом, чтобы это исправить, вы должны просто переместить любой код, который должен получить доступ к DOM Panel, либо после кода области просмотра, либо поместить его в обработчик событий для события render Panel (как я показал в связанном ответе).

Принятый вами ответ работает просто потому, что подключение обработчика щелчков откладывается для вас за кулисами, но это не совсем правильный подход (и нет необходимости вводить jQuery только для этой цели, если только выИспользую это для чего-то другого).

0 голосов
/ 15 ноября 2010

Быстрый совет: попробуйте использовать Ext.getCmp () вместо Ext.get ()

Лучший совет: см .: http://vimeo.com/14816550

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...