改ページありの小テストについて

改ページありの小テストについて

- Umeda Junichi の投稿
返信数: 6

同様の問題があるか検索してみましたがうまく探しだす事ができませんでしたので、
ご教示頂けませんでしょうか。

[状況]
あるコースにおいて小テストを実施しております。
小テストには問題が多数登録されている為、切りのいいところで改ページを設定しております。

上記の状況で、IE6より小テストを実施した場合のみ、次のページに進もうとしたり、指定のページにジャンプしようとすると、Error 404(Object Not Found!)になります。

確認を行ったところ、リンク先で表示される内容が下記の様になっておりました。
正常にリンクを表示できる場合のアドレス
 http://address/moodlesite/mod/quiz/attempt.php?q=7&page=1
Error404になるアドレス
 http://address/moodlesite/mod/quiz/1

各ページへのリンクで呼び出している関数はjavascript:navigate(ページ番号)である事は判っており、
IE6で動作させた場合、構文エラーが警告として表示されているのでそれが原因と思われますが・・・構文エラーになっている原因の特定ができておりません。

構文エラーの内容は下記の様に表示されます。

ライン:136
文字:1
エラー:構文エラーです。
コード:0
アドレス:http://address/moodlesite/mod/quiz/attempt.php?id=xx

環境
1.9.4+ (Build: 20090211)(2007101540)(fs_moodle3.11.00(20090211))
Apache/2.2.11 (Win32)
PHP/5.2.8

NGクライアント:Windows XP+IE6
OKクライアント:Windows XP+IE7、Firefox、Safari

どなたか情報がございましたらご教示願いませんでしょうか。
よろしくお願い致します。

Umeda Junichi への返信

Re: 改ページありの小テストについて

- Tatsuya Shirai の投稿

 残念ながら,当方にはIE6の端末が無いのでチェックが困難です,と思ったら偶然,IE5の環境が発見されました.確かに現象が再現します.

 問題のjavascriptのファンクションは,mod/quiz/quiz.js中の,

function navigate(page) {
    var ourForm = document.getElementById('responseform');
    ourForm.action = ourForm.action.replace(/page=.*/, 'page=' + page);
    if (ourForm.onsubmit) {
        ourForm.onsubmit();
    }
    ourForm.submit();
}

この関数ですね.この関数がURLのpage=の後の数字を書き換えるはずが,うまく動作していないようです.対象となるのは,HTMLソース中の,

<form id="responseform" method="post" action="/mech/moodle/mod/quiz/attempt.php?q=7&amp;page=1" enctype="multipart/form-data" onclick="this.autocomplete='off'" onkeypress="return check_enter(event);" accept-charset="utf-8">

このactionを書き換えようとしているのでしょうかね.青字の部分ですね.ただし,実際に構文エラーが出ているのは次の行の頭1文字目のようです.

<div><div class="paging pagingbar">

もっとも,<form>の部分がおかしいのでその次の行頭でエラーとしている可能性はありますが.

Tatsuya Shirai への返信

Re: 改ページありの小テストについて

- Umeda Junichi の投稿

白井様

いつもありがとうございます。

いくつか試していて気付いた事は、javascriptにもnavigate関数があり、
現在の動作は標準のnavigateコマンドが実施されている様な動きと思われます。

Windows.navigate("url")でurl指定が"1"だとすると、同一フォルダの1というファイルを
探して失敗に終わっている様です。

この為、quiz.js内のnavigate関数をnavigate2として、locallib.php内の
"quiz_print_navigation_panel"のnavigate関数呼び出しを全て書き換え行いました。

[結果]
IE7 = 正常動作
IE6 = Line=1/Char=1/Error=オブジェクトを指定してください。/Code=0

結果からすると、どうやら、スクリプトの呼び出しに失敗している様に思われます。

試しに、ソースを保存して、navigate2関数を直に書き込み行った所リンクをたどれました。

ちょっと修正点を検討してみます・・・

Umeda Junichi への返信

Re: 改ページありの小テストについて

- Tatsuya Shirai の投稿

確かに,window.navigate(URL)というメソッドが存在しますね.

ただ,このメソッドは引数で渡されたURLへ画面を切り替えるメソッドですので,javascriplt:navigate(2);と呼ばれると,カレントフォルダの2というファイルへリダイレクトしてしまいます.これがIE6で起きている現象です.IE7でも,quiz.jsのfunction navigate(page)をfunction navigate2(page)のようにリネームしてしまうと,この関数が見付からないためwindow.navigate()が呼ばれるようで,IE6と同じ現象が再現します.なお,キャッシュにquiz.jsが残っていると動作してしまいますので,キャッシュをクリアして再読み込みして試してみて下さい.

やはりポイントは,IE6ではmod/quiz/quiz.jsのfunction navigate()を呼んで貰えないことに原因があります.ではなぜ呼ばれないのか.メソッドのオーバーライドに対応していないのでしょうか?

Umeda Junichi への返信

Re: 改ページありの小テストについて

- Tatsuya Shirai の投稿

> この為、quiz.js内のnavigate関数をnavigate2として、locallib.php内の
> "quiz_print_navigation_panel"のnavigate関数呼び出しを全て書き換え行いました。

同じく現象を確認しました.

function navigate2()関数の中身を空っぽにしてもエラーが出ますね.
IE7で,function navigate2()の中で,alert(ourForm.action); を挿入するとaction=のURLが表示されるのに対して,IE6では呼び出しすら正常に行えていないようですね.

IE7が出回る前はどうなっていたのか,その辺りも調べてみるとよいかも知れません.

#しかしなぜ構文エラーが出るのだろう.構文エラーをなくせば何とかなりませんかね.

Umeda Junichi への返信

Re: 改ページありの小テストについて

- Tatsuya Shirai の投稿

!!! 私のミスのようです.

136行目とは,ソースのHTMLの136行目ではなく,quiz.jsの136行目のようです!

つまり私が改造した(fs_moodle)のquiz.jsがIE6に対応できていないということのようです.

しまった.

#以前にIE6でカウンターの位置を動かすことができないという報告を受けていながら後回しにしていたツケが回ってきました.失礼しました!


しかも原因が分かりました.私の致命的なミスですquiz.jsの文字コードがシフトJISで保存されています...これをUTF-8で保存し直して下さい.IE6でのみ出ていたエラーが出なくなります.多分,これが原因でIE6のタイマーの位置を動かす機能も働かなかったのでしょう.お粗末でした!

貴重な時間を無駄に使わせてしまい,本当に申し訳ありませんでした.なお,この問題はfs_moodleのみの問題です.オリジナルのMoodleや三重大版Moodleなどを使用してる方には全くなにも影響はありません.

既にfs_moodle(1.8用,1.9用)をお使いの方は,ご面倒ですが,mod/quiz/quiz.jsをUTF-8で保存し直して下さい(Moodle1.8の場合はtimer.js).次のバージョンアップでは訂正しますが,Grade関係の本家の修正がひと段落着くまでバージョンアップは控える予定ですので,次のバージョンアップは来週末頃の予定です.

Tatsuya Shirai への返信

Re: 改ページありの小テストについて

- Umeda Junichi の投稿

白井様

遅い時間までありがとうございました。

UTF-8に変換し保存する事で動作する事確認いたしました。

どうしてもIE6で動かす必要があったため、非常に助かりました。

今後ともよろしくお願い致します。