การจัดระเบียบการค้นหาบนหน้าเว็บใน JavaScript (ไม่มี jQuery) การค้นหาหน้า JavaScript การค้นหาหน้า HTML

อัปเดตคำตอบ:

ตอนแรกฉันไม่เข้าใจว่าคุณต้องการเรียกหน้าเว็บที่คุณไม่ได้ควบคุม แล้วใช้ JavaScript ในเบราว์เซอร์เพื่อโต้ตอบกับหน้าเว็บนั้น

ข้อมูลในคำตอบเดิมด้านล่างยังคงเกี่ยวข้อง แต่คำถามคือ: ฉันจะทำให้โค้ดทำงานในบริบทที่ถูกต้องได้อย่างไร และคำตอบ: มีอย่างน้อยสองวิธี:

    เบราว์เซอร์ที่เหมาะสมในปัจจุบันมีเครื่องมือแก้ไขจุดบกพร่องในตัว ดูที่เมนูสำหรับพวกเขา แต่ในเบราว์เซอร์จำนวนมากพวกเขาสามารถเข้าถึงได้ผ่านทางปุ่ม F12 หรือ Ctrl + Shift + I ในเครื่องมือเหล่านี้คุณจะพบ "คอนโซล" ที่คุณสามารถป้อน JavaScript และให้มันทำงานในบริบทของหน้า คุณกำลังดูอยู่

    นี่เป็นวิธีที่ดีสำหรับการทำสิ่งต่างๆ แบบโต้ตอบ แต่การทำซ้ำทุกครั้งอาจเป็นเรื่องยาก คุณยังสามารถใส่โค้ดลงในไฟล์ในเครื่องได้ (เช่น /home/tjc/foo.js) จากนั้นเมื่อคุณไปที่เพจ ให้ใช้คอนโซลเพื่อเพิ่มสคริปต์นั้นลงในเพจ (ซึ่งจะทำให้สคริปต์ถูกเรียกใช้งานใน บริบทของหน้า) ตัวอย่างเช่น:

    Document.documentElement.appendChild(document.createElement("script")).src = "file:///home/tjc/foo.js";

    เมื่อสคริปต์ของคุณทำสิ่งที่คุณต้องการแล้ว คุณสามารถเปลี่ยนให้เป็น bookmarklet ได้ นี่คือบุ๊กมาร์กของเบราว์เซอร์ที่ใช้ javascript: Scheme แทนที่จะเป็น http: ฯลฯ ตามปกติ ดูลิงค์สำหรับรายละเอียด คุณจะต้องมีเครื่องมือที่จะรับโค้ด JavaScript ของคุณและทำการเข้ารหัส URL ที่จำเป็นสำหรับคุณ เช่น Bookmarklet Crunchinator หรือที่คล้ายกัน

คำตอบเดิม:

ดังนั้นมันจะค้นหาข้อความหรือรับองค์ประกอบตาม id/class...

นี่เป็นคำถามสามข้อที่แตกต่างกันมาก:

    หากต้องการค้นหาข้อความบนหน้า คุณมีหลายตัวเลือก:

    • หากคุณต้องการค้นหาข้อความแต่ไม่สนใจว่าองค์ประกอบใดมีอยู่ คุณสามารถดูที่ innerHTML บน document.body innerHTML - สตริง; เมื่อคุณเข้าถึง เบราว์เซอร์จะสร้างสตริง HTML สำหรับองค์ประกอบ DOM ทั้งหมดในองค์ประกอบที่คุณเรียกใช้ (และองค์ประกอบที่สืบทอด) โปรดทราบว่านี่ไม่ใช่เนื้อหาต้นฉบับจากเซิร์ฟเวอร์ สิ่งนี้ถูกสร้างขึ้นทันทีเมื่อมีการเข้าถึงองค์ประกอบ สำหรับกรณีการใช้งานหลายๆ กรณี การได้รับสตริงนี้แล้วลองดูอาจมีประโยชน์ได้ โปรดทราบว่าข้อความที่คุณกำลังดูอยู่นั้นเป็นมาร์กอัป ตัวอย่างเช่น หากคุณค้นหาคำว่า "ตาราง" คุณอาจพบข้อความนั้นในประโยค ("เรานั่งลงที่โต๊ะ") หรือในมาร์กอัป (

      ...).

      นี่คือตัวอย่างการนับคำว่า ฉัน บนหน้าเว็บโดยใช้ innerHTML: live copy

      (function() ( var pageText = document.body.innerHTML; display("จำนวน "I\"m" บนเพจ: " + pageText.match(/I"m/g).length); function display(msg ) ( var p = document.createElement("p"); p.innerHTML = String(msg); document.body.appendChild(p); ) ))();

      หากคุณต้องการทราบว่าองค์ประกอบใดอยู่ในองค์ประกอบใด คุณจะต้องเขียนฟังก์ชันแบบเรียกซ้ำที่ผ่านโหนดของหน้า และสำหรับ Text ให้ดูที่ข้อความภายใน นี่คือตัวอย่างพื้นฐาน (ฟังก์ชันคือฟังก์ชันการเดิน): Live Copy | - ดูหมายเหตุเกี่ยวกับตัวอย่างในตอนท้าย

      (function() ( varmatch = , index; walk(matches, document.body, ""); function walk(matches, node, path) ( var child; switch (node.nodeType) ( กรณีที่ 1: // องค์ประกอบสำหรับ (child = node.firstChild; child; child = child.nextSibling) ( walk(matches, child, path + "/" + node.tagName); ) แบ่ง; กรณีที่ 3: // ข้อความ if (node.nodeValue.indexOf( "I"m") !== -1) (matchs.push("Found it at " + path); ) break; ) ) display("Matches found (" +matches.length + "):"); สำหรับ (ดัชนี = 0; ดัชนี< matches.length; ++index) { display(matches); } function display(msg) { var p = document.createElement("p"); p.innerHTML = String(msg); document.body.appendChild(p); } })();

      หากต้องการค้นหาองค์ประกอบบนรหัสหน้าให้ใช้

    • jQuery
    • เมื่อสองสามวันก่อน ฉันได้รับงานทดสอบจากบริษัทเกี่ยวกับตำแหน่งงานว่างของ Front-end dev แน่นอนว่างานนี้ประกอบด้วยหลายจุด แต่ตอนนี้เราจะพูดถึงเพียงเรื่องเดียวเท่านั้น - การจัดระเบียบการค้นหาหน้า เหล่านั้น. การค้นหาซ้ำๆ โดยใช้ข้อความที่ป้อนในช่อง (คล้ายกับ Ctrl+F ในเบราว์เซอร์) ลักษณะเฉพาะของงานคือห้ามใช้เฟรมเวิร์ก JS หรือไลบรารีใด ๆ ทุกอย่างเขียนด้วย JavaScript ดั้งเดิม

      กำลังค้นหาวิธีแก้ปัญหาสำเร็จรูป ความคิดแรก: มีคนเขียนสิ่งนี้ไว้แล้ว คุณต้อง google และคัดลอกและวาง ฉันก็เลยทำ ภายในหนึ่งชั่วโมง ฉันพบสคริปต์ดีๆ สองบทที่ทำงานในลักษณะเดียวกัน แต่เขียนต่างกัน ฉันเลือกอันที่มีโค้ดที่ฉันเข้าใจดีกว่าและวางลงในหน้าแรกของฉัน

      ถ้าใครสนใจก็เอาโค้ดไปนะครับ

      สคริปต์ทำงานได้ทันที ฉันคิดว่าปัญหาได้รับการแก้ไขแล้ว แต่เมื่อปรากฏว่าผู้เขียนบทไม่มีความผิด มีข้อบกพร่องใหญ่หลวงอยู่ สคริปต์ค้นหาเนื้อหาทั้งหมดของแท็ก... และอย่างที่คุณคงเดาได้ เมื่อค้นหาชุดอักขระใดๆ ที่คล้ายกับแท็กหรือคุณลักษณะ หน้า HTML ทั้งหมดอาจเสียหาย

      เหตุใดสคริปต์จึงทำงานไม่ถูกต้อง มันง่ายมาก สคริปต์ทำงานดังนี้ ขั้นแรก เราเขียนเนื้อหาทั้งหมดของแท็ก body ลงในตัวแปร จากนั้นเราค้นหารายการที่ตรงกันด้วยนิพจน์ทั่วไป (ตั้งค่าโดยผู้ใช้เมื่อป้อนลงในช่องข้อความ) จากนั้นเราจะแทนที่รายการที่ตรงกันทั้งหมดด้วยโค้ดต่อไปนี้:

      ...พบรายการที่ตรงกัน...
      จากนั้นเราจะแทนที่แท็กเนื้อหาปัจจุบันด้วยแท็กใหม่ที่ได้รับ มาร์กอัปได้รับการอัปเดต สไตล์เปลี่ยนไป และผลลัพธ์ที่พบทั้งหมดจะถูกไฮไลต์เป็นสีเหลืองบนหน้าจอ

      คุณอาจเข้าใจแล้วว่าปัญหาคืออะไร แต่ฉันยังคงอธิบายรายละเอียดเพิ่มเติมต่อไป ลองนึกภาพว่าคุณป้อนคำว่า "div" ลงในช่องค้นหา อย่างที่คุณสามารถจินตนาการได้ มีแท็กอื่นๆ มากมายภายในเนื้อหา รวมถึง div ด้วย และหากเราใช้สไตล์ที่ระบุไว้ข้างต้นกับ "div" ทั้งหมด มันจะไม่เป็นบล็อกอีกต่อไป แต่เป็นสิ่งที่เข้าใจยากเนื่องจากการออกแบบพัง ด้วยเหตุนี้ หลังจากเขียนมาร์กอัปใหม่แล้ว เราจะพบว่าหน้าเว็บเสียหายโดยสิ้นเชิง มีลักษณะเช่นนี้

      อย่างที่คุณเห็นหน้าพังไปหมด กล่าวโดยสรุป สคริปต์กลายเป็นว่าใช้งานไม่ได้ และฉันตัดสินใจเขียนเองตั้งแต่ต้น ซึ่งเป็นจุดประสงค์ของบทความนี้

      ดังนั้นเราจึงเขียนสคริปต์ตั้งแต่เริ่มต้น นี่คือสิ่งที่ทุกอย่างมองหาสำหรับฉัน

      ตอนนี้เราสนใจแบบฟอร์มการค้นหา ฉันวงกลมด้วยเส้นสีแดง

      ลองคิดดูหน่อย ฉันใช้งานมันดังต่อไปนี้ (HTML ล้วนๆ ในตอนนี้) รูปแบบที่มีสามแท็ก

      อันแรกใช้สำหรับป้อนข้อความ
      ประการที่สองคือการยกเลิกการค้นหา (ยกเลิกการเลือก)
      ประการที่สามคือการค้นหา (เน้นผลลัพธ์ที่พบ)


      ดังนั้นเราจึงมีช่องป้อนข้อมูลและปุ่ม 2 ปุ่ม ฉันจะเขียน JavaScript ในไฟล์ js.js สมมติว่าคุณได้สร้างและเชื่อมต่อแล้ว

      สิ่งแรกที่เราจะทำคือจดบันทึกการเรียกใช้ฟังก์ชันเมื่อคลิกปุ่มค้นหาและปุ่มยกเลิก มันจะมีลักษณะเช่นนี้:


      ให้ฉันอธิบายเล็กน้อยว่านี่คืออะไรและทำไมจึงจำเป็น

      สำหรับช่องข้อความเราให้ id="text-to-find" ( การใช้รหัสนี้เราจะเข้าถึงองค์ประกอบจาก js).

      เราให้ปุ่มยกเลิกคุณลักษณะต่อไปนี้: type="button" onclick="javascript: FindOnPage("text-to-find",false); กลับเท็จ;"

      - ประเภท: ปุ่ม
      - เมื่อคลิกแล้ว ฟังก์ชัน FindOnPage("text-to-find",false) จะถูกเรียก และส่งรหัสของช่องข้อความเป็นเท็จ

      เราให้คุณสมบัติต่อไปนี้แก่ปุ่มค้นหา: type="button" onclick="javascript: FindOnPage("text-to-find",true); กลับเท็จ;"

      - ประเภท: send (ไม่ใช่ปุ่ม เนื่องจากคุณสามารถใช้ Enter หลังจากป้อนข้อมูลในช่องแล้ว แต่คุณสามารถใช้ปุ่มก็ได้)
      - เมื่อคลิกแล้ว ฟังก์ชัน FindOnPage("text-to-find",true) จะถูกเรียก และส่งรหัสของช่องข้อความเป็นจริง

      คุณอาจสังเกตเห็นคุณลักษณะอีกอย่างหนึ่ง: ถูกผิด- เราจะใช้เพื่อพิจารณาว่าปุ่มใดถูกคลิกปุ่ม (ยกเลิกการค้นหาหรือเริ่มการค้นหา) หากเราคลิกยกเลิก เราจะผ่าน false หากเราคลิกค้นหา เราจะผ่าน true

      โอเค เรามาต่อกันดีกว่า มาดู JavaScript กันดีกว่า เราจะถือว่าคุณได้สร้างและเชื่อมต่อไฟล์ js กับ DOM แล้ว

      ก่อนที่เราจะเริ่มเขียนโค้ด เรามาย้อนกลับไปคุยกันก่อนว่าสิ่งต่างๆ ควรทำงานอย่างไร เหล่านั้น. โดยพื้นฐานแล้วเราจะเขียนแผนปฏิบัติการ ดังนั้นเราจึงจำเป็นต้องค้นหาหน้าเมื่อป้อนข้อความลงในฟิลด์ แต่ไม่สามารถแตะแท็กและแอตทริบิวต์ได้ เหล่านั้น. เฉพาะวัตถุข้อความเท่านั้น วิธีบรรลุเป้าหมายนี้ - ฉันแน่ใจว่ามีหลายวิธี แต่ตอนนี้เราจะใช้นิพจน์ทั่วไป

      ดังนั้นนิพจน์ทั่วไปต่อไปนี้จะค้นหาเฉพาะข้อความต่อไปนี้เท่านั้น ชอบ: ">... ข้อความ...... ข้อความ...

      มีคำถามหรือไม่?

      แจ้งการพิมพ์ผิด

      ข้อความที่จะส่งถึงบรรณาธิการของเรา: