حذف و حذف API در Chrome 49

تقریباً در هر نسخه کروم شاهد تعداد قابل توجهی به روز رسانی و بهبود محصول، عملکرد آن و همچنین قابلیت های پلت فرم وب هستیم.

در Chrome 49 (بتا 2 فوریه 2016. تاریخ پایدار تخمینی: مارس 2016) تعدادی تغییر در Chrome وجود دارد

استفاده از پیشوند "css" در getComputedStyle(e).cssX منسوخ شده است.

TL;DR : استفاده از پیشوند "css" در getComputedStyle(e) منسوخ شده است زیرا بخشی از مشخصات رسمی نبود.

getComputedStyle یک تابع کوچک عالی است. تمام مقادیر CSS سبک های عنصر DOM را همانطور که توسط موتور رندر محاسبه شده است، برمی گرداند. بنابراین، برای مثال، می‌توانید getComputedStyle(_someElement_).height اجرا کنید و ممکن است 224.1px را برگردانید، زیرا این ارتفاع عنصر است که در حال حاضر نمایش داده می‌شود.

به نظر یک API بسیار مفید است. پس چه چیزی را تغییر می دهیم؟

قبل از اینکه موتور رندر کروم به Blink تغییر کند، از WebKit پشتیبانی می‌کرد و به شما اجازه می‌داد تا پیشوند «css» را برای شروع یک ویژگی قرار دهید. برای مثال getComputedStyle(e).cssHeight به جای getComputedStyle(e).height . هر دو همان داده‌هایی را که نگاشت شده‌اند به مقادیر زیرین یکسان برمی‌گردانند، اما این استفاده از پیشوند "css" است که غیراستاندارد است و منسوخ و حذف شده است.

توجه - cssFloat یک ویژگی استاندارد است و تحت تأثیر این منسوخ شدن قرار نمی گیرد.

اگر به یک ویژگی در کروم 49 از این طریق دسترسی داشته باشید، undefined باز می گردد و باید کد خود را اصلاح کنید.

استفاده از initTouchEvent منسوخ شده است

TL;DR : initTouchEvent به نفع constructor TouchEvent منسوخ شده است تا انطباق با مشخصات را بهبود بخشد و به طور کلی در Chrome 54 حذف خواهد شد.

قصد حذف مشکل CRBug ردیاب Chromestatus

برای مدت طولانی می‌توانید با استفاده از initTouchEvent API رویدادهای لمسی مصنوعی را در Chrome ایجاد کنید، اینها اغلب برای شبیه‌سازی رویدادهای لمسی برای آزمایش یا خودکار کردن برخی از رابط‌های کاربری در سایت شما استفاده می‌شوند. در Chrome 49 ما این API را منسوخ کرده‌ایم و اخطار زیر را با هدف حذف کامل آن در Chrome 53 نشان خواهیم داد.

"TouchEvent.initTouchEvent" منسوخ شده است و در M53 در حدود سپتامبر 2016 حذف خواهد شد. لطفاً به جای آن از سازنده TouchEvent استفاده کنید.
"TouchEvent.initTouchEvent" منسوخ شده است و در M53 در حدود سپتامبر 2016 حذف خواهد شد. لطفاً به جای آن از سازنده TouchEvent استفاده کنید. برای جزئیات بیشتر به https://www.chromestatus.com/features/5730982598541312 مراجعه کنید.

چند دلیل وجود دارد که چرا این تغییر خوب است . همچنین در مشخصات Touch Events نیست. پیاده‌سازی Chrome از initTouchEvent به هیچ وجه با API initTouchEvent Safari سازگار نبود و با Firefox در اندروید متفاوت بود. و در نهایت، استفاده از سازنده TouchEvent بسیار ساده تر است.

تصمیم گرفته شد که ما به جای حفظ یک API که نه مشخص است و نه با تنها پیاده سازی دیگر سازگار است، از مشخصات پیروی کنیم. در نتیجه ما ابتدا تابع initTouchEvent را منسوخ و سپس حذف می کنیم و از توسعه دهندگان می خواهیم که از سازنده TouchEvent استفاده کنند.

از این API در وب استفاده می‌شود ، اما می‌دانیم که تعداد نسبتاً کمی از سایت‌ها از آن استفاده می‌کنند، بنابراین ما آن را به سرعت معمول حذف نمی‌کنیم. ما معتقدیم که برخی از استفاده‌ها به دلیل عدم استفاده از نسخه امضای کروم توسط سایت‌ها شکسته شده است.

از آنجایی که پیاده‌سازی‌های iOS و Android/Chrome در initTouchEvent API بسیار متفاوت بودند، اغلب کدهایی در امتداد خطوط (که اغلب فایرفاکس را فراموش می‌کنید) دارید.

    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 قدیمی‌تر در اندروید وجود خواهند داشت که همچنان باید از API قدیمی‌تر پشتیبانی کنید.

برای مدیریت صحیح TouchEvents در وب، باید کد خود را برای پشتیبانی از فایرفاکس، IE Edge، و Chrome با بررسی وجود TouchEvent در شی window و اینکه آیا دارای "طول" مثبت است تغییر دهید (که نشان می دهد سازنده ای است که آرگومان می گیرد. ) باید از آن استفاده کنید.

    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);

کنترل‌کننده‌های خطا و موفقیت در روش‌های RTCPeerConnection مورد نیاز است

TL;DR: متدهای WebRTC RTCPeerConnection createOffer() و createAnswer() اکنون به یک کنترل کننده خطا و همچنین یک کنترل کننده موفقیت نیاز دارند. پیش از این، فراخوانی این روش ها تنها با یک کنترل کننده موفقیت امکان پذیر بود. این استفاده منسوخ شده است.

در Chrome 49، اگر شما setLocalDescription() یا setRemoteDescription() بدون ارائه کنترل کننده خطا فراخوانی کنید، هشداری اضافه کرده ایم. ما انتظار داریم که آرگومان کنترل کننده خطا را برای این روش ها در کروم 50 اجباری کنیم.

این بخشی از باز کردن راه برای معرفی وعده‌ها در این روش‌ها است، همانطور که توسط مشخصات WebRTC مورد نیاز است.

در اینجا یک مثال از نسخه ی نمایشی WebRTC RTCPeerConnection ( main.js، خط 126 ) آورده شده است:

    function onCreateOfferSuccess(desc) {
      pc1.setLocalDescription(desc, function() {
         onSetLocalSuccess(pc1);
      }, onSetSessionDescriptionError);
      pc2.setRemoteDescription(desc, function() {
        onSetRemoteSuccess(pc2);
      }, onSetSessionDescriptionError);
      pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
    }

توجه داشته باشید که هم setLocalDescription() و هم setRemoteDescription() همیشه یک پارامتر کنترل کننده خطا داشتند، بنابراین به سادگی تعیین آن پارامتر یک تغییر مطمئن است.

به طور کلی، برای برنامه‌های WebRTC تولیدی، توصیه می‌کنیم از adapter.js ، یک شیم که توسط پروژه WebRTC نگهداری می‌شود، استفاده کنید تا برنامه‌ها را از تغییرات مشخصات و تفاوت‌های پیشوندها محافظت کند.

Document.defaultCharset منسوخ شده است

TL;DR : Document.defaultCharset برای بهبود انطباق با مشخصات منسوخ شده است.

قصد حذف مشکل CRBug ردیاب Chromestatus

Document.defaultCharset یک ویژگی فقط خواندنی است که رمزگذاری کاراکترهای پیش فرض سیستم کاربر را بر اساس تنظیمات منطقه ای آنها برمی گرداند. به دلیل روشی که مرورگرها از اطلاعات رمزگذاری کاراکتر در پاسخ HTTP یا در متا تگ تعبیه شده در صفحه استفاده می کنند، حفظ این مقدار مفید نیست.

با استفاده از document.characterSet اولین مقدار مشخص شده در هدر HTTP را دریافت خواهید کرد. اگر وجود نداشته باشد، مقدار مشخص شده در ویژگی charset عنصر <meta> را دریافت خواهید کرد (به عنوان مثال، <meta charset="utf-8"> ). در نهایت اگر هیچ یک از آنها در دسترس نباشد document.characterSet تنظیمات سیستم کاربر خواهد بود.

Gecko از این ویژگی پشتیبانی نکرده است و به طور دقیق مشخص نشده است، بنابراین این ویژگی از Blink در Chrome 49 (بتا در ژانویه 2016) منسوخ خواهد شد. تا زمانی که این ویژگی در Chrome 50 حذف نشود، هشدار زیر در کنسول شما ظاهر می شود:

«Document.defaultCharset» منسوخ شده است و در M50، حدود آوریل 2016 حذف خواهد شد.
«Document.defaultCharset» منسوخ شده است و در M50، حدود آوریل 2016 حذف خواهد شد. برای جزئیات بیشتر به https://www.chromestatus.com/features/6217124578066432 مراجعه کنید.

بحث بیشتر در مورد دلیل عدم تعیین این موضوع را می توانید در github بخوانید https://github.com/whatwg/dom/issues/58

getStorageUpdates() حذف شد

TL;DR : Navigator.getStorageUpdates() حذف شده است زیرا دیگر در مشخصات Navigator نیست.

قصد حذف مشکل CRBug ردیاب Chromestatus

اگر این روی کسی تاثیر بگذارد من کلاهم را خواهم خورد. getStorageUpdates() به ندرت (اگر اصلا) در وب استفاده نشده است.

برای نقل قول (نسخه بسیار قدیمی) مشخصات HTML5:

خیلی جالب به نظر می رسد درست است؟ مشخصات حتی از کلمه "whence" استفاده می کند (که به طور اتفاقی تنها نمونه از کجا در مشخصات است). در سطح مشخصات، یک StorageMutex وجود داشت که دسترسی به ذخیره‌سازی مسدودکننده مانند localStorage و کوکی‌ها را کنترل می‌کرد، و این API به آزادسازی آن mutex کمک می‌کرد تا اسکریپت‌های دیگر توسط این StorageMutex مسدود نشوند. اما هرگز پیاده‌سازی نشد، در IE یا Gecko پشتیبانی نمی‌شود، و پیاده‌سازی WebKit (و در نتیجه Blink) بدون عملیات بوده است.

مدت زیادی است که از مشخصات حذف شده است و به طور کامل از Blink حذف شده است (برای طولانی ترین زمان بدون عملیات بوده و حتی در صورت فراخوانی هیچ کاری انجام نمی دهد).

در صورت بعید بودن کدی که به نام navigator.getStorageUpdates() داشتید، باید قبل از فراخوانی تابع، وجود آن را بررسی کنید.

Object.observe () منسوخ شده است

TL;DR : Object.observe() منسوخ شده است زیرا دیگر در مسیر استانداردسازی قرار ندارد و در نسخه بعدی حذف خواهد شد.

قصد حذف مشکل CRBug ردیاب Chromestatus

در نوامبر 2015 اعلام شد که Object.Observe از TC39 خارج شده است . از Chrome 49 منسوخ شده است و اگر بخواهید از آن استفاده کنید، اخطار زیر را در کنسول خواهید دید:

"Object.observe" منسوخ شده است و در M50، حدود آوریل 2016 حذف خواهد شد.
«Object.observe» منسوخ شده است و در M50، حدود آوریل 2016 حذف خواهد شد. برای جزئیات بیشتر به https://www.chromestatus.com/features/6147094632988672 مراجعه کنید.

بسیاری از توسعه دهندگان این API را دوست داشتند و اگر با آن آزمایش کرده اید و اکنون به دنبال یک مسیر انتقال هستید، از یک polyfill مانند MaxArt2501/object-observe یا یک کتابخانه پوششی مانند polymer/observe-js استفاده کنید.