人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Java jspについてです。
<select name="begin" size="1">で、値を2007 CommentsAdd Star

<select name="finish" size="1">で値を2015と得たとします。
<select name="during" size="1">で、
int j = finishの値 - beginの値 + 1;
int i2;
int[]no=new int[10];
for(int i=1;i<11;i++){
if((int)j / i == j / i){
i2 +=1;
no[i2] = i;
}
}
などのようにして、約数を算出し、それをduringのドロップダウンリストに作成したいのです。
教えてください。
Javascriptの記述だと思います。

●質問者: kojiro_i619
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●200ポイント ベストアンサー

この回答のコードに書き足しました。
javascript で during を作ってます。

<select name="begin" size="1">
<%
 for(int j=1;j<nens.length;j++){
%>
 <option value="<%="nen"+j %>"><%=nens[j] %></option>
<%
 }
%>
</select><br>
<select name="finish" size="1"></select>

<!-- during を足してます -->
<br>
<select name="during" size="1"></select>


<script>
window.addEventListener("DOMContentLoaded", function() {
 var begin = document.querySelector('select[name="begin"]');
 var finish = document.querySelector('select[name="finish"]');
 begin.addEventListener("change", function() {
 var s = "";
 var selected = false;
 Array.prototype.forEach.call(begin.options, function(opt) {
 if (selected) {
 s += '<option value="' + opt.value + '">' + opt.innerHTML + '</option>';
 }
 if (opt.selected) {
 selected = true;
 }
 })
 finish.innerHTML = s;
 });

 // ここから、この質問の回答です
 function create_during() {
 var opt_begin = Array.prototype.find.call(begin.options, function(opt) {
 return opt.selected;
 });
 var opt_finish = Array.prototype.find.call(finish.options, function(opt) {
 return opt.selected;
 });
 var v_begin = parseInt(opt_begin.innerHTML, 10);
 var v_finish = parseInt(opt_finish.innerHTML, 10);

 var during = document.querySelector('select[name="during"]');
 var s = "";
 var n = v_finish - v_begin + 1;
 for (var k = 1 ; k <= n ; ++k) {
 if (n % k == 0) {
 s += '<option value="' + k + '">' + k + '</option>';
 }
 }
 during.innerHTML = s;
 }

 begin.addEventListener("change", create_during);
 finish.addEventListener("change", create_during);
 // ここまで

});
</script>

begin == 2007、finish == 2015 で、during が 1、3、9 。
begin == 2007、finish == 2016 で、during が 1、2、5、10 。
と、なります。


追記
アロー関数を、無名関数に変更しました。


追記
アロー関数を無名関数に変更するのが、一ヶ所 もれてました (´・ω・`)
ついでに、数をループするところを、素直な書き方に変更しました。


kojiro_i619さんのコメント
(opt) => {の部分の>に赤のアンダーで、 トークン ">" に構文エラーがあります。FunctionExpressionHeader が無効 です。です。

a-kuma3さんのコメント
おっと、アロー関数が使えない環境でしたか(前の回答では、気にしてたのに (´・ω・`) 回答のコードを修正しましたので、もう一度試してみてください。

kojiro_i619さんのコメント
えーとです。前回の、2008を入れたら、2009からがドロップダウンリストになるコードも、なぜか、以下のエラーで動かないのですが。 JST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

a-kuma3さんのコメント
SSL でつなげない、って警告ですね。 https でつなぐようなところに置いてあるんですか? もしくは、javascript を外部ファイルに書いてあって、ページは https だけど、スクリプトの URL は http だとか。

kojiro_i619さんのコメント
mySQLの問題化と思います。ちょっと時間をください。

kojiro_i619さんのコメント
えーと、mySQLのエラーは警告で、関係ないようです。 上記のコードでは、まだ、、 Array.from({length: n}).forEach((v,i) => { の部分に、>がエラーになるようです。

a-kuma3さんのコメント
何度もすみません m(_ _)m アロー関数を無名関数に変更するのが、一ヶ所 もれてました (´・ω・`) ついでに、数をループするところを、素直な書き方に変更しました。

kojiro_i619さんのコメント
>についてのアンダーラインは消えましたが、duringのドロップダウンリストに約数が追加されていません。全くなしです。++kをk++にしても同じです。

a-kuma3さんのコメント
begin の select を手で書いている以外は、回答と同じコードのサンプル。 https://jsfiddle.net/a_kuma3/4fssrgzm/ このサンプルが手元の環境で動くなら、回答のコード以外のところに問題があると思います。

kojiro_i619さんのコメント
このサンプルを、新しく動的webをつくり、jspファイルに、入れましたが、同様に、三番目のドロップダウンリストには、約数は追加されません。

kojiro_i619さんのコメント
何か、importが必要とかないでしょうか?

a-kuma3さんのコメント
サンプルは動くけど、そのまま持って行くと動かない、ということですか? 特にライブラリは使っていないです。 jsp だと、イントラとかでしょうか。外からは見えないですよね、きっと。 そのサンプルを仕込んだ動的web をブラウザで表示して、ブラウザの機能でソースを表示。 表示されたソースを、ここに貼ってもらうことは可能です? 貼り付けるときには、[http://hatenadiary.g.hatena.ne.jp/keyword/%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%82%84%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%EF%BC%88%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BCpre%E8%A8%98%E6%B3%95%EF%BC%89:title=スーパーpre記法]を使って。

kojiro_i619さんのコメント
サンプルも動かないということです。

a-kuma3さんのコメント
jsFiddle のページでも動きませんか。 環境(OS とブラウザ)を教えてください。

kojiro_i619さんのコメント
windows7proで、ブラウザは、eclipseで、ファイルで実行でやっています。セキュリティで、一般のブラウザではやっていませんが、ドロップダウンリストの2番目までは正常動作を確認しています。

kojiro_i619さんのコメント
>|| こんにちは <select name="begin" size="1"> <option value="nen1">2007</option> <option value="nen2">2008</option> <option value="nen3">2009</option> <option value="nen4">2010</option> <option value="nen5">2011</option> <option value="nen6">2012</option> <option value="nen7">2013</option> <option value="nen8">2014</option> <option value="nen9">2015</option> <option value="nen10">2016</option> <option value="nen11">2017</option> </select><br> <select name="finish" size="1"></select><br> <select name="during" size="1"></select> <script type="text/javascript"> window.addEventListener("DOMContentLoaded", function() { var begin = document.querySelector('select[name="begin"]'); var finish = document.querySelector('select[name="finish"]'); begin.addEventListener("change", function() { var s = ""; var selected = false; Array.prototype.forEach.call(begin.options, function(opt) { if (selected) { s += '<option value="' + opt.value + '">' + opt.innerHTML + '</option>'; } if (opt.selected) { selected = true; } }) finish.innerHTML = s; }); // ここから、この質問の回答です function create_during() { var opt_begin = Array.prototype.find.call(begin.options, function(opt) { return opt.selected; }); var opt_finish = Array.prototype.find.call(finish.options, function(opt) { return opt.selected; }); var v_begin = parseInt(opt_begin.innerHTML, 10); var v_finish = parseInt(opt_finish.innerHTML, 10); var during = document.querySelector('select[name="during"]'); var s = ""; var n = v_finish - v_begin + 1; for (var k = 1 ; k <= n ; ++k) { if (n % k == 0) { s += '<option value="' + k + '">' + k + '</option>'; } } during.innerHTML = s; } begin.addEventListener("change", create_during); finish.addEventListener("change", create_during); // ここまで }); </script> ||<

kojiro_i619さんのコメント
>|| <%@ page language="java" contentType="text/html; charset=Windows-31J"%> <%@ page import="java.sql.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J"> <title>Insert title here</title> </head> <body> ||<

a-kuma3さんのコメント
jsFiddle のページは試してないってことですか... eclipse で開発したものは、実際のブラウザで使われることになるんですよね。 eclipse で外部ブラウザを使うようにした方が良いと思いますよ。 貼ってもらったソースはよさそうだなあ。 何の地雷、ふんでるんだろ。

a-kuma3さんのコメント
一部を、少し古い書き方にしてみました。 これだとどうでしょう。 >|javascript| window.addEventListener("DOMContentLoaded", function() { var begin = document.querySelector('select[name="begin"]'); var finish = document.querySelector('select[name="finish"]'); begin.addEventListener("change", function() { var s = ""; var selected = false; Array.prototype.forEach.call(begin.options, (opt) => { if (selected) { s += '<option value="' + opt.value + '">' + opt.innerHTML + '</option>'; } if (opt.selected) { selected = true; } }) finish.innerHTML = s; }); function find_selected(opts) { for (var i = 0 ; i < opts.length ; ++i) { if (opts[i].selected) { return opts[i]; } } return null; } function create_during() { var opt_begin = find_selected(begin.options); var opt_finish = find_selected(finish.options); var v_begin = parseInt(opt_begin.innerHTML, 10); var v_finish = parseInt(opt_finish.innerHTML, 10); var during = document.querySelector('select[name="during"]'); var s = ""; var n = v_finish - v_begin + 1; for (var k = 1 ; k <= n ; ++k) { if (n % k == 0) { s += '<option value="' + k + '">' + k + '</option>'; } } during.innerHTML = s; } begin.addEventListener("change", create_during); finish.addEventListener("change", create_during); }); ||<

kojiro_i619さんのコメント
エラーが出る行があります。前のコードで、約数を普通のリストに作成できませんでしょうか?

a-kuma3さんのコメント
どの行で、どんなエラーが出ますか? # eclipse の内部ブラウザを捨てる方が早いと思いますけど

kojiro_i619さんのコメント
動きました。firefoxで確認できました。

kojiro_i619さんのコメント
サーブレットで、以下に、begin,finish,duringの値を記述したいのですが。 out.println("<HTML>"); out.println("<BODY>"); //ここに記述したい。 out.println("</BODY>"); out.println("</HTML>");

kojiro_i619さんのコメント
これは、別の質問なので、遠慮します。ありがとうございました。

a-kuma3さんのコメント
この質問のページから、別のページ(servlet)に飛ばしたときに選んだ年などを取りたいということですよね。 request.getParameter() は、選ばれた option の value を取得するので、begin の option を jsp で作っていくときに、value は "nen" + j ではなく、nens[j] を指定します。 finish の option の value は、begin のものを使うようにしています。 during は、見えている値を value に入れるようにしています。

質問者から

約数を確認する方法があればと思います。そこまでいっていないんじゃないかと。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ