C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: jqueryのdatepickerを利用した際のフォーカス


(過去ログ 141 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■82706 / inTopicNo.1)  jqueryのdatepickerを利用した際のフォーカス
  
□投稿者/ ruru (1回)-(2017/01/30(Mon) 15:35:34)

分類:[JavaScript] 

初めまして。フォーカスが思うように移動出来ず困っております。

・環境
VS Community 2015
ASP.NET
HTML5
JQuery2.0.3
JQueryUI1.11.4

HTMLの道中に、インプットボックスを3つ用意し、それぞれ
年月日、時、分とあります。
そのうち年月日には、datepickerを利用するようにしてあります。

以下ソース
<HTML>
@Html.TextBoxFor(Function(m) m.DATE, "{0:d}", New With {.tabindex = "10"})
@Html.TextBoxFor(Function(m) m.HOU, New With {.tabindex = "11"})
@Html.TextBoxFor(Function(m) m.MIN, New With {.tabindex = "12"})

<Jquery>
jQuery(function ($) {
$("#DATE").datepicker();

$.datepicker.regional['ja'] = {
closeText: '閉じる',
prevText: '<前',

…後略

firstDay: 0,
isRTL: false,
showMonthAfterYear: true,
yearSuffix: '年'
};

$.datepicker.setDefaults($.datepicker.regional['ja']);
});


DATEのインプットボックスをクリックすると、
カレンダー表示はされますが、そのカレンダーをクリックすると
フォーカスが何処にもなくなってしまい、その後タブを押すと、
初期の位置に戻ってしまいます。

カレンダーをクリックした時、フォーカスをHOUにするとしたくとも、
そのカレンダーのクリックイベントを起こすための名前などにたどり着けませんでした。

この場合、どのように処理を行うのがベターなのでしょうか。
ご教示いただけたら幸いです。
引用返信 編集キー/
■82707 / inTopicNo.2)  Re[1]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1128回)-(2017/01/30(Mon) 17:31:42)
No82706 (ruru さん) に返信
> 初めまして。フォーカスが思うように移動出来ず困っております。

基本は以下のページにあるデモの動きをするはずなのですが、これと違うのでしょうか?

違うとするとどのように違うのですか?

それともデモとは違った動きにしたいと言ってますか?

Datepicker
http://jqueryui.com/datepicker/

引用返信 編集キー/
■82710 / inTopicNo.3)  Re[2]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ ruru (3回)-(2017/01/30(Mon) 18:21:19)
>>WebSurfer様
お返事ありがとうございます。

デモページのようにカレンダーを表示させ、日にちをクリックすると
インプットボックスにクリックした年月日を表示するという動きは間違いありません。

但し、この年月日を表示した後に隣のインプットボックスにフォーカスを移動したいと思っています。
ですが、私の例のように、tabindexを10、11、12と設定し、順に移動して欲しいのですが
恐らくカレンダーの日をクリックすると0に戻ってしまい、TABを押すとtabindex1の設定をしたインプットボックスに
フォーカスが移動してしまう。というのが今回の悩みです。
(恐らくというのは、TABを押すとtabindex1に飛ぶことからの推測でしかありません)

引用返信 編集キー/
■82711 / inTopicNo.4)  Re[3]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1129回)-(2017/01/30(Mon) 20:17:21)
No82710 (ruru さん) に返信

> 但し、この年月日を表示した後に隣のインプットボックスにフォーカスを移動したいと思っています。

とすると、多分ソースを変更しないと質問者さんが思ったようにはならないような気がします。

そうだとすると、そこまでは自分は対応し切れませんので、お役に立てずすみませんが、他の方
の回答をお待ちください。
引用返信 編集キー/
■82715 / inTopicNo.5)  Re[4]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ ruru (4回)-(2017/01/31(Tue) 08:50:17)
No82711 (WebSurfer さん) に返信
貴重な時間を頂きましてありがとうございます。

恐らく、プロパティをセットしてすぐ完成みたいなのは調査したところ存在しないのかなと
いう感じはしています。
ソースの変更を行いたくとも、このカレンダーのクリックイベントを発生させる
手段が思いついていない状態です。

ともあれ、一人では煮詰まっていたところでしたので、こういった回答をいただけただけでも
大変助かりました。ありがとうございます。

引き続き、些細なことでも結構ですのでご回答お待ちしております。
引用返信 編集キー/
■82718 / inTopicNo.6)  Re[3]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ 魔界の仮面弁士 (1097回)-(2017/01/31(Tue) 10:20:53)
2017/01/31(Tue) 10:26:28 編集(投稿者)

No82710 (ruru さん) に返信
> 但し、この年月日を表示した後に隣のインプットボックスにフォーカスを移動したいと思っています。

Razor も jQuery も専門外なので見様見真似ですが、
こんな感じで移動できないでしょうか。


$.datepicker.regional['ja'] = {
closeText: '閉じる',
// 略
yearSuffix: '年',
onSelect: function(dateText, inst) { $("#DATE").next().focus(); }
};


>> DATEのインプットボックスをクリックすると、
>> カレンダー表示はされますが、そのカレンダーをクリックすると
>> フォーカスが何処にもなくなってしまい、

こちらの環境設定が悪いのかも知れませんが、DATE のクリックで
カレンダーが表示されている間も、<input name="DATE"> に
フォーカスは残ったままになっていました。

(矢印キー操作は、ドロップダウンされたカレンダーではなく、
 input 側に対する操作になっています)
引用返信 編集キー/
■82720 / inTopicNo.7)  Re[4]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ ruru (5回)-(2017/01/31(Tue) 11:11:48)
No82718 (魔界の仮面弁士 さん) に返信
> 2017/01/31(Tue) 10:26:28 編集(投稿者)
魔界の仮面弁士様 お返事ありがとうございます。

> $.datepicker.regional['ja'] = {
> closeText: '閉じる',
> // 略
> yearSuffix: '年',
> onSelect: function(dateText, inst) { $("#DATE").next().focus(); }
> };

内容に対する知識は追いついておりませんが、希望した動きとなりました。

datepickerを複数使っておりますが、それも
   onSelect: function (dateText, inst) { $(this).next().focus(); }
とすることで解決いたしました。 ありがとう御座います。

後学の為に教えて下さい。(参考になるサイトでも大歓迎です)
dataTextやinstというのは何を指すのでしょうか。
onselect , jquery , dataText , inst などで検索をしておりますが、
的を射た解答にたどり着けませんでした。



> こちらの環境設定が悪いのかも知れませんが、DATE のクリックで
> カレンダーが表示されている間も、<input name="DATE"> に
> フォーカスは残ったままになっていました。
>
> (矢印キー操作は、ドロップダウンされたカレンダーではなく、
>  input 側に対する操作になっています)

IE11で試しております(最初に述べるべきでした)
フォーカスを受けたコントロールはCSSにより光るという動きをさせていますが、
全てのコントロールのどこをみても光っていない為、フォーカスは残っていないと
判断しています。

尚、VS2015の初期標準のMVCテンプレートを利用した為、
意図して設定していない調整が行われている可能性もあるかもしれません。
引用返信 編集キー/
■82726 / inTopicNo.8)  Re[5]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1130回)-(2017/01/31(Tue) 11:57:27)
No82720 (ruru さん) に返信

> dataTextやinstというのは何を指すのでしょうか。

上に紹介したデモページに "Want to learn more about the datepicker widget? Check out the API
documentation." とありますが、その API documentation のリンクをクリックすると詳細な説明を見
ることができます。onSelect オプションの説明もそこにあります。

#自分も、ソースコードの変更を考える前に、まずそこを見るべきだったと反省中。

引用返信 編集キー/
■82727 / inTopicNo.9)  Re[5]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ 魔界の仮面弁士 (1098回)-(2017/01/31(Tue) 12:40:41)
No82720 (ruru さん) に返信
> 内容に対する知識は追いついておりませんが、

知識不足ならこちらも負けていないかも…。

大昔に Classic ASP な開発に携わっていたことがある程度で、
ASP.NET や HTML5、jQuery UI などについては本当にからっきしでして、
Razor や MVC に至っては、今回の質問で始めて触れたというほどです。


> 希望した動きとなりました。

今回は引数を見ることがないので、
 onSelect: function(){ $("#DATE").next().focus(); }
で十分な気もします。


> dataTextやinstというのは何を指すのでしょうか。

ごめんなさい。jQuery UI の仕様書で調べたわけでは無いので知らないです。

[引数 2 個]
https://www.softel.co.jp/blogs/tech/archives/92
http://stackoverflow.com/questions/10845206/

[引数 1 個]
http://programmer-jobs.blogspot.jp/2014/12/jquery-datepicker-change-event-onselect.html


第一引数には <input type="text"> の value が格納されていました。

第二引数については分からないですが、名前からしてイベントソースのインスタンスでは無いでしょうか。。
Chrome のデバッガでアタッチしてみたところ、
 Object {id: "DATE", input: init[1], selectedDay: "6", selectedMonth: 0, selectedYear: 2017…}
なオブジェクトが格納されていました。



> IE11で試しております(最初に述べるべきでした)
> 尚、VS2015の初期標準のMVCテンプレートを利用した為、
> 意図して設定していない調整が行われている可能性もあるかもしれません。

こちらも IE11 ですが(Win7x64)、VS2015 が無いので 2012 でテストしています。

テンプレートとして[ASP.NET MVC 4 Web アプリケーション]を選択したところ、
既定で jQuery 1.8.2 + jQuery UI 1.8.24 が組み込まれていました。

バージョンが違うようなので、せめてそこだけでも統一させようとしたのですが、
NuGet からでは 2.0.3 + 1.11.4 を取得できなかったため、依存ファイル等を知らないまま

http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.js
http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js
http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.js
http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js

のみを拾い集め、リネームして /Scripts に配置した次第です。
CSS 等も必要なのかも知れませんが、入手先も配置先も分かっていません。

ついでに、_references.js の冒頭二行を意味も分からないまま
/// <reference path="jquery-2.0.3.js" />
/// <reference path="jquery-ui-1.11.4.js" />
に書き換えて、それでもエラーになるので、Scripts の下にある
jquery.unobtrusive*.js と jquery.validate*.js を排除してみたところ、
とりあえず、不恰好ながらも動作だけはするようになったという次第。

不勉強で済みません…。



No82726 (WebSurfer さん) に返信
> 上に紹介したデモページに "Want to learn more about the datepicker widget? Check out the API
> documentation." とありますが、その API documentation のリンクをクリックすると詳細な説明を見
> ることができます。onSelect オプションの説明もそこにあります。

あー、そこにありましたか。φ(..)
API documentation までは辿ったものの、"Event" 欄が空欄だったので見落としていました。反省。


>> ( String dateText, Object inst )
>> The function receives 『the selected date as text』 and 『the datepicker instance』 as parameters.
引用返信 編集キー/
■82732 / inTopicNo.10)  Re[6]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ ruru (6回)-(2017/01/31(Tue) 13:57:32)
>>WebSurfer様
>>魔界の仮面弁士様

詳細な説明をありがとう御座います。
英語のページという事で躊躇っていましたが、ご教示頂きましたページをたどり
メソッド説明の箇所までたどり着くことが出来ました。


折角ですので、些細なことかもしれませんが今回の情報を共有させていただきます。

【問題】
年月日・時・分のインプットボックスが存在する。
年月日をクリックするとカレンダーが表示される。
選択後、年月日は正しく表示されるが、その後フォーカスが消失しタブを押すと初期位置に戻ってしまう。

【対応】
下記のオプションを追加した。

【Onselect】オプション Type: Function( String dateText, Object inst )
datepickerが選択された時に呼ばれます。

引数1.dataText カレンダー選択時の日付が入ります
引数2.inst   パラメーター群

実際のコードは引数の情報が今回は不必要だった為、下記となります。

onSelect: function(){ $("#DATE").next().focus(); }

【結果】
カレンダー選択後に、時のインプットボックスに移動した。



今回は問題解決のみならず、解決に至るまでの手法なども教えてくださり、
本当にありがとうございます。とても勉強になりました。
まだまだWEBの開発は途中で分からないことだらけです。
一つずつ理解し、困っている人と共有出来たらいいなと思っております。

これにて解決とさせていただきます。
解決済み
引用返信 編集キー/
■82733 / inTopicNo.11)  Re[6]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1131回)-(2017/01/31(Tue) 13:58:30)
No82727 (魔界の仮面弁士 さん) に返信

onSelect を見つけられたところ、さすがです。自分はそこまで考えが回りませんでした。

一つだけ気になった点を書かせていただきます。

>> 希望した動きとなりました。
>
> 今回は引数を見ることがないので、
>  onSelect: function(){ $("#DATE").next().focus(); }
> で十分な気もします。

質問者さんのケースでうまくいったのは、想像ですが、html ヘルパ

@Html.TextBoxFor(Function(m) m.DATE, "{0:d}", New With {.tabindex = "10"})

から、<input type="text" id="DATE" ... /> という html ソースが生成されたので、
$("#DATE") でその要素の jQuery オブジェクトが取得でき、.next() でその次の要素、
すなわち html ヘルパ

@Html.TextBoxFor(Function(m) m.HOU, New With {.tabindex = "11"})

で生成された <input type="text" ... />(フォーカスを当てたい要素)を取得し、
.focus() でフォーカスが当たったからだと思います。

問題は (1) html ヘルパが生成する input 要素の id が必ず DATE というプロパティ
名になるという保証がない(少なくともそういうことが書いてある Microsoft の公式
文書が見つかりません)、(2) 今回はたまたま(?).next() デフォーカスを当てたい
要素が取得できたが、隣にないこともありそう・・・だと思います。

なので、例えば、$('input:text[tabindex=11]') のようにフォーカスを当てたい要素
を特定して、それに .focus() メソッドを適用した方がよさそうに思います。
引用返信 編集キー/
■82734 / inTopicNo.12)  Re[7]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1132回)-(2017/01/31(Tue) 14:02:06)
No82732 (ruru さん) に返信

解決済みマークをつけ忘れました。すみません。
解決済み
引用返信 編集キー/
■82735 / inTopicNo.13)  jqueryのdatepickerを利用した際のフォーカス
□投稿者/ ruru (7回)-(2017/01/31(Tue) 14:30:31)
2017/01/31(Tue) 14:31:42 編集(投稿者)
2017/01/31(Tue) 14:31:40 編集(投稿者)

>>WebSurfer様
タイミングがかぶってしまい、貴重なご意見をいただけているのに
解決済みマークをつけてしまっていました。

折角のご意見なのでお話を続けたいところですが、
以降は自身の勉強として調査していきます。


>>(1) html ヘルパが生成する input 要素の id が必ず DATE というプロパティ
>>名になるという保証がない(少なくともそういうことが書いてある Microsoft の公式
>>文書が見つかりません)

そうだったのですか。全く意識外だったので驚きです。


尚、同一ページにカレンダー表示するインプットボックスは複数ありますので
下記のような実装でテストを繰り返しているところです。
今のところは特に問題がないようですが、まだまだ試行回数は足りていません。


$("#H_STA_DATE").datepicker();
$("#H_END_DATE").datepicker();

$.datepicker.regional['ja'] = {

  …省略…
      onSelect: function () { $(this).next().focus();}
  }



解決済み
引用返信 編集キー/
■82736 / inTopicNo.14)  Re[7]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ 魔界の仮面弁士 (1100回)-(2017/01/31(Tue) 14:35:14)
No82733 (WebSurfer さん) に返信
> 問題は (1) html ヘルパが生成する input 要素の id が必ず DATE というプロパティ
> 名になるという保証がない(少なくともそういうことが書いてある Microsoft の公式
> 文書が見つかりません)

id の重複は起こりえるようですが、id が改変されるパターンについては知りませんでした。

不勉強ゆえ、どういう時に異なる id になるのかは知らないのですが、
それが問題になりそうであれば、id を明示指定するのでは駄目でしょうか?


@Html.TextBoxFor(Function(m) m.DATE, "{0:d}", New With {Key .id = "ruru", .tabindex = "10"})
@Html.TextBoxFor(Function(m) m.HOU, New With {Key .id = "WebSurfer", .tabindex = "11"})

<script type="text/javascript">
jQuery(function ($) {
$("#ruru").datepicker();
$.datepicker.setDefaults(
$.datepicker.regional['ja'] = {
onSelect: function () { $("#WebSurfer").focus() }
}
);
});
</script>


ASP.NET 側の仕様はさておき、HTML 的には、id 属性は文書中で一意になるべきなので、
もしも id="xyz" が複数生成されてしまった場合、jQuery においては
jQuery("#xyz") としても、最初の要素しか得られないそうです。


jQuery("#xyz").datepicker(); のかわりに
jQuery("[id=xyz]").datepicker(); とすることはできそうですが、
これだと jQuery UI 側が対応していないようで…。
解決済み
引用返信 編集キー/
■82738 / inTopicNo.15)  Re[8]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1133回)-(2017/01/31(Tue) 15:10:11)
No82736 (魔界の仮面弁士 さん) に返信

> それが問題になりそうであれば、id を明示指定するのでは駄目でしょうか?

その結果をすべてを知っていて完全にアンダーコントロールにあれば駄目ということはないと
思いますが、個人的には予期せぬ副作用が出る可能性を排除しきれません。

具体的には、例えば、以下のような html ヘルパから、

@Html.LabelFor(m => m.CountryList[i].Name)
@Html.EditorFor(m => m.CountryList[i].Name)
@Html.ValidationMessageFor(m => m.CountryList[i].Name)

以下のような html ソースがレンダリングされます。(data-val... はクライアントスクリプト
によるユーザー入力の検証に使うものです)

<label for="CountryList_0__Name">国名</label>
<input class="text-box single-line" 
  data-val="true" 
  data-val-length="国名 は 15 文字以内" 
  data-val-length-max="15"
  data-val-required="国名 は必須" 
  id="CountryList_0__Name"
  name="CountryList[0].Name" 
  type="text"
  value="Italy" />
<span class="field-validation-valid" 
  data-valmsg-for="CountryList[0].Name" 
  data-valmsg-replace="true">
</span>

この id を自分で指定して、jQuery ライブラリを使ったクライアント側での検証がうまく動く
のかが気がかりです。他にも予期できない副作用があるかもしれません。

十二分に検証すれば済むかもしれませんが、そもそも余計な気苦労と不要な手間と思いますし、
今回の質問者さんのケースではそこまでして id を指定する必要もなさそうだと個人的に思い
ます。

引用返信 編集キー/
■82739 / inTopicNo.16)  Re[9]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1134回)-(2017/01/31(Tue) 15:14:25)
また解決済みマークをつけ忘れました。すみません m(_._)m
引用返信 編集キー/
■82740 / inTopicNo.17)  Re[10]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1135回)-(2017/01/31(Tue) 15:18:09)
No82739 (WebSurfer さん) に返信

また解決済みマークをつけ忘れましたと言っておいてまたつけ忘れました。
つけたつもりだってのですがボケてました。ようです(言い訳)。
スレッドにゴミを増やしてしまって本当にすみません m(_._)m
解決済み
引用返信 編集キー/
■82741 / inTopicNo.18)  Re[9]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ 魔界の仮面弁士 (1101回)-(2017/01/31(Tue) 17:22:22)
No82738 (WebSurfer さん) に返信
> 個人的には予期せぬ副作用が出る可能性を排除しきれません。

なるほど、ありがとうございます。

しかしその指定方法が駄目だとすれば、そもそもフォーカス移動処理以前に
 $("#DATE").datepicker();
の段階でアクセスに失敗しそうなので、この部分から見直すべきということですね。


個人的には、tabindex を検索キーにすることに不安があるので、
やはり id で指定するべきだと考えているのですが、それではたとえば
Html.IdFor や Html.NameFor を使うのはどうでしょうか?


@Code
  Dim idDATE = Html.IdFor(Function(m) m.DATE)
  Dim idHOU = Html.IdFor(Function(m) m.HOU)
End Code

jQuery(function ($) {
 $("#@idDATE").datepicker({
  onSelect: function() {
   $("#@idHOU").focus();
  }
 });
});

//------------------------


jQuery(function ($) {
 $("#@Html.IdFor(Function(m) m.DATE)").datepicker({
  onSelect: function() {
   $("#@Html.IdFor(Function(m) m.HOU)").focus();
  }
 });
});

解決済み
引用返信 編集キー/
■82742 / inTopicNo.19)  Re[10]: jqueryのdatepickerを利用した際のフォーカス
□投稿者/ WebSurfer (1136回)-(2017/01/31(Tue) 23:10:48)
No82741 (魔界の仮面弁士 さん) に返信

> しかしその指定方法が駄目だとすれば、そもそもフォーカス移動処理以前に
>  $("#DATE").datepicker();
> の段階でアクセスに失敗しそうなので、この部分から見直すべきということですね。

その通りだと思います。

> 個人的には、tabindex を検索キーにすることに不安があるので、
> やはり id で指定するべきだと考えているのですが、それではたとえば
> Html.IdFor や Html.NameFor を使うのはどうでしょうか?

そうですね・・・というか、正直言ってそれが使えるのは知らなかったです。

ASP.NET Web Forms アプリではインラインのスクリプトに $('#<%=TextBox1.ClientID%>').datepicker();
というように表示ブロックを使って ClientID(html に変換された時の id)を埋め込むことができますが、
それと同じことができますね。

おかげさまで一つ知識が増えました。

開発マシンにある以下の既存の View を使って検証してみました。下の方のインラインスクリプトで
@Html.IdFor を使うと、

@model Mvc4App.Models.Parent2

@{
    ViewBag.Title = "Create2";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.Name)
    @Html.EditorFor(m => m.Name)
    @Html.ValidationMessageFor(m => m.Name)
    <br />
    
    for (int i = 0; i < Model.Children.Count; i++)
    {
        @Html.LabelFor(m => m.Children[i].Name)
        @Html.EditorFor(m => m.Children[i].Name)
        @Html.ValidationMessageFor(m => m.Children[i].Name)
    }
    <br />
    
    <input type="submit" name="addchild" value="Add Child" />
    <input type="submit" value="POST" />
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")

    <script type="text/javascript">
    //<![CDATA[
        function disp(data) {
            $("#@Html.IdFor(m => m.Children[0].Name)").empty();
        }
    //]]>
    </script>
}


レンダリングされる html ソースは以下のようになり、上の @Html.EditorFor(m => m.Children[i].Name)
でレンダリングされる i が 0 のテキストボックスの id が設定されることが確認できました。

<script type="text/javascript">
//<![CDATA[
    function disp(data) {
        $("#Children_0__Name").empty();            
    }
//]]>
</script>

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -