4

我正在使用introjs库。

请参阅此处的原始代码。

我希望能够编写var = new IntroJs()而不是调用该start()方法。

我怎样才能做到这一点?

4

4 回答 4

2

为什么不简单地包装 introJs 提供的工厂并在包装器中调用 start 呢?

您可以在外部使用类似这样的方法(未经测试):

var introJsWrapper = function(targetElm) {
    var ijs = introJs(targetElm);
    ijs.start();
    return ijs;
};

或者,您可以在 introJs 代码的分支中执行此操作,方法是将其公开为 main 函数的属性,例如:

var introJs = function (targetElm) {
    if (typeof (targetElm) === 'object') {
    // ...
}
introJs.autoStart = function(targetElm) {
    var ijs = introJs(targetElm);
    ijs.start();
    return ijs;
};

请注意,在 introJs 中,主函数只是内部构造函数周围的一个非常薄的参数测试/更改包装器。调用它间接调用构造函数。所以据我所知,真的不需要直接访问这个内部构造函数。

于 2013-05-09T20:31:51.757 回答
1

嗯,应该是这样的。我假设这些都包含在一个闭包中,因为代码似乎暗示有一些内部函数正在运行。这是我收集的。这不是一个完整的实现,因为我不知道在构造函数中如何使用thiswhen 调用。new IntroJS我所知道的是您的原型函数正在对某些属性进行操作。

//internal functions
function _mergeOptions(target){/*implementation*/}
function _introForElement(el){/*implementation*/}
function _goToStep(step){/*implementation*/}
function _exitIntro(target){/*implementation*/}
function _setHelperLayerPosition(nodeList){/*implementation*/}

//constructor
function IntroJs(first){
  this._options = {};
  this._introChangeCallback;
  this._introCompleteCallback;
  this._introExitCallback;
}
于 2013-05-09T20:17:04.630 回答
0

只需一个空的构造函数就足够了。正如 Jan 所说,这没什么用,但如果你喜欢这个符号......

http://plnkr.co/edit/eFzkKJ14TeaMY44GDxR2

于 2013-05-09T20:11:46.000 回答
0

好的,所以基本上这解决了我的问题:

introJs.fn = IntroJs.prototype = {
    ... 
    initialize: function() {
        return this;
    }
    ...
}

现在,调用introJs().initialize()给了我库而不调用start()方法。

于 2013-05-09T20:37:37.627 回答