デフォルトでOnclickイベントをリッスンするフォームのSUBMITおよびSAVEボタンがあります。フォームが送信または保存されると、ページのスクロール位置がページのトップにリセットされます。
最近、アプリケーションのユーザーから、フォームのサブセットのみのボタンが配置されているページの下部にページを残すように要求されました。(これらのボタンは他の何百ものフォームで使用されているため、スクロールのリセットをグローバルに変更することはできません。)
したがって、私が実装しようとしているソリューションには、いくつかの非表示の入力フィールドといくつかのイベント リスナーが含まれます。
これらのボタンに onmousedown イベントを追加しました。
// Submit and Save button listeners
var globalButtons;
if (v_doc.getElementsByClassName) {
globalButtons = v_doc.getElementsByClassName('globalbuttons');
}
// Internet Explorer does not support getElementsByClassName - therefore implement our own version of it here
else {
globalButtons = [];
var myclass = new RegExp('\\b'+'globalbuttons'+'\\b');
var elem = v_doc.body.getElementsByTagName("input");
for (var i = 0; i < elem.length; i++) {
var classes = elem[i].className;
if (myclass.test(classes)) {
globalButtons.push(elem[i]);
}
}
}
for (var gb = 0; gb < globalButtons.length; gb++) {
if (globalButtons[gb].name == 'methodToCall.route' ||
globalButtons[gb].name == 'methodToCall.save') {
if(globalButtons[gb].addEventListener) { //all browsers except IE before version 9
globalButtons[gb].addEventListener("mousedown", function(){flagSpecialScrollOnRefresh()},false);
}
else {
if(globalButtons[gb].attachEvent) { //IE before version 9
globalButtons[gb].attachEvent("onmousedown",function(){flagSpecialScrollOnRefresh()});
}
}
}
else { continue; }
}
このコードは、と呼ばれる関数にあります。attachButtonListeners
次に、ハンドラーをそのように定義し、ページが読み込まれるたびに呼び出される別の関数に配置しました -
function checkSpecialScrollCase() {
var spfrm = getPortlet();
var sp_doc = spfrm.contentDocument ? spfrm.contentDocument: spfrm.contentWindow.document;
var specialScrollExists = sp_doc.getElementById(docTypeButton).value;
if (specialScrollExists == "YES") {
sp_doc.getElementById(docTypeButton).value = 'NO';
}
// else - nothing to do in this case
}
docTypeButton =REQS_BUTTONS
そして、私の JSP ページの下部にある次の要素を参照します -
<input type="hidden" id="REQS_BUTTONS" value="NO"/>
<a name="anchorREQS"></a>
アンカー タグに注意してください。最終的に、この場所までスクロールできるように、location.hash 呼び出しをハンドラーに追加する必要があります。その部分は現時点では関係ありませんが、その理由は次のとおりです。
問題 - 私の flagSpecialScrollOnRefresh 関数は、値を YES に設定する必要がありますが、YES に設定していません。
onClick イベントの発生が速すぎて、onmousedown イベントが発生しないと思います。
エビデンス - 私がそのように警告声明を出すと -
function flagSpecialScrollOnRefresh() {
var scfrm = getPortlet();
var sc_doc = scfrm.contentDocument ? scfrm.contentDocument: scfrm.contentWindow.document;
alert("BLAH!");
sc_doc.getElementById(docTypeButton).value = "YES";
}
そして、Firebug を使用して要素を調べます - 値が SET になっています! アラートを出したら - ダメ!
mousedown
自分のイベントが最初に実行されるようにするにはどうすればよいですか? それとも、これはここでも問題ですか????