SPAの環境で、複数のwidgetが生成されるケースについて

SPAの環境で、widgetを実行すると、同一接客でwidgetが複数生成されることがあります。
実際には、URL変更開始時に、widget.hide()を実行し、URL変更完了と同時に、tracker.view();を実行しています。
※複数のwidgetが生成される例を添付します。(widget_firstという名前で出力しています)


このように、widget_idが異なる複数のwidgetが同時に実行されてしまうことで、widgetオブジェクトの数だけ処理が走ってしまうことがあり、最新のwidget_idの接客のみに絞って処理をしたいと考えています。

最新のwidget_idを持つ接客以外は、変数に代入しても参照できなくなってしまうにも関わらず、異なるwidget_idで複数の処理が走ってしまうため、最新のwidget_id以外は、無効にしたいと思っています。

しかし、widget.hide()では無効にならないため、widgetオブジェクト自体を破壊するような処理ができればうまくいくと考えていますが、そのようなメソッドはありますでしょうか?

念の為確認ですが、以下のclose_actions オプションはご利用中の認識で間違いないでしょうか??

https://developers.karte.io/reference#jssdk-tracker-init

通常はJavascriptのグローバル側からwidgetに干渉することはあまりないため、あまり問題にならない部分かと思っておりますが・・!

早速のご返信ありがとうございます。
close_actions: true
で配信していますので、close_actionsは利用しています。

ちなみに、今回複数のwidgetが実行されることで起きてしまう事象の一つが、別タブ遷移させるという設定をしており、それが生成されたwidgetの数だけ起こってしまうことです。。。

補足しますと、mutationObserverを使って実行したときには、複数生成されたwidgetがまとめて実行されたため、widget_idが最新のものだけを処理するといったことが可能だったのですが、mutationOberserなしで「reactRouteChangeStart」でURL変更のみ検知された場合には、複数生成されたwidgetがまとめて実行されるということはなかったため、制御の仕方がわからず。。という状況です。

コメントを拝見する限り、KARTEの外側からKARTEで配信されたwidgetに対して何らかの影響を及ぼしたい
という内容かと思いますが・・

申し訳ございませんが、頂いた内容については仕様上公開している部分ではなく
ちょっとコメントが難しそうです。

ちなみに、Widget側からですとwidget.on(“destroyed”)をご利用いただくと
どのタイミングでdestroyedされているかは把握できそうです。

https://developers.karte.io/reference#widgeton

コメントを拝見する限り、KARTEの外側からKARTEで配信されたwidgetに対して何らかの影響を及ぼしたい
という内容かと思いますが・・

カルテの接客上(生成されるwidgetと同一の接客)から、widgetオブジェクトを意図的にdestroyしたいのですが、可能ですか?

ちなみに、Widget側からですとwidget.on(“destroyed”)をご利用いただくと
どのタイミングでdestroyedされているかは把握できそうです。

たしかに、destroyされたタイミングはわかったので、ヒントにはなるかもですね。。

五月雨で失礼します。
以下のような記述で添付のようにコンソールに表示されたため、
おそらく、widget.destroy();でwidgetオブジェクトの削除ができているのではないかと考えています。

widget.on(‘destroyed’, function(){
console.log(‘destroyed’);
});

if( widget ){
    widget.destroy();
    console.log('widget>destroyed');
}

しかしながら、複数生成されたwidgetオブジェクトの数だけ、接客の処理が実行されてしまいます。
つまり、widgetオブジェクトを削除したとしても、生成されたwidgetオブジェクトの数だけ接客の処理が実行されてしまうということは、接客上で実行されているJavaScriptは、widgetオブジェクトの影響を受けないのでしょうか?

課題は、別の手段で解決できそうなので、大丈夫そうです。
例えば、widgetオブジェクトが別々になる場合、一つのwidget内で定義した変数は、別のwidgetオブジェクトからだと参照できなくなるため、セッションストレージなどを使うと、値の制御はできたので、このような手法を使って力技で解決しました。

ただ、根本的な要因はわからないため、お時間のある際に、ご教授いただければ幸いです。
お忙しい中、ありがとうございました!

1 Likes

うまくご希望の内容をお返しできなくて申し訳ないです。。
試していただいてありがとうございます!

1 Likes