テキスト フラグメントを使用すると、URL フラグメントにテキスト スニペットを指定できます。 そのようなテキスト フラグメントを含む URL に移動すると、ブラウザは ユーザーの注意を引くことができます
フラグメント識別子
Chrome 80 は大きなリリースでした。待望の機能が数多く含まれていました。たとえば、 ウェブワーカーの ECMAScript モジュール null 結合、 オプション チェーンなど。リリースは通常どおり 発表された ブログ投稿(英語) Chromium ブログ次のスクリーンショットは、ブログ投稿の抜粋です。
<ph type="x-smartling-placeholder">赤いボックスがどのような意味を持つのか疑問に思われているかもしれません。これらは
次のスニペットを作成します。id
属性を持つすべての要素がハイライト表示されます。
document.querySelectorAll('[id]').forEach((el) => {
el.style.border = 'solid 2px red';
});
赤いボックスでハイライト表示された要素へのディープリンクを配置できます。
フラグメント識別子
これを、データセットの hash で使用します。
できます。たとえば、[フィードバックを送信する
[プロダクト フォーラム] ボックス(
これは URL を手作業で作成して
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#HTML1
。
デベロッパー ツールの [Elements] パネルを見るとわかるように、該当する要素には id
が付いています。
値を HTML1
に設定します。
JavaScript の URL()
コンストラクタでこの URL を解析すると、さまざまなコンポーネントが表示されます。
hash
プロパティの値が #HTML1
になっていることに注意してください。
new URL('https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#HTML1');
/* Creates a new `URL` object
URL {
hash: "#HTML1"
host: "blog.chromium.org"
hostname: "blog.chromium.org"
href: "https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#HTML1"
origin: "https://blog.chromium.org"
password: ""
pathname: "/2019/12/chrome-80-content-indexing-es-modules.html"
port: ""
protocol: "https:"
search: ""
searchParams: URLSearchParams {}
username: ""
}
*/
要素の id
を見つけるためにデベロッパー ツールを開く必要があったことは確かですが、
ページの特定のセクションが作成者によってリンクされるはずだった確率
ブログ投稿をご覧ください。
id
のないものにリンクする場合はどうすればよいですか?たとえば、ECMAScript モジュール
ウェブワーカーの見出しで確認します。以下のスクリーンショットからわかるように、問題の <h1>
は
id
属性があるため、この見出しにリンクする方法はありません。これが、
テキスト フラグメントが解決します。
テキスト フラグメント
テキスト フラグメントの提案では、 URL ハッシュでテキスト スニペットを指定する。このようなテキストを含む URL に移動すると、 ユーザーの注意を引くことができます。
ブラウザの互換性
対応ブラウザ
- <ph type="x-smartling-placeholder">
- <ph type="x-smartling-placeholder">
- <ph type="x-smartling-placeholder">
- <ph type="x-smartling-placeholder">
セキュリティ上の理由から、この機能を使用するには
noopener
コンテキスト。
そのため
rel="noopener"
:
<a>
アンカー マークアップまたは追加
noopener
を
Window.open()
ウィンドウ機能機能のリスト。
start
テキスト フラグメントの構文を最も簡単な形式で表すと、ハッシュ記号 #
の後に
:~:text=
、最後は start
がデータを表す
パーセント エンコード
テキストを入力します。
#:~:text=start
たとえば、「Web Workers の ECMAScript モジュール」という見出しを Chrome 80 の機能をお知らせするブログ投稿、 この場合の URL は次のようになります。
テキスト フラグメントはこのように強調されます。 Chrome などの対応ブラウザでリンクをクリックすると、テキスト フラグメントがハイライト表示され、 ビューにスクロールします。
<ph type="x-smartling-placeholder">start
、end
次に、「Web Workers の ECMAScript モジュール」というタイトルのセクション全体にリンクする場合は、 どうすればよいでしょうか。セクションのテキスト全体をパーセントでエンコードすると、URL になります。 非常に長くなります。
幸いなことに、もっと良い方法があります。テキスト全体ではなく、
start,end
構文。そのため、先頭にパーセントでエンコードされた単語をいくつか指定します。
目的のテキストの後に、パーセントでエンコードされた単語を数個で区切って指定します。
カンマ ,
で区切って入力します。
次のようになります。
start
の場合は、ECMAScript%20Modules%20in%20Web%20Workers
の後にカンマ ,
を続けます。
作成者: ES%20Modules%20in%20Web%20Workers.
(end
として)。対応ブラウザをクリックすると
セクション全体が強調表示され、スクロールすると表示されます。
ここで、start
と end
のどちらを選ぶべきか迷うかもしれません。実際には、URL が少し短く、
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=ECMAScript%20Modules,Web%20Workers.
単語が 2 つしかない場合もうまくいくでしょう。start
と end
を
使用します。
さらに一歩進めて、start
と end
の両方に 1 つの単語だけを使用すると、次のようになります。
苦労していることがわかる。URL
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=ECMAScript,Workers.
短くなりましたが、ハイライト表示されたテキスト フラグメントは元々目的のものではなくなりました。「
「Workers.
」という単語が最初に出現したときにハイライト表示が停止します。これは正しいのですが、
取り上げます問題は、目的のセクションが特定のフィールドで一意に識別されないことです。
現在の 1 単語の start
と end
の値:
prefix-
、-suffix
一意のリンクを取得するための解決策の 1 つは、start
と end
に十分な長さの値を使用することです。
ただし、場合によっては不可能なこともあります。ちなみに、私は Google Cloud の
Chrome 80 リリースのブログ投稿を例にとりましょう。その答えは、このリリースの Text Fragment が、
導入されました。
上のスクリーンショットの「text」という単語の4 回出現します。4 回目は
緑色のコード フォントで書かれています。この単語にリンクする場合は、start
にします。
宛先: text
単語「text」は単語が 1 つだけの場合、end
は指定できません。その場合、何をすべきでしょうか。「
URL
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=text
単語 "Text" が最初に出現した箇所に一致します。次の見出しにすでに含まれています。
幸いなことに、解決策があります。このような場合は、prefix-
と -suffix
を指定します。「
緑色のコード フォントの「text」の前にある単語「the」の後に続く単語は「parameter」です。該当なし
他の 3 つの単語「text」が含まれる前後に同じ単語が来ています。これを装備
前の URL を微調整して、prefix-
と -suffix
を追加できます。同じ
パラメータもパーセントでエンコードする必要があり、複数の単語を含めることができます。
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=the-,text,-parameter
。
パーサーが prefix-
と -suffix
を明確に識別できるようにするには、これらを分離する必要があります。
start
とオプションの end
から -
ダッシュを付けます。
完全な構文
テキスト フラグメントの完全な構文を以下に示します。(角かっこは省略可能なパラメータを示します)。
すべてのパラメータの値はパーセントでエンコードする必要があります。特にダッシュボードでは
-
、アンパサンド &
、カンマ ,
文字。これらの文字はテキストの一部として解釈されません。
ディレクティブの構文を使用します。
#:~:text=[prefix-,]start[,end][,-suffix]
prefix-
、start
、end
、-suffix
は、それぞれ 1 つの
ブロックレベルの要素
ただし、完全な start,end
範囲は複数のブロックにまたがることはできます。たとえば
次の例では、:~:text=The quick,lazy dog
は一致に失敗します。これは、最初の
文字列「The Quick」連続する単一のブロックレベルの要素内には出現しません。
<div>
The
<div></div>
quick brown fox
</div>
<div>jumped over the lazy dog</div>
ただし、この例では一致しています。
<div>The quick brown fox</div>
<div>jumped over the lazy dog</div>
ブラウザ拡張機能を使用してテキスト フラグメント URL を作成する
手作業でテキスト フラグメントの URL を作成するのは面倒です(特に、URL が確実に作成されているかを確認する場合) 一意です。どうしても必要な場合は、仕様にヒントや具体的な手順が記載されているので、 テキスト フラグメント URL を生成する手順をご覧ください。 Google が提供するオープンソースのブラウザ拡張機能です。 テキスト フラグメントへのリンク。次のことができます。 任意のテキストへのリンクを選択してから、[選択したテキストにリンクをコピー] をクリックします。コンテキストで 選択します。この拡張機能は、次のブラウザでご利用いただけます。
- Google Chrome のテキスト フラグメントへのリンク
- Microsoft Edge のテキスト フラグメントへのリンク
- Mozilla Firefox 用テキスト フラグメントへのリンク
- Apple Safari のテキスト フラグメントへのリンク
1 つの URL に複数のテキスト フラグメントが含まれている
1 つの URL に複数のテキスト フラグメントが含まれる場合があることにご注意ください。特定のテキスト フラグメントは、
アンパサンド文字 &
で区切ります。3 つのテキスト フラグメントを含むリンクの例を次に示します。
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=Text%20URL%20Fragments&text=text,-parameter&text=:~:text=On%20islands,%20birds%20can%20contribute%20as%20much%20as%2060%25%20of%20a%20cat's%20diet
。
要素フラグメントとテキスト フラグメントの混在
従来の要素フラグメントは、テキスト フラグメントと組み合わせることができます。両方があってもかまいません。
たとえば、ページの元のテキストが続く場合に、意味のある代替テキストとして
一致するテキスト フラグメントがなくなるようにする必要があります。URL
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#HTML1:~:text=Give%20us%20feedback%20in%20our%20Product%20Forums.
[フィードバックをお寄せください] セクションへのリンク
プロダクト フォーラム セクション
要素フラグメント(HTML1
)とテキスト フラグメントの両方が含まれている
(text=Give%20us%20feedback%20in%20our%20Product%20Forums.
):
フラグメント ディレクティブ
この構文には、まだ説明していない要素が 1 つあります。フラグメント ディレクティブ :~:
です。避けるべきこと
既存の URL 要素フラグメントとの互換性の問題がある場合、
テキスト フラグメント仕様にフラグメントが導入されています。
指定します。フラグメント ディレクティブは、URL フラグメントの一部であり、コード シーケンスで区切られます
:~:
。text=
などのユーザー エージェントの手順用に予約されており、URL から削除されます。
直接やり取りできないようにする必要があります。ユーザーエージェントの手順は
ディレクティブとも呼ばれます。したがって、具体例の場合、text=
はテキスト ディレクティブと呼ばれます。
機能検出
サポートを検出するには、document
で読み取り専用の fragmentDirective
プロパティをテストします。フラグメント
ディレクティブは、
ドキュメントをご覧くださいこれは、将来のユーザー エージェントがスクリプトとの直接のやり取りを
既存のコンテンツに互換性を破る変更が加えられることを恐れることなく、指示を追加できます。1 本
今後追加される可能性がある例として、翻訳ヒントがあります。
if ('fragmentDirective' in document) {
// Text Fragments is supported.
}
機能検出は主に、リンクが動的に生成される場合(例: (検索エンジンなど)を使用してテキスト フラグメント リンクをテキスト フラグメントでサポートしていないブラウザには配信しないようにします。
テキスト フラグメントのスタイルを設定する
デフォルトでは、ブラウザによるテキスト フラグメントのスタイル設定方法は、ブラウザでのデフォルトの設定と同じ方法と同じです。
mark
(通常は黄色地に黒色、
CSS のシステムカラー
(mark
の場合)。user-agent スタイルシートには、次のような CSS が含まれています。
:root::target-text {
color: MarkText;
background: Mark;
}
ご覧のとおり、ブラウザには疑似セレクタが表示されます。
::target-text
:
適用されたハイライトをカスタマイズします。たとえば、テキスト フラグメントを黒色に設計できます。
背景にテキストを配置しています。忘れずに
色のコントラストを確認
スタイル設定のオーバーライドによってユーザー補助の問題が発生することがないよう、
目立たせることが重要です
:root::target-text {
color: black;
background-color: red;
}
ポリフィル性
テキスト フラグメント機能は、ある程度のポリフィルが可能です。Google の polyfill: コンテナが内部的に使用されます この拡張機能: 機能が JavaScript で実装されているテキスト フラグメントの組み込みサポートを提供します。
プログラムによるテキスト フラグメント リンクの生成
polyfill にはファイルが含まれる
fragment-generation-utils.js
は、テキスト フラグメントのリンクをインポートして生成するために使用できます。これは、
以下のコードサンプルで概要を示します。
const { generateFragment } = await import('https://unpkg.com/text-fragments-polyfill/dist/fragment-generation-utils.js');
const result = generateFragment(window.getSelection());
if (result.status === 0) {
let url = `${location.origin}${location.pathname}${location.search}`;
const fragment = result.fragment;
const prefix = fragment.prefix ?
`${encodeURIComponent(fragment.prefix)}-,` :
'';
const suffix = fragment.suffix ?
`,-${encodeURIComponent(fragment.suffix)}` :
'';
const start = encodeURIComponent(fragment.textStart);
const end = fragment.textEnd ?
`,${encodeURIComponent(fragment.textEnd)}` :
'';
url += `#:~:text=${prefix}${start}${end}${suffix}`;
console.log(url);
}
分析目的でテキスト フラグメントを取得する
多くのサイトはルーティングにフラグメントを使用しているため、ブラウザではテキスト フラグメントが除去されます。 それらのページが壊れないようにする必要がありますこちらの テキスト フラグメントのリンクをページに公開します。たとえば、分析を目的として、 提案したソリューションはまだ実装されていません 現時点では、回避策として、以下のコードを使用して 提供します。
new URL(performance.getEntries().find(({ type }) => type === 'navigate').name).hash;
セキュリティ
テキスト フラグメント ディレクティブは、
ユーザーのアクティベーション。
さらに、デスティネーションとは異なるオリジンからナビゲーションを開始する場合は、
ナビゲーションを
noopener
コンテキスト(
リンク先ページが十分に分離されていることが確認されます。テキスト フラグメント ディレクティブは、
適用できます。つまり、iframe および iframe 内ではテキストが検索されない
テキスト フラグメントは呼び出されません。
プライバシー
Text Fragments の仕様の実装では、テキストがレンダリングされた場合でも、
フラグメントがページ上で見つかったかどうかを示します。要素のフラグメントは完全に
テキスト フラグメントは誰でも作成できます。上の例で、
Web Workers の ECMAScript モジュールの見出しにリンクする方法はありませんでした。これは、<h1>
が
id
はありませんが、私を含め誰でも簡単に URL を作成することで、どこかに
どうすればよいでしょうか。
たとえば、私が悪意のある広告ネットワーク evil-ads.example.com
を運営していたとします。ある広告で
iframes テキストを使用して、dating.example.com
に非表示のクロスオリジン iframe を動的に作成した
フラグメント URL
dating.example.com#:~:text=Log%20Out
ユーザーが広告を操作したときに記録されます[Log Out](ログアウト)というテキストが検出された場合、その被害者は
dating.example.com
にログインしました。これをユーザー プロファイリングに使用できます。単純なテキストは
フラグメントの実装により、一致が成功するとフォーカス スイッチがオンであると判断される場合があります。
evil-ads.example.com
blur
イベントをリッスンすることで、一致がいつ発生したかを把握できます。イン
Chrome では、上記のシナリオが起こらないような方法でテキスト フラグメントを実装しています。
スクロール位置に基づくネットワーク トラフィックの悪用という攻撃もあります。以下にアクセスできると仮定する:
会社のイントラネットの管理者など、被害者のネットワーク・トラフィック・ログを記録できます。ここで想像してみてください
長文の人事ドキュメント「...に苦しむ人にどう対処すべきか」と、
「燃え尽き症候群」や「不安」などといった状態を考慮して、
選択します。ドキュメントの読み込みが
「燃え尽き症候群」といった項目の横にトラッキング ピクセルが表示されている場合、イントラネット管理者は
従業員が、:~:text=burn%20out
を含むテキスト フラグメント リンクをクリックし、
機密情報とみなされ、誰にも公開されない可能性があります。この例ではやや
そもそも、その脆弱性を悪用するには非常に特定の前提条件を満たす必要があるため、
Chrome セキュリティ チームは、ナビゲーション上のスクロールを実装するリスクを管理しやすくすることのリスクを評価しました。
他のユーザー エージェントは、代わりに手動スクロール UI 要素を表示する場合もあります。
オプトアウトを希望するサイトのために、Chromium では ドキュメント ポリシー ヘッダー値を返します。これにより、ユーザー エージェントはテキスト フラグメント URL を処理できなくなります。
Document-Policy: force-load-at-top
テキスト フラグメントを無効にする
この機能を無効にする最も簡単な方法は、HTTP レスポンスを挿入できる拡張機能を使用することです。 たとえば、 ModHeader (Google プロダクトではなく)を使用して、次のようにレスポンス(リクエストではなく)ヘッダーを挿入します。
Document-Policy: force-load-at-top
さらに複雑なオプトアウト方法は、エンタープライズ設定を使用することです。
ScrollToTextFragmentEnabled
。
macOS の場合は、以下のコマンドをターミナルに貼り付けます。
defaults write com.google.Chrome ScrollToTextFragmentEnabled -bool false
Windows では、 Google Chrome Enterprise ヘルプのサポート サイトをご覧ください。
ウェブ検索のテキスト フラグメント
一部の検索では、検索エンジンがコンテンツ付きのクイック回答または要約を提供する スニペット。これらの強調スニペットは、検索時に表示される可能性が最も高いものです。 質問の形式です。ユーザーが強調スニペットをクリックすると、強調スニペットに直接移動する ソース ウェブページのスニペット テキスト。これは、自動的に作成されたテキスト フラグメント URL によって機能します。
<ph type="x-smartling-placeholder">で確認できます。 <ph type="x-smartling-placeholder">まとめ
Text Fragments URL は、ウェブページ上の任意のテキストにリンクできる強力な機能です。学者 コミュニティはこれを使用して、精度の高い引用や参照リンクを提供できます。検索エンジンは ページのテキスト検索結果にディープリンクを設定しますソーシャル ネットワーク サイトでは、この URL を使ってユーザーが ウェブページの特定部分のスライドを 表示することもできます最初のモジュールは テキスト フラグメント URL を使用する どれも役に立つものだと思います必ずコンテナ イメージに テキスト フラグメントへのリンク ブラウザ あります。
関連リンク
- 仕様ドラフト
- TAG の確認
- Chrome プラットフォームのステータスのエントリ
- Chrome のトラッキング バグ
- Intent to Ship スレッド
- WebKit-Dev スレッド
- Mozilla 標準位置スレッド
謝辞
Text Fragment は、Nick Burris と David Bokan 氏(協力: Grant Wang。Joe Medley に感謝します。 確認します。ヒーロー画像(Greg Rakozy) スプラッシュを解除。