การเลิกใช้งานและการนำ API ออกใน Chrome 54

โจ เมดเลย์
โจ้ เมดเลย์

เราเห็นการอัปเดตและการปรับปรุงผลิตภัณฑ์ ประสิทธิภาพการทำงาน และความสามารถของแพลตฟอร์มเว็บใน Chrome เกือบทุกเวอร์ชัน บทความนี้อธิบายการเลิกใช้งานและการนำออกใน Chrome 54 ซึ่งเป็นเวอร์ชันเบต้าตั้งแต่วันที่ 15 กันยายน รายการนี้อาจเปลี่ยนแปลงได้ตลอดเวลา

ปิดใช้การนำทางในตัวแฮนเดิลการยกเลิกการโหลด

TL;DR: ไม่อนุญาตให้ใช้การนำทางแบบข้ามต้นทางทั้งหมดในเครื่องจัดการเหตุการณ์ window.onunload เพื่อนำ Chrome ไปใช้ในหน้าเดียวกับข้อกำหนด HTML เช่นเดียวกับ Firefox และ Safari

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

Chrome เวอร์ชันก่อนหน้าอนุญาตให้การนำทางแบบข้ามต้นทางถูกขัดจังหวะภายใน window.onunload โดยการตั้งค่า window.location.href = '#fragment' ตามข้อกำหนดของ HTML การไปยังส่วนต่างๆ ในหน้าเว็บจะใช้ได้เฉพาะในเครื่องจัดการยกเลิกการโหลดเท่านั้น และใน Chrome เวอร์ชันก่อนหน้า การไปยังส่วนต่างๆ ด้วยวิธีอื่นๆ ได้ถูกบล็อกไว้ตามข้อกำหนด ตั้งแต่ Chrome 54 เป็นต้นไป ระบบจะไม่อนุญาตให้ไปยังส่วนต่างๆ ดังกล่าวเพื่อให้สอดคล้องกับข้อมูลจำเพาะของ Firefox และ Safari

HTTP/0.9 เลิกใช้งานแล้ว

TL;DR: HTTP/0.9 เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ควรเปลี่ยนไปใช้เวอร์ชันที่ใหม่กว่า ซึ่งควรเป็น HTTP/2

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

HTTP/0.9 เป็นเวอร์ชันก่อนหน้าของ HTTP/1.x ขาดคุณสมบัติจากรุ่นต่อมา ข้อกังวลที่เฉพาะเจาะจงสำหรับเว็บไซต์สมัยใหม่คือการไม่มีส่วนหัวการตอบกลับ หากไม่มีคุกกี้ ก็ไม่มีวิธีตรวจสอบว่าการตอบกลับ HTTP/0.9 เป็นการตอบกลับ HTTP/0.9 จริงๆ ซึ่งอาจก่อให้เกิดปัญหาหลายอย่าง ตัวอย่างเช่น

  • ไคลเอ็นต์ที่ถือว่าการตอบกลับข้อผิดพลาดบางอย่างเป็นการตอบกลับ HTTP/0.9 ที่ถูกต้อง
  • เซิร์ฟเวอร์ที่ไม่สามารถปิดซ็อกเก็ตคำขอ ทำให้ไคลเอ็นต์ดำเนินการกับการตอบกลับเป็นแบบ GET ที่แขวนไว้ ซึ่งจะคงอยู่ตลอดไปหรือจนกว่าผู้ใช้จะออกจากหน้าเว็บที่ส่งคำขอ
  • เซิร์ฟเวอร์ที่ไม่สามารถระบุให้เบราว์เซอร์ทราบว่าคำขอล้มเหลว ซึ่งอาจทำให้เกิดปัญหาในการแคชวิธีการ

วิธีเดียวที่ป้องกันได้ในการแก้ปัญหาเกี่ยวกับ HTTP/0.9 คือการยกเลิกการรองรับทั้งหมด ด้วยเหตุนี้ Chrome 54 จึงไม่มีการรองรับ HTTP/0.9

นำการใช้ initTouchEvent ออกแล้ว

TL;DR: initTouchEvent เลิกใช้งานแล้วเพื่อเปลี่ยนไปใช้ TouchEvent constructor เพื่อปรับปรุงการปฏิบัติตามข้อกำหนดและจะถูกนำออกทั้งหมดใน Chrome 54

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

นักพัฒนาซอฟต์แวร์สามารถสร้างเหตุการณ์การแตะแบบสังเคราะห์ใน Chrome โดยใช้ initTouchEvent API มานานแล้ว ซึ่งมักจะใช้ในการจำลองเหตุการณ์การสัมผัสเพื่อการทดสอบหรือการทำให้ UI บางอย่างในเว็บไซต์ทำงานโดยอัตโนมัติ ตั้งแต่ Chrome 49 เป็นต้นไป API ที่เลิกใช้งานแล้วนี้ได้แสดง คำเตือน ต่อไปนี้

คำเตือนเหตุการณ์การแตะ
TouchEvent.initTouchEvent เลิกใช้งานแล้วและจะถูกนำออกใน M53 ประมาณเดือนกันยายน 2016 โปรดใช้ตัวสร้าง TouchEvent แทน ดูรายละเอียดเพิ่มเติมได้ที่ https://www.chromestatus.com/features/5730982598541312

นอกจากที่ไม่ตรงกับข้อกำหนดของเหตุการณ์การแตะแล้ว ก็ยังมีเหตุผลอีกมากมายที่การเปลี่ยนแปลงนี้เป็นผลดี การใช้งาน Chrome initTouchEvent เข้ากันไม่ได้กับ initTouchEvent API ของ Safari เลย และแตกต่างจาก Firefox ใน Android และสุดท้าย เครื่องมือสร้าง TouchEvent นั้นใช้งานง่ายมาก

ด้วยเหตุนี้ เราจึงตัดสินใจที่จะปฏิบัติตามข้อกำหนดมากกว่าที่จะคง API ที่ไม่มีการระบุหรือไม่เข้ากันกับการใช้งานแบบอื่นๆ เพียงอย่างเดียว นักพัฒนาซอฟต์แวร์ที่ต้องการทางเลือกควรใช้ตัวสร้าง TouchEvent

เนื่องจากการใช้งาน API initTouchEvent ใน iOS และ Android/Chrome แตกต่างกันอย่างมาก เว็บไซต์ต่างๆ จึงมักมีโค้ดอยู่ตามบรรทัด (มักลืม Firefox)

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

วิธีนี้แย่เพราะดูเหมือนว่าจะมีคำว่า "Android" ใน User-Agent และ Chrome ใน Android จะตรงกันและทำตามการเลิกใช้งานนี้ อย่างไรก็ตาม ยังนำออกไม่ได้เพราะยังมีเบราว์เซอร์อื่นๆ ที่ใช้ WebKit และเบราว์เซอร์ Blink รุ่นเก่าบน Android อีกระยะหนึ่งซึ่งคุณยังคงต้องรองรับ API รุ่นเก่าอยู่

ในการจัดการ TouchEvent บนเว็บอย่างถูกต้อง คุณควรเปลี่ยนโค้ดให้รองรับ Firefox, IE Edge และ Chrome โดยตรวจหาการมีอยู่ของ TouchEvent ในออบเจ็กต์ window และมี "length" เป็นบวก (ระบุว่าเป็นเครื่องมือสร้างที่ใช้อาร์กิวเมนต์) คุณควรใช้โค้ดนั้น

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

นำแอตทริบิวต์ KeyboardEvent.keyIdentifier ออกแล้ว

TL;DR: เรากำลังนำพร็อพเพอร์ตี้ keyboardEvent.keyIdentifier ที่รองรับส่วนน้อยออกเพื่อเปลี่ยนไปใช้พร็อพเพอร์ตี้ KeyboardEvent.key ที่อิงตามมาตรฐาน

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

แอตทริบิวต์ keyboardEvent.keyIdentifier เป็นสั้นๆ ในข้อกำหนด W3C ในปี 2009 และ 2010 อย่างไรก็ตาม โค้ดนี้มีการใช้งานเฉพาะใน WebKit เท่านั้น

นักพัฒนาแอปที่ต้องการแทนที่แอตทริบิวต์นี้จะใช้พร็อพเพอร์ตี้ KeyboardEvent.key ตามมาตรฐานหรือพร็อพเพอร์ตี้ KeyboardEvent.code ก็ได้ (ตามที่อธิบายไว้ในบทความที่เราทำในฤดูใบไม้ผลิที่ผ่านมา) เบราว์เซอร์แรกมีฐานผู้ใช้งานกว้างที่สุด โดยเบราว์เซอร์หลักในเดสก์ท็อปทั้งหมดรองรับ ยกเว้น Safari ปัจจุบัน Chrome, Firefox และ Opera รองรับรุ่นที่ใหม่กว่า การนำฟีเจอร์นี้ออกมีวัตถุประสงค์เพื่อกระตุ้นการใช้พร็อพเพอร์ตี้ KeyboardEvent.key Apple ไม่มีคำอธิบายว่าจะสามารถรองรับการอัปเดตนี้หรือไม่ อย่างไรก็ตาม คุณสมบัติที่เลิกใช้แล้ว (แต่ยังไม่ได้นำออกจาก Chrome) KeyboardEvent.keyCode และ KeyboardEvent.charCode ยังคงมีให้บริการบน Safari

นำเหตุการณ์และแอตทริบิวต์ที่สิ้นสุดของ MediaStream ออก รวมถึงแอตทริบิวต์ปลายทาง

TL;DR: เรากำลังนำเหตุการณ์และแอตทริบิวต์ ended รวมถึงเครื่องจัดการเหตุการณ์ onended ออกเนื่องจากถูกนำออกจากข้อกำหนดของการจับภาพและสตรีมสื่อแล้ว

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

ทั้งเหตุการณ์ ended และเครื่องจัดการเหตุการณ์ onended ไม่ได้อยู่ในข้อกำหนด WebRTC มาเป็นเวลาประมาณ 3 ปีแล้ว นักพัฒนาแอปที่ต้องการดูกิจกรรมควรใช้ MediaStreamTracks แทน MediaStreams

เลิกใช้งาน SVGSVGElement.viewPort

การใช้งานไม่ทำงานใน Chrome มาตั้งแต่ปี 2012 แอตทริบิวต์นี้ไม่มีในเบราว์เซอร์อื่นๆ เลย และถูกลบออกจากข้อกำหนด ด้วยเหตุนี้เราจึงเลิกใช้งานพร็อพเพอร์ตี้ดังกล่าว คาดว่าจะนำออกได้ใน Chrome 55

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

เลิกใช้งาน SVGViewElement.viewTarget

แอตทริบิวต์ SVGViewElement.viewTarget ไม่ได้เป็นส่วนหนึ่งของข้อกำหนด SVG2.0 และการใช้งานมีขนาดเล็กหรือไม่มีอยู่จริง แอตทริบิวต์นี้เลิกใช้งานแล้วใน Chrome 54 คาดว่าจะนำออกได้ใน Chrome 56

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium

นำ SVGZoomEvent ออก

SVGZoomEvent ไม่ได้เป็นส่วนหนึ่งของข้อกำหนดเฉพาะ SVG2.0 และไม่ทำงานใน Chromium อย่างไรก็ตาม ฟีเจอร์ดังกล่าวยังคงตรวจพบอยู่ ซึ่งก่อให้เกิดความสับสนจากนักพัฒนาแอป ระบบจะนำออก

เจตนาเพื่อนำออก | ตัวติดตาม Chromestatus | ข้อบกพร่อง Chromium