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

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

در کروم ۴۹ (نسخه بتا ۲ فوریه ۲۰۱۶. تاریخ تخمینی انتشار پایدار: مارس ۲۰۱۶) تعدادی تغییر در کروم ایجاد شده است.

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

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

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

به نظر می‌رسد که API کاملاً کاربردی است. خب، قرار است چه چیزی را تغییر دهیم؟

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

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

اگر در کروم ۴۹ به این روش به یک ویژگی دسترسی پیدا کنید، مقدار undefined برمی‌گرداند و باید کد خود را اصلاح کنید.

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

خلاصه : initTouchEvent به نفع constructor TouchEvent منسوخ شده است تا انطباق با مشخصات بهبود یابد و به طور کلی در کروم ۵۴ حذف خواهد شد.

قصد حذف ردیاب وضعیت کروم (Chromestatus Tracker) مشکل CRBug

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

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

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

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

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

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

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

اولاً، این بد است زیرا در User-Agent به دنبال "Android" می‌گردد و کروم در اندروید با آن مطابقت پیدا می‌کند و به این منسوخ شدن می‌رسد. با این حال، هنوز نمی‌توان آن را حذف کرد زیرا مدتی مرورگرهای دیگری مبتنی بر WebKit و Blink قدیمی‌تر در اندروید وجود خواهند داشت که هنوز برای پشتیبانی از API قدیمی‌تر به آنها نیاز خواهید داشت.

برای مدیریت صحیح TouchEvents در وب، باید کد خود را برای پشتیبانی از فایرفاکس، اینترنت اکسپلورر اج و کروم تغییر دهید. برای این کار، وجود 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);

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

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

در کروم ۴۹، اگر setLocalDescription() یا setRemoteDescription() را بدون ارائه یک مدیریت‌کننده خطا فراخوانی کنید، یک هشدار اضافه کرده‌ایم. انتظار داریم آرگومان مدیریت‌کننده خطا برای این متدها در کروم ۵۰ اجباری شود.

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

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

    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 ، یک shim که توسط پروژه WebRTC نگهداری می‌شود، برای محافظت از برنامه‌ها در برابر تغییرات مشخصات و تفاوت‌های پیشوند استفاده کنید.

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

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

قصد حذف ردیاب وضعیت کروم (Chromestatus Tracker) مشکل CRBug

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

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

Gecko از این ویژگی پشتیبانی نمی‌کند و به طور کامل تعریف نشده است، بنابراین این ویژگی از Blink در کروم ۴۹ (نسخه بتا در ژانویه ۲۰۱۶) منسوخ خواهد شد. تا زمان حذف این ویژگی در کروم ۵۰، هشدار زیر در کنسول شما ظاهر می‌شود:

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

بحث بیشتر در مورد استدلال عدم ذکر این مورد را می‌توانید در گیت‌هاب https://github.com/whatwg/dom/issues/58 بخوانید.

تابع getStorageUpdates() حذف شد

خلاصه: تابع Navigator.getStorageUpdates() حذف شده است زیرا دیگر در مشخصات Navigator وجود ندارد.

قصد حذف ردیاب وضعیت کروم (Chromestatus Tracker) مشکل CRBug

اگر این موضوع روی کسی تأثیر بگذارد، من کلاهم را از سر برمی‌دارم. getStorageUpdates() تقریباً هرگز (اگر اصلاً) در وب استفاده نشده است.

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

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

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

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

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

خلاصه: تابع Object.observe() منسوخ شده است زیرا دیگر در مسیر استانداردسازی قرار ندارد و در نسخه‌های آینده حذف خواهد شد.

قصد حذف ردیاب وضعیت کروم (Chromestatus Tracker) مشکل CRBug

در نوامبر ۲۰۱۵ اعلام شد که Object.Observe از TC39 حذف می‌شود . این ویژگی از کروم ۴۹ منسوخ شده است و اگر سعی کنید از آن استفاده کنید، هشدار زیر را در کنسول مشاهده خواهید کرد:

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

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