SSブログ

Firefoxでスクロールするとページトップに戻ってしまうことがある。 [メール投稿]

正己さんはTwitterを使っています: "さて、この返信ツイートまでは入力欄の下に「ツイート」ボタンが見える状態だが、その「ツイート」ボタンの舌を表示しようとスクロールバーをドラッグすると、一番最初のツイートの「ツイッターがバグってる。返信の下の方を表示できない。」が表示される状態にスクロールが戻ってしまう。"
...

このツイートがスクロールできない問題。
似た症状を実現するソースを作っておいたので、こちらに残しておく。
ただし、上記のツイートが同じ原因かどうかは分からない。
また、症状を見てもらうためにdivブロックで実現しようとしたけれど、方法が分からなかった。
では、そのソース。次の通り。
<html>
<head>
<title>I can not scroll.</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.js"></script>
<script>
$(window).scroll(function(){
    if($(window).scrollTop() >= 100){
        $("body").animate({"scrollTop": "0"}, 50);
    }
});
</script>
</head>
<body>
<p style="margin-bottom:1500px;">top</p>
<p>bottom</p>
</body>
</html>


追記(2014/12/27):
ツイッターで生じていたスクロールの問題は、次のスクリプトでも再現できて、どうやら、こちらのスクリプトの方が近いらしい。
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.js"></script>
<script>
$(window).scroll(function(){
    if($(window).scrollTop() >= 100){
        setTimeout(function(){window.scrollTo(0, 0);}, 50);
    };
});
</script>

そして、次の二行のスクリプトを末尾に追加すると、上のスクリプトは無効にできるらしい。
window.scrollTo = function(x,y){};
$(document).scroll(function(){});

風柳さんに作っていただいたスクリプト【twEnablesSelection】で上記の不具合に対処できる原因を考察してみた結果。



追記(2014/12/27):
次の一行のスクリプトを末尾に追加すると、window.scrollTo を無効にできるらしい。(参照
window.scrollTo = function(){return false;};


追記(2015/1/9):
いつの間にかバグが解消されていた。
風柳さんに作っていただいた別のバグに対処するブックマークレット【ツイート中テキストを選択可能に】に「追記(2014/12/27)」のスクリプトを足して作ったFirefox用のブックマークレットをFirefoxから削除するのだが、同じバグに遭遇した時のために、ここにソースをメモしておく。
ツイバグ解消
javascript:(function(w,d){var%20container=d.documentElement;var%20script=document.createElement('script');script.textContent='window.scrollTo=function(){return%20false;};';container.appendChild(script);var%20get_selected_text=function(){if(w.getSelection)return%20w.getSelection().toString();if(d.selection&&d.selection.type!='Control')return%20d.selection.createRange().text;return%20'';};$('div[role="main"],%20div#page-container').each(function(){var%20jq_container=$(this),container=jq_container.get(0);if(!container)return;var%20jq_events=$._data(container).events;if(!jq_events||!jq_events.click)return;var%20handlers=[];$.each(jq_events.click,function(i,click_event){handlers[handlers.length]=click_event.handler;});var%20bind_handlers=function(){$.each(handlers,function(i,handler){jq_container.click(handler);});};$(w).mouseup(function(e){if(!$(e.target).hasClass('js-tweet-text')||!get_selected_text())return;jq_container.unbind('click');setTimeout(bind_handlers,100);});});})(window,document);


追記(2015/1/16):
トップにスクロールが戻ってしまうサンプル。ただし、animate を使ったもの。scrollTo(0, 0)は div に対して使えなかった。
scrollTop: ←100を超えると戻る

top

bottom

ソース
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.js"></script>
<script type="text/javascript">
<!--
$(document).ready(function(){
  $('#bug20141224').scroll(function(){
    $('#out20141224').text('scrollTop: '+$(this).scrollTop());
    if($(this).scrollTop() >= 100){
      $(this).animate({'scrollTop': '0'}, 50);
//    $(this).scrollTo(0, 0);  // windowには使えてもdivに使えない
//    $(this).scrollTop(0);  // 戻る
    };
  });
});
//-->
</script>
<div><span id="out20141224">scrollTop: </span><span id="out">←100を超えると戻る</span></div>
<div id="bug20141224" style="width:200px;height:100px;overflow:auto; border:1px solid gray; padding:5px">
<p style="margin-bottom:1000px;">top</p>
<p>bottom</p>
</div>

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:moblog

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。