ส่วนข้อความช่วยให้คุณระบุตัวอย่างข้อความในส่วนย่อย URL ได้ เมื่อไปยัง URL ที่มีส่วนย่อยของข้อความดังกล่าว เบราว์เซอร์จะเน้นและดึงดูดความสนใจของผู้ใช้ได้
ตัวระบุส่วนย่อย
Chrome 80 เป็นรุ่นที่มีการเปลี่ยนแปลงครั้งใหญ่ ซึ่งมีฟีเจอร์ที่หลายคนตั้งตารอ เช่น โมดูล ECMAScript ใน Web Worker, Nullish Coalescing, Optional Chaining และอื่นๆ โดยปกติแล้ว การเปิดตัวจะประกาศผ่านบล็อกโพสต์ในบล็อก Chromium คุณดูข้อความที่ตัดตอนมาจากบล็อกโพสต์ได้ในภาพหน้าจอต่อไปนี้
idคุณอาจกำลังสงสัยว่ากล่องสีแดงทั้งหมดหมายถึงอะไร ซึ่งเป็นผลลัพธ์ของการเรียกใช้ข้อมูลโค้ดต่อไปนี้ในเครื่องมือสำหรับนักพัฒนาเว็บ โดยจะไฮไลต์องค์ประกอบทั้งหมดที่มีแอตทริบิวต์ id
document.querySelectorAll('[id]').forEach((el) => {
el.style.border = 'solid 2px red';
});
ฉันสามารถวาง Deep Link ไปยังองค์ประกอบที่ไฮไลต์ด้วยกล่องสีแดงได้ด้วยตัวระบุส่วนย่อย ซึ่งฉันจะใช้ในแฮชของ URL ของหน้าเว็บ สมมติว่าฉันต้องการทำ Deep Link ไปยังช่องแสดงความคิดเห็นในฟอรัมผลิตภัณฑ์ในส่วนด้านข้าง ฉันสามารถทำได้โดยการสร้าง URL https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#HTML1 ด้วยตนเอง
ดังที่คุณเห็นในแผงองค์ประกอบของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ องค์ประกอบที่เป็นปัญหาจะมีแอตทริบิวต์ id ที่มีค่า HTML1
id ขององค์ประกอบหากฉันแยกวิเคราะห์ URL นี้ด้วยคอนสตรัคเตอร์ URL() ของ JavaScript ระบบจะแสดงคอมโพเนนต์ต่างๆ
สังเกตพร็อพเพอร์ตี้ 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 Modules in Web Workers ดังที่คุณเห็นในภาพหน้าจอต่อไปนี้ <h1> ที่เป็นปัญหาไม่มีแอตทริบิวต์ id ซึ่งหมายความว่าฉันไม่สามารถลิงก์ไปยังส่วนหัวนี้ได้ ซึ่งนี่คือปัญหาที่ Text Fragments แก้ไขได้
idText Fragments
ข้อเสนอส่วนย่อยของข้อความเพิ่มการรองรับการระบุตัวอย่างข้อความในแฮช URL เมื่อไปยัง URL ที่มีส่วนข้อความดังกล่าว User Agent จะเน้นและดึงดูดความสนใจของผู้ใช้ได้
ความเข้ากันได้กับเบราว์เซอร์
ด้วยเหตุผลด้านความปลอดภัย ฟีเจอร์นี้กำหนดให้ต้องเปิดลิงก์ในบริบท noopener
ดังนั้น โปรดตรวจสอบว่าได้รวม rel="noopener" ไว้ในมาร์กอัป Anchor <a> หรือเพิ่ม noopener ลงในรายการฟีเจอร์ฟังก์ชันการทำงานของหน้าต่าง Window.open()
start
รูปแบบที่ง่ายที่สุดของไวยากรณ์ Text Fragment คือสัญลักษณ์แฮช # ตามด้วย :~:text= และสุดท้ายคือ start ซึ่งแสดงถึงข้อความที่เข้ารหัสเปอร์เซ็นต์ที่ฉันต้องการลิงก์ไป
#:~:text=start
ตัวอย่างเช่น สมมติว่าฉันต้องการลิงก์ไปยังส่วนหัว ECMAScript Modules in Web Workers ในบล็อกโพสต์ที่ประกาศฟีเจอร์ใน Chrome 80 URL ในกรณีนี้จะเป็นดังนี้
ระบบจะเน้นข้อความที่ตัดตอนมาในลักษณะนี้ หากคุณคลิกลิงก์ในเบราว์เซอร์ที่รองรับ เช่น Chrome ระบบจะไฮไลต์ Fragment ข้อความและเลื่อนไปที่มุมมอง
start และ end
แล้วถ้าฉันต้องการลิงก์ไปยังส่วนทั้งหมดที่มีชื่อว่า ECMAScript Modules in Web Workers ไม่ใช่แค่ส่วนหัวล่ะ การเข้ารหัสเปอร์เซ็นต์ข้อความทั้งหมดของส่วนจะทำให้ URL ที่ได้ยาวเกินไปจนใช้งานไม่ได้
โชคดีที่มีวิธีที่ดีกว่า ฉันสามารถตีกรอบส่วนที่เฉพาะเจาะจงของข้อความด้วยไวยากรณ์ start,end แทนที่จะเป็นข้อความทั้งหมด ฉันระบุคำที่เข้ารหัสเปอร์เซ็นต์ 2-3 คำที่จุดเริ่มต้นของส่วนข้อความ และคำที่เข้ารหัสเปอร์เซ็นต์ 2-3 คำที่ส่วนท้ายของส่วนข้อความ โดยคั่นด้วยคอมมา
ซึ่งจะมีลักษณะดังนี้
สำหรับ start ฉันมี ECMAScript%20Modules%20in%20Web%20Workers ตามด้วยคอมมา และตามด้วย ES%20Modules%20in%20Web%20Workers. เป็น end เมื่อคุณคลิกผ่านในเบราว์เซอร์ที่รองรับ เช่น Chrome ระบบจะไฮไลต์ทั้งส่วนและเลื่อนให้เห็น
คุณอาจสงสัยว่าทำไมฉันจึงเลือก 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 คุณจะเห็นว่าเรากำลังประสบปัญหา URL
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=ECMAScript,Workers.
สั้นลงไปอีก แต่ส่วนข้อความที่ไฮไลต์ไม่ใช่ส่วนที่เลือกไว้แต่แรกแล้ว การไฮไลต์จะหยุดที่คำว่า Workers. คำแรก ซึ่งถูกต้อง แต่ไม่ใช่สิ่งที่ฉันตั้งใจจะไฮไลต์ ปัญหาคือส่วนที่เลือกไม่ได้ระบุไว้อย่างไม่ซ้ำกันด้วยค่า start และ end แบบคำเดียวในปัจจุบัน
prefix- และ -suffix
การใช้ค่าที่ยาวพอสำหรับ start และ end เป็นวิธีหนึ่งในการรับลิงก์ที่ไม่ซ้ำกัน
อย่างไรก็ตาม ในบางสถานการณ์อาจทำเช่นนี้ไม่ได้ ขออธิบายเพิ่มเติมว่าทำไมฉันจึงเลือกบล็อกโพสต์เกี่ยวกับการเปิดตัว Chrome 80 เป็นตัวอย่าง คำตอบคือในรุ่นนี้มีการเปิดตัว Text Fragments
โปรดสังเกตว่าในภาพหน้าจอด้านบน คำว่า "text" ปรากฏ 4 ครั้ง รายการที่ 4 เขียนด้วยแบบอักษรโค้ดสีเขียว หากต้องการลิงก์ไปยังคำนี้โดยเฉพาะ ฉันจะตั้งค่า start เป็น text เนื่องจากคำว่า "text" มีเพียงคำเดียว จึงไม่มี end ฉันควรทำอย่างไรต่อไป URL
https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=text
ตรงกับคำว่า "Text" ที่ปรากฏครั้งแรกในส่วนหัวแล้ว
แต่โชคดีที่มีวิธีแก้ไข ในกรณีเช่นนี้ ฉันสามารถระบุ prefix- และ -suffix ได้ คำที่อยู่ก่อน "text" ซึ่งเป็นแบบอักษรโค้ดสีเขียวคือ "the" และคำที่อยู่หลังคือ "parameter" คำว่า "text" อีก 3 คำที่เหลือไม่มีคำที่อยู่รอบๆ เหมือนกัน เมื่อทราบข้อมูลนี้แล้ว ฉันสามารถปรับแต่ง URL ก่อนหน้าและเพิ่ม prefix- และ -suffix ได้ พารามิเตอร์เหล่านี้ต้องเข้ารหัสเป็นเปอร์เซ็นต์และมีคำได้มากกว่า 1 คำเช่นเดียวกับพารามิเตอร์อื่นๆ
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 แต่ละรายการจะจับคู่ได้เฉพาะข้อความภายในองค์ประกอบระดับบล็อกเดียว แต่ช่วง 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 Chrome
- Link to Text Fragment สำหรับ Microsoft Edge
- Link to Text Fragment สำหรับ Mozilla Firefox
- ลิงก์ไปยังส่วนข้อความสำหรับ Apple Safari
ข้อความหลายส่วนใน URL เดียว
โปรดทราบว่าข้อความที่แยกส่วนหลายรายการอาจปรากฏใน 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
การผสมผสานองค์ประกอบและส่วนย่อยของข้อความ
คุณสามารถรวม Fragment ขององค์ประกอบแบบดั้งเดิมเข้ากับ Fragment ของข้อความได้ คุณสามารถใช้ทั้ง 2 อย่างใน URL เดียวกันได้ เช่น เพื่อให้มีตัวเลือกสำรองที่มีความหมายในกรณีที่ข้อความต้นฉบับในหน้าเว็บมีการเปลี่ยนแปลง เพื่อให้ส่วนข้อความไม่ตรงกันอีกต่อไป 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.) ดังนี้
คำสั่ง Fragment
มีองค์ประกอบหนึ่งของไวยากรณ์ที่ฉันยังไม่ได้อธิบาย นั่นคือคำสั่ง Fragment :~: เพื่อหลีกเลี่ยงปัญหาความเข้ากันได้กับส่วนย่อยขององค์ประกอบ URL ที่มีอยู่ตามที่แสดง ข้อกำหนดเฉพาะของส่วนย่อยข้อความจะแนะนำคำสั่งส่วนย่อย คำสั่งส่วนย่อยคือส่วนหนึ่งของส่วนย่อย URL ที่คั่นด้วยลำดับโค้ด :~: โดยสงวนไว้สำหรับคำสั่ง User Agent เช่น text= และจะถูกตัดออกจาก URL ระหว่างการโหลดเพื่อให้สคริปต์ของผู้เขียนไม่สามารถโต้ตอบกับสคริปต์ดังกล่าวได้โดยตรง คำสั่ง User Agent เรียกอีกอย่างว่าคำสั่ง ในกรณีที่เป็นรูปธรรม text= จึงเรียกว่าคำสั่งข้อความ
การตรวจจับฟีเจอร์
หากต้องการตรวจหาการรองรับ ให้ทดสอบพร็อพเพอร์ตี้ fragmentDirective แบบอ่านอย่างเดียวใน document คำสั่ง Fragment เป็นกลไกสำหรับ URL ในการระบุคำสั่งที่ส่งไปยังเบราว์เซอร์แทนที่จะเป็นเอกสาร ซึ่งมีไว้เพื่อหลีกเลี่ยงการโต้ตอบโดยตรงกับสคริปต์ของผู้เขียน เพื่อให้สามารถเพิ่มวิธีการของ User Agent ในอนาคตได้โดยไม่ต้องกังวลว่าจะทำให้เกิดการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบในเนื้อหาที่มีอยู่ ตัวอย่างหนึ่งที่เป็นไปได้ของการเพิ่มในอนาคตดังกล่าวคือคำแนะนำในการแปล
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;
}
Polyfill
ฟีเจอร์ Text Fragments สามารถทำ Polyfill ได้ในระดับหนึ่ง เรามี Polyfill ซึ่งส่วนขยายใช้ภายในสำหรับเบราว์เซอร์ที่ไม่ได้ให้การสนับสนุนในตัวสำหรับส่วนย่อยของข้อความที่มีการใช้ฟังก์ชันการทำงานใน JavaScript
การสร้างลิงก์ Text Fragment แบบเป็นโปรแกรม
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);
}
การรับส่วนข้อความเพื่อวัตถุประสงค์ด้านการวิเคราะห์
เว็บไซต์จำนวนมากใช้ Fragment สำหรับการกำหนดเส้นทาง ซึ่งเป็นสาเหตุที่เบราว์เซอร์ตัด Text Fragment ออกเพื่อไม่ให้หน้าเว็บเหล่านั้นเสียหาย มีความจำเป็นที่รับทราบแล้วในการแสดงลิงก์ส่วนย่อยของข้อความไปยังหน้าเว็บ เช่น เพื่อวัตถุประสงค์ด้านการวิเคราะห์ แต่โซลูชันที่เสนอยังไม่ได้นำไปใช้ วิธีแก้ปัญหาชั่วคราวในตอนนี้คือคุณสามารถใช้โค้ดต่อไปนี้เพื่อดึงข้อมูลได้
new URL(performance.getEntries().find(({ type }) => type === 'navigate').name).hash;
ความปลอดภัย
ระบบจะเรียกใช้คำสั่งส่วนข้อความเฉพาะในการนำทางแบบเต็ม (ไม่ใช่หน้าเดียวกัน) ซึ่งเป็นผลมาจากการเปิดใช้งานของผู้ใช้
นอกจากนี้ การนําทางที่มาจากต้นทางที่ต่างจากปลายทางต้องมีการนําทางเกิดขึ้นในบริบท noopener เพื่อให้ทราบว่าหน้าปลายทางมีการแยกอย่างเพียงพอ คำสั่งส่วนย่อยของข้อความจะใช้กับเฟรมหลักเท่านั้น ซึ่งหมายความว่าระบบจะไม่ค้นหาข้อความภายใน iframe และการไปยังส่วนต่างๆ ของ iframe จะไม่เรียกใช้ส่วนข้อความ
ความเป็นส่วนตัว
สิ่งสำคัญคือการใช้ข้อกำหนดของส่วนข้อความต้องไม่เปิดเผยว่าพบส่วนข้อความในหน้าเว็บหรือไม่ แม้ว่าส่วนย่อยขององค์ประกอบจะอยู่ภายใต้การควบคุมของผู้เขียนหน้าเว็บต้นฉบับอย่างสมบูรณ์ แต่ทุกคนก็สามารถสร้างส่วนย่อยของข้อความได้ จำได้ไหมว่าในตัวอย่างของฉันไม่มีวิธีลิงก์ไปยังส่วนหัว ECMAScript Modules in Web Workers เนื่องจาก <h1> ไม่มี id แต่ทุกคนรวมถึงฉันสามารถลิงก์ไปยังที่ใดก็ได้โดยการสร้างส่วนข้อความอย่างระมัดระวัง
สมมติว่าฉันเปิดเครือข่ายโฆษณาที่เป็นอันตราย evil-ads.example.com ลองจินตนาการต่อไปว่าใน iframe โฆษณาอันหนึ่ง ฉันได้สร้าง iframe แบบข้ามต้นทางที่ซ่อนอยู่ไปยัง dating.example.com แบบไดนามิกด้วย URL ส่วนย่อยของข้อความ dating.example.com#:~:text=Log%20Out เมื่อผู้ใช้โต้ตอบกับโฆษณา หากพบข้อความ "ออกจากระบบ" ฉันจะทราบว่าเหยื่อเข้าสู่ระบบ dating.example.com อยู่ ซึ่งฉันสามารถใช้เพื่อสร้างโปรไฟล์ผู้ใช้ได้ เนื่องจากการใช้งาน Text Fragments แบบง่ายๆ อาจตัดสินว่าการจับคู่ที่สำเร็จควรทำให้เกิดการเปลี่ยนโฟกัส ใน evil-ads.example.com ฉันจึงสามารถฟังเหตุการณ์ blur เพื่อให้ทราบเมื่อมีการจับคู่เกิดขึ้น ใน Chrome เราได้ใช้ส่วนย่อยของข้อความในลักษณะที่สถานการณ์ดังกล่าวไม่สามารถเกิดขึ้นได้
การโจมตีอีกรูปแบบหนึ่งอาจเป็นการใช้ประโยชน์จากการจราจรของข้อมูลในเครือข่ายตามตำแหน่งการเลื่อน สมมติว่าฉันมีสิทธิ์เข้าถึงบันทึกการจราจรของข้อมูลในเครือข่ายของเหยื่อ เช่น ในฐานะผู้ดูแลระบบอินทราเน็ตของบริษัท ทีนี้ลองนึกภาพว่ามีเอกสารทรัพยากรบุคคลที่ยาวมากชื่อสิ่งที่ต้องทำหากคุณประสบกับ... แล้วตามด้วยรายการอาการต่างๆ เช่น ภาวะหมดไฟ ความวิตกกังวล เป็นต้น ฉันสามารถวางพิกเซลการติดตามไว้ข้างแต่ละรายการในลิสต์ได้ หากฉันระบุว่าการโหลดเอกสารเกิดขึ้นพร้อมกับการโหลดพิกเซลการติดตามข้างรายการหมดไฟ ฉันในฐานะผู้ดูแลระบบอินทราเน็ตจะระบุได้ว่าพนักงานคลิกลิงก์ส่วนข้อความที่มี :~:text=burn%20out ซึ่งพนักงานอาจคิดว่าเป็นความลับและไม่มีใครเห็น เนื่องจากตัวอย่างนี้ค่อนข้างจะสร้างขึ้นมาตั้งแต่แรก และเนื่องจากการใช้ประโยชน์จากตัวอย่างนี้ต้องเป็นไปตามเงื่อนไขเบื้องต้นที่เฉพาะเจาะจงมาก ทีมความปลอดภัยของ Chrome จึงประเมินความเสี่ยงของการใช้การเลื่อนในการนำทางว่าจัดการได้
User Agent อื่นๆ อาจเลือกแสดงองค์ประกอบ UI การเลื่อนด้วยตนเองแทน
สำหรับเว็บไซต์ที่ต้องการเลือกไม่ใช้ Chromium รองรับค่าส่วนหัวนโยบายเอกสารที่เว็บไซต์สามารถส่งได้ เพื่อให้ User Agent ไม่ประมวลผล 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
ส่วนข้อความในการค้นเว็บ
สำหรับการค้นหาบางรายการ เครื่องมือค้นหาของ Google จะแสดงคำตอบหรือสรุปสั้นๆ พร้อมตัวอย่างเนื้อหาจากเว็บไซต์ที่เกี่ยวข้อง ตัวอย่างข้อมูลแนะนำเหล่านี้มีแนวโน้มที่จะปรากฏขึ้นมากที่สุดเมื่อการค้นหาอยู่ในรูปแบบของคำถาม การคลิกตัวอย่างข้อมูลแนะนำจะนำผู้ใช้ไปยังข้อความตัวอย่างข้อมูลแนะนำในหน้าเว็บต้นฉบับโดยตรง ซึ่งทำได้ด้วย URL ของส่วนย่อยของข้อความที่สร้างขึ้นโดยอัตโนมัติ
บทสรุป
URL ของส่วนย่อยของข้อความเป็นฟีเจอร์ที่มีประสิทธิภาพในการลิงก์ไปยังข้อความที่กำหนดเองในหน้าเว็บ ชุมชนนักวิชาการสามารถใช้ฟีเจอร์นี้เพื่อระบุลิงก์ที่อ้างอิงหรือข้อมูลอ้างอิงที่มีความแม่นยำสูง เครื่องมือค้นหาจะใช้แอตทริบิวต์นี้เพื่อทำ Deep Link ไปยังผลการค้นหาที่เป็นข้อความในหน้าเว็บได้ เว็บไซต์โซเชียลเน็ตเวิร์กสามารถใช้ API นี้เพื่อให้ผู้ใช้แชร์ข้อความที่เฉพาะเจาะจงของหน้าเว็บแทนภาพหน้าจอที่เข้าถึงไม่ได้ เราหวังว่าคุณจะเริ่มใช้ URL ของส่วนย่อยของข้อความและพบว่ามีประโยชน์เช่นเดียวกับเรา อย่าลืมติดตั้งส่วนขยายเบราว์เซอร์ลิงก์ไปยังส่วนย่อยของข้อความ
ลิงก์ที่เกี่ยวข้อง
- Spec draft
- การตรวจสอบ TAG
- รายการสถานะแพลตฟอร์ม Chrome
- ข้อบกพร่องในการติดตามของ Chrome
- Intent to Ship thread
- ชุดข้อความ WebKit-Dev
- ชุดข้อความเกี่ยวกับจุดยืนด้านมาตรฐานของ Mozilla
การรับทราบ
Text Fragments ได้รับการติดตั้งใช้งานและระบุโดย Nick Burris และ David Bokan โดยได้รับความช่วยเหลือจาก Grant Wang ขอขอบคุณ Joe Medley ที่ช่วยตรวจสอบเอกสารนี้อย่างละเอียด