質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

2380閲覧

URL末尾のハッシュが表示領域に入った要素のIDに変更されるようにしたい

facetamamu

総合スコア6

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/09/25 16:41

編集2017/09/26 04:57

###前提・実現したいこと
要素(entry)が画面内に入るたびに
test.html#entry1、test.html#entry2、test.html#entry3...と
URL末尾のハッシュが各要素のIDに変更されるようにしたいと思っています。

###該当のソースコード

<div class="entry" id="entry1"> <p>記事1記事1記事1記事1</p> </div> <div class="entry" id="entry2"> <p>記事2記事2記事2記事2</p> </div> <div class="entry" id="entry3"> <p>記事3記事3記事3記事3</p> </div>

###試したこと
inview.jsを用いて下記のようにしましたがうまくいきませんでした

$(window).scroll(function (){ $('.entry').on('inview', function() { window.history.pushState(null, null, "XXX.com/works/ + idName"); }); });

いい方法があれば教えていただけますでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
http://gimmicklog.main.jp/jquery/581/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/09/25 19:00

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
facetamamu

2017/09/26 04:57

すみません、修正いたしました。ありがとうございます。
guest

回答2

0

IntersectionObserver

まだ、不安定な仕様ですが、IntersectionObserverによって要素が画面内に入ってきたタイミングを捕捉できるようです。
Polyfill もあるようです。

HTML

1<script> 2'use strict'; 3(function () { 4 function createElements (doc, length, tagName, idPrefix, observer) { 5 var df = doc.createDocumentFragment(), 6 baseElement = doc.createElement(tagName), 7 element, i = 0; 8 9 while (i < length) { 10 element = baseElement.cloneNode(true); 11 element.id = idPrefix + ++i; 12 element.textContent = '#' + idPrefix + i; 13 observer.observe(element); 14 df.appendChild(element); 15 } 16 17 return df; 18 } 19 20 function main () { 21 var doc = this.document, df; 22 23 const observer = new IntersectionObserver((entries) => { 24 for(const entry of entries) { 25 if (entry.isIntersecting) { 26 console.log(entry.target); 27 } 28 } 29 }); 30 31 df = createElements(doc, 1000, 'p', 'foo', observer); 32 doc.body.appendChild(df); 33 34 } 35 36 main.call(this); 37}.call(this)); 38</script>

jquery.inview.js

jquery.inview.js では、scroll, resize, scrollstop イベントによって画面の変化したタイミングで要素位置を再計算して捕捉しているようです。

HTML

1<script src="../lib/other-work-lib/jquery-3.1.1.js"></script> 2<script src="./jquery.inview-master/jquery.inview.js"></script> 3<script> 4'use strict'; 5(function () { 6 function createElements (doc, length, tagName, idPrefix) { 7 var df = doc.createDocumentFragment(), 8 baseElement = doc.createElement(tagName), 9 element, i = 0; 10 11 while (i < length) { 12 element = baseElement.cloneNode(true); 13 element.id = idPrefix + ++i; 14 element.textContent = '#' + idPrefix + i; 15 df.appendChild(element); 16 } 17 18 return df; 19 } 20 21 function handleInview (event) { 22 console.log(event.target); 23 } 24 25 function main () { 26 var doc = this.document, df = createElements(doc, 1000, 'p', 'foo'); 27 28 jQuery(df.children).on('inview', handleInview); 29 doc.body.appendChild(df); 30 31 } 32 33 main.call(this); 34}.call(this)); 35</script>

history.pushState

history.pushState はJavaScriptで動的にページを書き換えたタイミングでURLの履歴を残す目的として、仕様化されました。
副次的効果としてロケーションバー(アドレスバー)の値が書き換えられますが、履歴に残すのが本来の目的です。
質問文にある要件を history.pushState で実装した場合、ページの上スクロール/下スクロールを繰り返すだけで多数の履歴が残り、[戻る], [進む] の履歴も合わせて増えます。

  • ユーザがページ遷移前のページに戻す為に、[戻る] ステップ数が多くなる
  • 多数の履歴が残り、履歴から検索をするのが困難になる

ユーザビリティが低下する実装となりますので、要件を見直す事をお勧めします。

Re: facetamamu さん

投稿2017/09/26 06:18

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

URLを書き換えるだけならこう変更(自動スクロール修正版)

var flag = false; (window).scroll(function (){ flag = true: ); $(function (){ $('.entry').on('inview', function() { if (flag) { location.hash= "HASH-NAME"; } flag=false; }); });

以上

投稿2017/09/25 22:44

編集2017/09/26 10:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/25 22:45

注意) イベントキーは質問者のが正解しているという前提
kei344

2017/09/26 02:55

scrollイベントの中でonを使うと大量にイベント登録してしまいますよ。
退会済みユーザー

退会済みユーザー

2017/09/26 03:04

うん。 イベントキー(発火)は質問者のコードのまま
think49

2017/09/26 03:22

> location.hash= "HASH-NAME" location.hash は強制的にスクロールさせます。 スクロールする度にページの #hash がある場所に強制スクロールされるので、正常にスクロールできなくなるのでは…。
退会済みユーザー

退会済みユーザー

2017/09/26 03:29

hash が同じ値だと hashchange が再発火しないはず
退会済みユーザー

退会済みユーザー

2017/09/26 03:31

とりま、オリジナルからイベントの登録を修正
facetamamu

2017/09/26 05:00

ご回答ありがとうございます。希望の動作にならずでした。おっしゃいますように、そもそものイベントの書き方が試行錯誤のものだったのでここからダメなようです...。inviewは必須ではないのですが、何か他にいい方法があるでしょうか
think49

2017/09/26 05:22 編集

To: asahina1979 さん > hash が同じ値だと hashchange が再発火しないはず 逆に言えば、hash が変わった場合は強制スクロールしてしまいませんか? ■scrollイベントをフックした場合(編集前のパターン) 1. #hash-a が画面内にある 2. 下スクロールされ、#hash-a が画面外になり、#hash-b が画面内にある 3. location.hash= "#hash-b" によって、#hash-b の位置に強制スクロールされる 4. 下スクロールされるも、#hash-b がまだ画面内にある為、3. に戻る 編集後のパターンではスクロール禁止にはなりませんが、描画される要素が切り替わったタイミングで強制スクロールされる問題は残っています。
think49

2017/09/26 06:22

> 編集後のパターンではスクロール禁止にはなりませんが 試してみたところ、そうでもありませんでした。 画面内に複数の要素が含まれるパターンが考慮されていないようです。 https://jsfiddle.net/rwmu0wan/3/
退会済みユーザー

退会済みユーザー

2017/09/26 08:28

自動スクロールだねぇ・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問