created: 2023-02-14T08:04:58.627Z

jQueryプラグインの public メソッドについて

selectpicker というjQueryブラグインを使っていて、enable/disabled 周りの処理でプラグインのオプションだけだと痒いところに手が届かないことになっていたので、なんとかならないかなとパッケージのコードを読んでいたらpublic methodなる記述を見つけた。

プラグインがその本体の他にpuclicなメソッドをexposeできることを知らなかった。

    // Expose public methods
    this.val = Selectpicker.prototype.val;
    this.render = Selectpicker.prototype.render;
    this.refresh = Selectpicker.prototype.refresh;
    this.setStyle = Selectpicker.prototype.setStyle;
    this.selectAll = Selectpicker.prototype.selectAll;
    this.deselectAll = Selectpicker.prototype.deselectAll;
    this.destroy = Selectpicker.prototype.destroy;
    this.remove = Selectpicker.prototype.remove;
    this.show = Selectpicker.prototype.show;
    this.hide = Selectpicker.prototype.hide;

refresh メソッドが探していた処理だったのでちょっと喜んだのだが、どうやって呼び出すものかわからなくて困ってしまった。

これらの処理は、普通にjQueryオブジェクトから呼べるのかともおもったが呼び出せない。コメントにはpublicと書いてあるのでさすがにパッケージのユーザが呼び出せるコードだとは思うのだが...

// これだとダメ
$("#myid").refresh();

Googleに聞いてみると、なんと、data メソッドにプラグインの名前(メソッド名になっているもの)を文字列で渡すと、そこからpublicメソッドにアクセスできるようになっているそうだ。

// これだと呼び出せる
$("#myid").data("selectpicker").refresh();

これは動作したが、公式のドキュメントのdataメソッドのページにはそんなことは書いていないのでdeprecateなのかもしれない。

ちなみにChatGPTに聞いてみたところ、この方法を答えてくれた。以前は一般的な方法だったのだろうか。

image

自信満々に回答してくれているが、両方ともそんな記述はなかった。

image

Interface(インターフェース) 2023年 07 月号
[ad] Interface(インターフェース) 2023年 07 月号
Interface編集部 (雑誌)