質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

775閲覧

iframe内にあるbxSliderの表示枚数を動的に変更してjsを再度実行したい

Webtuuuu

総合スコア30

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/05/04 05:03

###再現したいこと
iframeに同一サーバー内のページを読み込んでおり、その中にbxSliderが導入されています。
このbxSliderを初期ロード時から、動的にiframe内を操作しスライドさせる要素を増減させ、
増減操作後に再度bxSliderを適用させたいと考えています。

イメージとしてはジェネレータのようなものを作成しており、iframe内はあくまでもプレビューとして動作させます。

以下条件になります。
・プレビューはiframeからは変更できません。※インクルードなどで対応は不可です。
・jsを使用したiframe内全体のリロードはできません。
・スライドはbxSlider以外のプラグインでも対応可能ですが、変更できるのは要素の増減をした後のみで初期表示の部分では変更できません。

###わからないこと
そもそもとして一度発火してしまったbxSliderを再度上書いて実行することができるかどうかがわかりません。
DOM操作をしたあと、動的に追加した要素は当然事前に発火済みのイベントに紐づけられないため動作しません。

なので再度jsを実行させるか要素を一度全部削除し新規で追加させ全く別のイベントとして発火させるべきだと思うのですが、再現方法がわかりません。

###コード
以下がDOM操作する前の素のHTMLです。
初期表示ではbxSlider発火するので以下がbxSlider適用後のHTMLに変化します。

HTML

1<link rel="stylesheet" href="//cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.css"> 2<script src="//ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script> 3<script src="//cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script> 4 5<ul class="bxslider"> 6 <li><img src="http://placehold.jp/200x200.png" alt="要素1"></li> 7 <li><img src="http://placehold.jp/200x200.png" alt="要素2"></li> 8 <li><img src="http://placehold.jp/200x200.png" alt="要素3"></li> 9</ul>

以下コードが、上記のコードに対しbxSliderが実行されたときの一例。
ulの上にタブが追加されたりスタイルやクラスが付与されliのcloneも作成されます。

HTML

1<link rel="stylesheet" href="//cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.css"> 2<script src="//ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script> 3<script src="//cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script> 4 5<div class="bx-viewport" aria-live="polite" style="width: 100%; overflow: hidden; position: relative; height: 560px;"> 6 <ul class="bxslider" style="width: 3215%; position: relative; transition-duration: 0s; transform: translate3d(-1268px, 0px, 0px);"> 7 <li style="float: left; list-style: none; position: relative; width: 1268px;" class="bx-clone" aria-hidden="true"> 8 <img src="http://placehold.jp/200x200.png" alt="要素3"> 9 </li> 10 <li style="float: left; list-style: none; position: relative; width: 1268px;" aria-hidden="false"> 11 <img src="http://placehold.jp/200x200.png" alt="要素1"> 12 </li> 13 <li style="float: left; list-style: none; position: relative; width: 1268px;" aria-hidden="false"> 14 <img src="http://placehold.jp/200x200.png" alt="要素2"> 15 </li> 16 <li style="float: left; list-style: none; position: relative; width: 1268px;" aria-hidden="false"> 17 <img src="http://placehold.jp/200x200.png" alt="要素3"> 18 </li> 19 <li style="float: left; list-style: none; position: relative; width: 1268px;" class="bx-clone" aria-hidden="true"> 20 <img src="http://placehold.jp/200x200.png" alt="要素1"> 21 </li> 22 </ul> 23</div>

しかしこれに対し直接DOM操作で増減させたところで初期の枚数に合わせたスタイルが適用されているので
正しく動作するはずもありません。
###試したこと・解決案
方法がわからず参考サイトを探し色々模索したのですがいずれも正しい解決法がわかりませんでした。

方法①
ひとつは、枚数が変更されるたびに、bxSliderが実行された後の初期のスライドタグを丸っと削除し、
新規で素のHTMLを差し込みliの数を変更させ、再度そこにbxSliderを当てなおすということを考えました。
参考サイト:iframeの親から子、子から親の操作をする(http://cly7796.net/wp/javascript/operation-of-iframe/)

方法②
これも方法①と似ていますが、これはbxSliderが実行された後の初期のスライドタグは削除せずにbxSliderのjsを再実行させ
挙動を上書きしようと考えました。
参考サイト:javascriptの再読込み(https://petitviolet.hatenablog.com/entry/20130418/1366288852)

方法③
これは全く試していませんが、一番現実的な方法だと思いますが、
最初は方法①と同様で、bxSliderが実行された後の初期のスライドタグを丸っと削除し、新規で素のHTMLを差し込みliの数を変更させます。
そのあと追加された要素に対しbxSliderではない別なスライドとして動作する何かを発火させるものです。
序盤に記載した通り、iframe内はあくまでプレビューのため疑似的に表現できればそれでよいので
初期表示はbxSlider、DOM操作後は別のスライダーでも表示が同じであればOKという感じです。

ただこの方法はあくまでbxSliderでは押し通せないとなった場合に使用する最後の手段にしたいので、
もし、DOM操作後にbxSliderを当て治す方法をご存知の方がいればご教示いただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

具体的なコードが掲載されていないのでざっくり回答しますが、bxSliderには reloadSlider とか destroySlider とかメソッドがあるので、リセット/削除してから動かせばよいのでは。

【jQuery Content Slider | Responsive jQuery Slider | bxSlider】
https://bxslider.com/options/

  • Public Methods

reloadSlider

Reload the slider. Useful when adding slides on the fly. Accepts an optional settings object.

destroySlider
Destroy the slider. This reverts all slider elements back to their original state (before calling the slider).

投稿2019/05/05 17:01

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問