如何更改Dojo TabContainer行为以简单地打开外部链接而不是显示ContentPane?

时间:2011-09-14 22:03:52

标签: javascript hyperlink dojo tabs tabcontainer

我正与TabContainer有几个不同的ContentPane孩子一起工作。它们中的每一个都配有href参数,用于获取选中标签时显示的外部AJAX内容:

dojo.addOnLoad(function() {
    var tc_nav = new dijit.layout.TabContainer({
        style: 'width: 98%;',
        doLayout: false
    }, 'tc_nav');

    var cp1 = new dijit.layout.ContentPane({
        title: 'Test 1',
        href: 'ajax?test1',
        style: 'padding: 10px;',
        selected: true
    });

    dojo.connect(cp1, 'onShow', function() {
        cp1.refresh();
    });

    /*
     * ...
     */

    tc_nav.addChild(cp1);

    /*
     * ...
     */

    tc_nav.startup();
});

现在我想在其他行为中集成一个标签,其行为应该是不同的:不是将内容加载到ContentPane标签,而是应该在同一窗口中跟随一个简单的链接(如{{1} }),离开包含js / dojo应用程序的页面。我还没有找到任何令人满意的解决方案,也没有匹配此要求的dojo小部件。什么是最好的方法?

作为一种令人不快的解决方法,我创建了一个覆盖<a href="http://www.google.com/">Link</a>的重写onShow事件:

window.location.href = '...';

这种解决方法的一个恼人的缺点是首先加载var cp2 = new dijit.layout.ContentPane({ title: 'Test 2', style: 'padding: 10px;' }); dojo.connect(cp2, 'onShow', function() { window.location.href = 'http://www.google.com/'; }); 并且之后设置ContentPane,这导致了非常特殊的延迟重载效果,从而导致糟糕的用户体验。我想避免这个中间步骤。

2 个答案:

答案 0 :(得分:0)

ContentPanes实际上不是iframe,因此设置window.location.href会改变整个页面(dojo app)的url而不仅仅是ContentPane。你尝试过这样的事情:

cp2.set('href', 'http://www.google.com/')

答案 1 :(得分:0)

满足上述要求的可能解决方法是覆盖onClick ContentPane的{​​{1}}事件:

controlButton

请注意,不要将另一个功能附加到/* * ... */ var cp2 = new dijit.layout.ContentPane({ title: 'Test 2', style: 'padding: 10px;' }); /* * ... */ tc_nav.addChild(cp2); /* * ... */ tc_nav.startup(); /* * ... */ cp2.controlButton.onClick = function() { window.location.href = 'http://www.google.com/'; }; 事件(例如,通过onClick),而是覆盖它,否则将首先调出dojo.connect(cp2.controlButton, 'onClick', function() { /* ... */ });的内容。

请进一步注意,必须首先调用ContentPane的{​​{1}}函数才能访问TabContainer对象。