论坛首页 AJAX版 EXT

求助:奇怪的Ext.get('center-iframe').dom.src =

浏览 2355 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-06-28
求助:奇怪的Ext.get('center-iframe').dom.src = ""+node.id;


我使用以下代码产生一个左边是tree 右边是iframe 的界面,但是在使用
tree.on('click', function(node){         
                if(node.isLeaf()) {
                        Ext.get('center-iframe').dom.src =  ""+node.id;
                };
        }); 

切换iframe 中显示的内容时却很奇怪,因为除了第一次外,其他的时候虽然能显示切换的页面内容(其实页面并没有刷新),但实际上并没有向容器发出页面请求(我使用tomcat,在filter中只有第一次选择时能截取到请求),就好像是显示一个本地的缓存内容一样。
请问为什么??????谢谢!!!

以下是页面详细的javascript:

function getIframeDocument(el) {
    var oIframe = Ext.get('center-iframe').dom;
    var oDoc = oIframe.contentWindow || oIframe.contentDocument;
    if(oDoc.document) {
        oDoc = oDoc.document;
    }
    return oDoc;
}

Simple = function() {
    var northPanel, southPanel, eastPanel, westPanel, centerPanel;
    return {
        init : function() {
          
           var mainLayout = new Ext.BorderLayout(document.body, {
                north: { 
                    split: false, initialSize: 30 
                }, 
                
                west: { 
                    split: true, initialSize: 200, titlebar: true, collapsible: true
                }, 
                center: { titlebar: true}
            });
            mainLayout.beginUpdate();
            mainLayout.add('north', northPanel = new Ext.ContentPanel('north-div', { 
                fitToFrame: true, closable: false 
            }));
             
            mainLayout.add('west', westPanel = new Ext.ContentPanel('west-div', { 
                fitToFrame: true, closable: false, title:'导航栏'
            }));
            mainLayout.add('center', centerPanel = new Ext.ContentPanel('center-div', { 
                fitToFrame: true, autoScroll: true, resizeEl: 'center-iframe',   title:'操作界面'
            })); 
            mainLayout.endUpdate();
            northPanel.setContent("<div style=\"padding-left:5px;padding-top:5px;font-size: 18px;font-weight: bold;color: #FFFFFF;\">测 试 系 统</div> ");
            Ext.get('center-iframe').dom.src="welcome.html";
            
        }
    };
}();
Ext.EventManager.onDocumentReady(Simple.init, Simple, true);


Ext.onReady(function(){
    // shorthand
    var Tree = Ext.tree;
    
    var tree = new Tree.TreePanel('west-div', {
        animate:true, 
        loader: new Tree.TreeLoader({dataUrl:'SystemFunction.do?method=MenuTree'}),
        enableDD:false,
        containerScroll: true
    });

    // set the root node
    var root = new Tree.AsyncTreeNode({
        text: '系统菜单',
        draggable:false,
        id:'RootTree'
    });
    tree.setRootNode(root);

        tree.on('beforeload', function(node){         
                //alert(node.id);
                tree.loader.dataUrl = 'SystemFunction.do?method=MenuTree&menuId='+node.id;        
        });
        
        tree.on('click', function(node){         
                if(node.isLeaf()) {
                        Ext.get('center-iframe').dom.src =  ""+node.id;
                };
        });
        
    // render the tree
    tree.render();
    root.expand();
});
  • A244260c-611d-4ab0-aab7-b1384dea1c2b-thumb
  • 描述: 界面
  • 大小: 1.3 MB
   
最后更新时间:2007-06-28
你的click事件中node.id值对不对?这里最好把url存到用node的attributes属性里
   
0 请登录后投票
最后更新时间:2007-06-28
jianyu 写道
你的click事件中node.id值对不对?这里最好把url存到用node的attributes属性里


click事件中node.id值肯定是对的.因为第一次是成功的.
只是从第二次开始就不行了,根本没有向容器发出请求,也就是能显示出对应的内容,但是实际没有刷新.
   
0 请登录后投票
最后更新时间:2007-06-29
莫非再讲页面缓存
   
0 请登录后投票
最后更新时间:2007-06-29
我也遇到过类似的情况。下面这样一段代码:
ds  = new Ext.data.Store(
    proxy: new Ext.data.HttpProxy({
method: 'get',
url: 'company.do?type=initdata'
    }), .....

只有第一次执行 ds.load(...的时候才会执行。而后对 ds.load(...的调用只会返回缓存的内容,而不会触发后台的代码。

去掉 method: 'get' 以后,一切都正常了。

那位达人可以解释下?
   
0 请登录后投票
最后更新时间:2007-06-29
确实是被缓存了。
楼主可以试试在后面加上?_=(new Date()).getTime()
   
0 请登录后投票
最后更新时间:2007-06-29
缓存。

浏览器对于已经访问过的url,可能会使用缓存,除非你设置浏览器不用缓存,或服务器发送内容的时候附上一些标识不要缓存的头。
   
0 请登录后投票
最后更新时间:2007-06-29
Frederick 写道
我也遇到过类似的情况。下面这样一段代码:
ds  = new Ext.data.Store(
    proxy: new Ext.data.HttpProxy({
method: 'get',
url: 'company.do?type=initdata'
    }), .....

只有第一次执行 ds.load(...的时候才会执行。而后对 ds.load(...的调用只会返回缓存的内容,而不会触发后台的代码。

去掉 method: 'get' 以后,一切都正常了。

那位达人可以解释下?


默认用post。
post是不缓存的。
   
0 请登录后投票
最后更新时间:2007-06-29
i_love_sc 写道
确实是被缓存了。
楼主可以试试在后面加上?_=(new Date()).getTime()


这种方法可以,只要每次改变为不同的url就可以了。但我更想解决为什么使用缓存的问题!
   
0 请登录后投票
最后更新时间:2007-06-29
使用缓存是正常的行为。开发之前就应该想好你的缓存策略。

加上时间戳只是一个workaround,不是一个好的解决方法。

使用post也是一样,如果本身不需要post的,你用post,就违反了REST架构。


正确的做法是,搞清楚你应用的缓存策略,然后在服务器端设置好。如果就是希望读取一次新的内容,可以在XHR调用前,加入if-modified-since和if-match头。
   
0 请登录后投票
论坛首页 AJAX版 EXT

跳转论坛:
JavaEye推荐