使用jQuery,如何将元素添加到尚未创建的jQuery对象?

时间:2010-07-20 18:41:14

标签: javascript jquery

也许我这样做错了,对如何改进我的代码的建议表示赞赏。我的情况是这样的:我有一个工具栏,其中包含由回调填充的不同元素。我不想使用show()或hide()命令,我更喜欢使用detach,但我认为应该有一个很好的方法来处理它。这是我的代码:

entryView = function _entryView() {

    var menuButton = $('<div/>').addClass('menuButton');        

    toolBar();

    $.getJSON('ajax', function(o) {
        var $enum2 = ss.IEnumerator.getEnumerator(dto.TransmittalDates);
        while ($enum2.moveNext()) {
            var dateTime = $enum2.get_current();
            $('.menu').append($('<div/>').addClass('menuitem').text(dateTime.toString()));
        }
    });
}
    toolBar = function _toolBar() {
    var flyoutMenu = $('<div/>').addClass('menu');

    $('.menuButton').click(function(o) {
          $('.menubutton').append(flyoutMenu);
    });

我快速剪切并粘贴并重命名变量以使它们有意义。正如您在条目中看到的那样,我构建了工具栏,我做的最后一件事是ajax调用。但是,在“点击”事件之前不会创建菜单,因此无法添加。

我意识到有全局变量是坏的,所以我试图避免这种情况,但我认为最好的情况是让ajax调用填充一个Menu变量,当创建DOM时,从同一个Menu项中拉出来。我怎么把它关掉?有没有更好的方法呢?

编辑:在工具栏功能上稍微提一下,我想我现在应该是正确的。

1 个答案:

答案 0 :(得分:0)

我对代码的某些部分感到困惑:

  • 什么是entryView函数以及何时调用它?
  • 为什么toolBar函数存在而不是内联?从哪里来的呢?
  • 为什么要创建这样的功能?创建一个没有var的变量是不好的做法,总是生成全局变量,并且在ES5严格模式下将被禁止。你应该创建这样的函数:

    var someFunction = function(arg1, arg2) { … };
    

    或者像这样:

    function someFunction(arg1, arg2) { … }
    
  • 为什么要为每个函数指定第二个名称(例如_toolBar)? “私人”名称仅在函数范围内。

菜单不必在全局范围内,只是在两个函数共有的范围内。

我会像这样重构它(对应用程序的设计知之甚少),内联toolBar

function entryView() {
    var menuButton = $('<div/>' {'class': 'menuButton'}), menu = $('<div/>', {'class': 'menu'});

    $.getJSON('ajax', function(o) {
        var $enum2 = ss.IEnumerator.getEnumerator(dto.TransmittalDates);
        while ($enum2.moveNext()) {
            var dateTime = $enum2.get_current();
            $('.menu').append($('<div/>' {'class': 'menuItem'}).text(dateTime.toString()));
        }
    });

    menuButton.click(function(o) {
          menuButton.append(menu);
    });
}