5

Tôi đang phát triển một ứng dụng web với AngularJS. Tôi đã có một lỗi xuất hiện từ hư không, nó đã làm việc tốt và tôi thực sự không biết tại sao nó không hoạt động nữa.Loại không bắt buộcLỗi: Không thể đặt thuộc tính offsetWidth # <HTMLElement> chỉ có một bộ thu hẹp

Vì vậy, nó chỉ thị, tôi cố gắng đặt thuộc tính offsetWidth của một phần tử trong mẫu html chỉ thị. Vì tôi thực sự không biết nó có thể đến từ đâu, tôi sẽ cung cấp cho bạn mã đầy đủ của chỉ thị và mẫu của tôi. Chỉ thị này tạo ra một nút ứng dụng và xử lý hiệu ứng hình ảnh của nó khi nhấp chuột. Đó là dòng $element[0].offsetWidth = $element[0].offsetWidth; gây ra lỗi. (Đó là mẹo để khởi động lại hoạt ảnh)

Tôi lặp lại, mã này hoạt động tốt và tôi gần như chắc chắn rằng tôi không thực hiện bất kỳ thay đổi nào. Tôi đang sử dụng Chrome để gỡ lỗi, có thể nó đến từ nó?

Lỗi: Uncaught TypeError: Cannot set property offsetWidth of #<HTMLElement> which has only a getter

Chỉ thị:

'use strict'; 

XVMApp.directive('appButton', ['$location', function($location){ 
    return { 
     restrict: 'E', 
     replace: true, 
     scope: { 
      img: '@', 
      fillPercent: '@?', 
      target: '@?' 
     }, 
     link: function ($scope, $element) { 

      // Image percentage fill button 
      if($scope.fillPercent === undefined) $scope.fillPercent = '100'; 

      // Click event 
      $element.on('click', function() { 

       // Url target 
       if($scope.target !== undefined){ 
        $scope.$apply(function() { 
         $location.path($scope.target); 
        }); 
       } 

       // Click effect 
       $element[0].preventDefault; 
       $element[0].classList.remove('app-button-click-effect'); 
       $element[0].offsetWidth = $element[0].offsetWidth; 
       $element[0].classList.add('app-button-click-effect'); 

      }); 

     }, 
     templateUrl: 'src/directive/appButton/app-button.html' 
    }; 
}]); 

mẫu:

<div class="app-button" 
    style="background-size: {{fillPercent}}%; "> 
     <div style=" 
      background-image: url('src/assets/img/{{img}}'); 
      background-repeat: no-repeat; 
      background-position: center; 
      background-size: {{fillPercent}}%; 
      height: 100%; 
      width: 100%; "> 
     </div> 
</div> 
+0

Nếu tôi chỉ nhận được giá trị bù đắpWidth, mẹo hoạt ảnh khởi động lại vẫn hoạt động ($ element [0] .offsetWidth;), do đó, sự cố của tôi đã được khắc phục. Nhưng tôi vẫn tự hỏi tại sao tôi không thể thiết lập một giá trị để bù đắp tài sảnWidth? – sylvain1264

Trả lời

6

Tôi đoán bạn vừa cập nhật Chrome 43. Tôi chỉ gặp phải những vấn đề tương tự. Có vẻ như phiên bản mới nhất xử lý các nút dom giống như các lớp js chuẩn hơn, và bất kỳ thuộc tính nào được đọc chỉ sẽ hiện ra một lỗi js. Đặt offsetWidth sẽ không bao giờ hoạt động vì nó là thuộc tính chỉ đọc, nhưng trước đây Chrome sẽ chỉ lặng lẽ bỏ qua nó, trong khi bây giờ nếu bạn đang sử dụng chế độ nghiêm ngặt, nó sẽ ném lỗi này. Xem ở đây để biết chi tiết: http://updates.html5rocks.com/2015/04/DOM-attributes-now-on-the-prototype

0

Nếu trong trường hợp sử dụng của bạn ném một băng cá nhân tạm thời sẽ được chấp nhận, bạn có thể chỉ ngăn chặn được thông báo lỗi bằng cách sử dụng kỹ thuật mô tả tiếp theo:

Trong bất kỳ tập tin .js trong thư viện , tìm kiếm "use strict" và nhận xét dòng có dòng này. Ví dụ, trong file jquery-1.9.1.js trên dòng 39, có một dòng đó là:

"use strict"; 

tôi đã làm cho nó

//"use strict"; 

Tôi đã làm điều này ở khắp mọi nơi tôi thấy "use strict";

Sửa:

Việc ẩn lỗi đơn giản sẽ không thực sự khắc phục sự cố và cũng có thể ẩn các sự cố bổ sung. Như đã đề cập trong một câu trả lời khác, kể từ Chrome 43, lỗi sẽ được nâng lên nếu bạn cố gắng ghi vào các thuộc tính DOM chỉ đọc bất kể bạn có đang sử dụng rõ ràng "sử dụng nghiêm ngặt" trong mã của mình hay không. Tóm lại, không ghi vào các thuộc tính DOM chỉ đọc ...

+5

Nếu bạn xóa "sử dụng nghiêm ngặt", bạn ẩn các lỗi thay vì sửa chúng, tôi nghĩ rằng đó là thực hành xấu. – sylvain1264

5

Theo this answer bạn chỉ cần truy cập thuộc tính để kích hoạt reflow.
Vì vậy, đây sẽ là đủ để thiết lập lại hình ảnh động của bạn:

$element[0].classList.remove('app-button-click-effect'); 
$element[0].offsetWidth; 
$element[0].classList.add('app-button-click-effect'); 

tôi đã thực hiện kiểm tra nhanh trên crom và firefox và cả công trình.

Các vấn đề liên quan