JavaScriptコントロールがアタッチされているウィジェットがあります。
ウィジェット管理ページのロード時にウィジェットが存在する場合、コントロールは正しく機能します。
新しいウィジェットを追加すると、それらは正しく機能せず、マークアップが表示されますが、javascriptイベントは有効になりません。
新しいウィジェットを保存すると、フォームがリロードされると、コントロールが正しく作成され、機能するようになります。
ページを更新すると、既存のウィジェットのみの問題も修正されます。新しいウィジェットにはまだこの問題があります。
具体的には、これらのポイントで選択入力に対してselectizeを実行しています。
- 文書準備完了
- Ajaxcomplete
必要に応じて各イベントでコードが実行されることを確認しましたが、結果は期待どおりではありません。
問題を実証するテストプラグインは次のとおりです。
https://gist.github.com/Tarendai/8466299
変換できることがわかったすべての選択要素で増加するカウンターがあることがわかります。
ノート:
- ウィジェットページがロードされると、JSコンソールで期待どおりにカウンターが増加するのがわかります。
- 新しいウィジェットを追加すると、コードが実行されますが、found.lengthが0であることからわかるように、実行可能な選択要素の検索に失敗します。このタイプのすべての新しいウィジェットは、選択要素を持っている
- select要素にはそれらを識別するためのクラスがあり、selectizeライブラリが適用されると、このクラスは削除され、既存のウィジェットでの複製と再処理が防止されます。
- selectizeを使用する前に、同じ問題のあるSelect2を使用しました
- AJAXコードをコメントアウトすると、新しいウィジェットには標準の選択入力が含まれることになります。彼らはしない。なぜそうなのか分かりません
それでは、変更を行う前に保存を更新/クリックするようにユーザーに通知せずに、selectizeコントロールを機能させるにはどうすればよいですか?
jQuery( document ).ajaxStop( function() {
ていたことであり、新しくロードされたウィジェットのコントロールを初期化できるようにパーツを追加した理由です。ただし、その行を削除すると、新しいウィジェットには標準のHTML選択入力が含まれることが期待されますが、それらには= sがありません
widget-updated
とwidget-added
イベントを使用することで最もクリーンなアプローチです。また、@ michaeljamesコードで、要素idの使用を強調したいと思い#widgets-right
ます。JSコード内のアクティブなウィジェット要素をターゲットにするためにそれを使用してください。そうしないと、コードが画面の左側にある非表示の非アクティブなウィジェット要素を選択する可能性があるため、重複した要素を取得する可能性があります(ウィジェットが追加されるとクローン化されます)
.on()
メソッドの使用を検討する必要があります。イベントをドキュメントにバインドする必要があります。しかし、どのようなイベントが適切かは今のところわかりません。最終的には、元のバインディングはページがロードされたときのDOMの初期バージョンを表し、ほとんどの場合、ajaxを介して追加される新しい要素(ウィジェットコンテンツ)を認識しないためです。うまくいけば、正しい方向にあなたを向けることができます。そうでない場合は、仕事中にもっとよく答えることができます。