0

随着这个动画变得越来越复杂,我不断添加参数,以便在每次回调时都可以使用它们。目前共6个。

例如,现在我想在显示消息时禁用输入框,所以我必须添加另一个元素 -in_element;

电话:

    Mo.C.movePane( cover_element, pane_element, 0, 0, 0, 'begin' );

功能:

    movePane: function( cover_element, pane_element, start, end, index, state ) {
        if( ( state === 'begin' ) ) {
            start = parseInt( window.getComputedStyle( pane_element, null ).getPropertyValue("top"), 10 );
            end = start + 40;
            index = start;
            state = 'down';
            cover_element.style.display = 'inline';
            Mo.C.movePane(cover_element, pane_element, start, end, index, 'down' );
        }
        if( ( state === 'down' ) && ( index < end ) ) {
            index += 1;
            pane_element.style.top = ( index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane(cover_element, pane_element, start, end, index, state ); }, 1 );
        }
        else if( ( state === 'down' ) && index === end ) { 
            state = 'up';
            setTimeout( function( ){ Mo.C.movePane(cover_element, pane_element, start, end, index, state ); }, 2000 );
        }
        else if( ( state === 'up' ) && ( index > start ) ) {
            index -= 1;
            pane_element.style.top = ( index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane(cover_element, pane_element, start, end, index, state ); }, 1 );
        }
        else if( ( state === 'up' ) && ( index === start ) ) {
            cover_element.style.display = 'none';
            // signup_pass_input.addEventListener( "keypress", Mo.UserNew.enter, false );
        }
    }
};

可能的解决方案

  • 将所有内容包装在一个名为 的对象中object_all = {},并仅传递这一个变量。
  • 以某种方式分解功能 - 可能会提取开始和结束条件以分离功能
  • 从函数参数移动到对象属性(静态)以保持所需变量的持久性
  • ?
4

4 回答 4

2

当有多个参数时,使用一个对象是正常的。下面是重构代码的示例:

function( cover_element, pane_element, opt ) {
  var delay=1;
  if (!opt) {
    opt = {};
    opt.start =
      parseInt(
        window.getComputedStyle( pane_element, null ).
          getPropertyValue("top"),
        10
      );
    opt.end = opt.start + 40;
    opt.index = opt.start;
    opt.state = 'down';
    cover_element.style.display = 'inline';
  }

  switch(opt.state) {
    case 'down':
      opt.index += 1;
      if (opt.index >= opt.end) {
        opt.index = opt.end;
        opt.state = 'up';
        delay=2000;
      }
      break;
    case 'up':
      opt.index -= 1;
      if (opt.index <= opt.start) {
        cover_element.style.display = 'none';
        opt = null;
      }
  }

  if (opt) {
    pane_element.style.top = ( opt.index ) + 'px';
    setTimeout(
      function( ){
        Mo.C.movePane(cover_element, pane_element, opt);
      },
      delay
    );
  }
}

并这样称呼它:

Mo.C.movePane(elem1, elem2);

它切换方向时的延迟现在是 2000 而不是 2001。

于 2012-08-11T04:43:55.160 回答
1

@mVChr 有正确的答案:传递具有各种参数属性的单个对象。这是一个标准范式,它使许多接口非常干净。将jQuery 的$.ajax()方法作为一个很好的例子。

于 2012-08-10T23:55:29.687 回答
1

推荐使用对象。你也可以按照下面给出的

function movePane() {
    var a = arguments; // to make it easy
    var name = a[0];
    var age = a[1];
    var place = a[2];
    console.log(name, age, place)
}

movePane("abc", 28, "def");
于 2012-08-11T05:30:45.047 回答
0

根据评论答案:

使用对象 o。请注意,您不必初始化对象属性即可使用它们。非常简洁。

        var o = {};
            o.cover_element = cover_element;
            o.pane_element = pane_element
            o.state = 'begin';
        Mo.C.movePane( o );
        return o_p;
    },
    movePane: function( o ) {
        if( ( o.state === 'begin' ) ) { 

            // start

            o.start = parseInt( window.getComputedStyle( o.pane_element, null ).getPropertyValue("top"), 10 );
            o.end = o.start + 40;
            o.index = o.start;
            o.state = 'down';
            o.cover_element.style.display = 'inline';
            Mo.C.movePane( o );
        }
        else if( ( o.state === 'down' ) && ( o.index < o.end ) ) { 

            // move down

            o.index += 1;
            o.pane_element.style.top = ( o.index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane( o ); }, 1 );
        }
        else if( ( o.state === 'down' ) && ( o.index === o.end ) ) { 

            // pause

            o.state = 'up';
            setTimeout( function( ){ Mo.C.movePane( o ); }, 2000 );
        }
        else if( ( o.state === 'up' ) && ( o.index > o.start ) ) { 

            // move up

            o.index -= 1;
            o.pane_element.style.top = ( o.index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane( o ); }, 1 );
        }
        else if( ( o.state === 'up' ) && ( o.index === o.start ) ) { 

            // complete

            o.cover_element.style.display = 'none';
        }
    }
};
于 2012-08-11T19:07:05.820 回答