Việc sử dụng `window.location.hash.includes` ném đối tượng không hỗ trợ thuộc tính hoặc phương thức 'bao gồm' 'trong IE11


173

Tôi đang kiểm tra URL để xem nó có chứa hoặc bao gồm một ?trong đó để kiểm soát trạng thái băm pop trong cửa sổ. Tất cả các trình duyệt khác không có vấn đề, chỉ có IE.

Trình gỡ lỗi cho tôi lỗi này khi tôi cố tải theo cách này:

Đối tượng không hỗ trợ thuộc tính hoặc phương thức ' includes'

Tôi không gặp lỗi khi tải trang thông qua popstate.

    $(document).ready(function(e) {
        if(window.location.hash) {
            var hash;
            if(window.location.hash.includes("?")) {
                alert('I have a ?');
                hash = window.location.hash.substring(window.location.hash.indexOf('#') + 0,window.location.hash.indexOf('?'));
            }else {
                hash = window.location.hash;
            };
            if (hash=="#DRS" || hash=="#DRP" || hash=="#DFFI" || hash=="#DCI" || hash=="#DCP" || hash=="#DRP" || hash=="#DRMA" || hash=="#EICS" || hash=="#ORG"){
                $(hash+'Content').addClass('pageOn').removeClass('pageOff');
            }else {
                $('#homeContent').addClass('pageOn').removeClass('pageOff');
            };
        } else {
            $('#homeContent').addClass('pageOn').removeClass('pageOff');
        }
        $(window).on('popstate', function() {
            var hash;
            if(window.location.hash.includes("?")) {
                hash = window.location.hash.substring(window.location.hash.indexOf('#') + 0,window.location.hash.indexOf('?'));
            }else {
                hash = window.location.hash;
            };
            if (hash=="#DRS" || hash=="#DRP" || hash=="#DFFI" || hash=="#DCI" || hash=="#DCP" || hash=="#DRP" || hash=="#DRMA" || hash=="#EICS" || hash=="#ORG"){
                $(this).navigate({target: $(hash+'Content')});
                if(window.location.hash.includes("?")) {
                }else{
                    location.href = location.href+'?';
                }
            }else {
                $(this).navigate({target: $('#homeContent')});
            };
        });
});

Giá trị của window.location.hashtrong internet explorer 11 là gì?
nils

Câu trả lời:


242

Theo trang tham chiếu MDN , includeskhông được hỗ trợ trên Internet Explorer. Cách thay thế đơn giản nhất là sử dụng indexOf, như thế này:

if(window.location.hash.indexOf("?") >= 0) {
    ...
}

1
Bây giờ tôi cũng không thể làm việc này nếu (window.location.hash.indexOf ("?")> = 0) {// không làm gì} khác {location.href = location.href + '?'; }
Erik Grosskurth

Tôi cần thêm một? đến cuối url nếu url chưa có sẵn
Erik Grosskurth

1
Tôi biết đây là một câu hỏi và câu trả lời cũ, nhưng String.prototype.includes dường như đang hoạt động với tôi trên Windows 10 IE 11.
troxwalt

2
@troxwalt Thật tuyệt khi nghe, nhưng nó vẫn không hoạt động trên Windows 7 IE11!
nevada_scout

Nếu bạn là React ing, bạn có thể sử dụng các gói polyfill và tránh thêm thủ công polyfill ...
CPHPython

58

IE11 không triển khai String.prototype.includes vậy tại sao không sử dụng Polyfill chính thức?

  if (!String.prototype.includes) {
    String.prototype.includes = function(search, start) {
      if (typeof start !== 'number') {
        start = 0;
      }

      if (start + search.length > this.length) {
        return false;
      } else {
        return this.indexOf(search, start) !== -1;
      }
    };
  }

Nguồn: nguồn polyfill


1
bạn cũng có thể sử dụng polyfill từ core-js được tìm thấy ở đây: github.com/zloirock/core-js#stage-4-proproals
David Barreto


36

Thêm import 'core-js/es7/array';vào tôi đã polyfill.tskhắc phục vấn đề cho tôi.


Điều này đã được đăng từ lâu nhưng có lẽ điều này có thể giúp ai đó trên các khung mới hơn bằng cách nào đó tuy nhiên tôi nghĩ rằng câu trả lời được chọn sẽ đủ cho bất cứ điều gì bên ngoài các trường hợp sử dụng đặc biệt.
Erik Grosskurth

1
nhập 'core-js / es / mảng'; tính đến năm 2020
timhc22

14

Tôi đã có một vấn đề tương tự với một dự án Angular. Trong polyfills.ts của tôi, tôi đã phải thêm cả hai:

    import "core-js/es7/array";
    import "core-js/es7/object";

Ngoài việc cho phép tất cả các mặc định IE 11 khác. (Xem bình luận trong polyfills.ts nếu sử dụng góc)

Sau khi thêm các lần nhập này, lỗi đã biến mất và dữ liệu Đối tượng của tôi được điền như dự định.


Điều này làm việc cho tôi. Hai nhập khẩu đó làm gì? Và nhập những gì đã sửa lỗi bao gồm? Hoặc cả hai đều cho lỗi bao gồm?
iamjoshua

Vì IE11 không còn nhận được các bản cập nhật tính năng của Microsoft, nên việc triển khai javascript đã có ngày và chỉ hỗ trợ cho các phương thức thông qua ES5. Bằng cách nhập 2 tệp này, bạn đang thêm các tập lệnh polyfill cho Array và Object thông qua ES7 bao gồm phương thức 'bao gồm'.
bshep

5

Như trong Internet Explorer, phương thức javascript "bao gồm" không hỗ trợ dẫn đến lỗi như dưới đây

dijit.form.FilteringSelect TypeError: Object không hỗ trợ thuộc tính hoặc phương thức 'bao gồm'

Vì vậy, tôi đã thay đổi phương thức chuỗi JavaScript từ "bao gồm" thành "indexOf" như bên dưới

//str1 doesn't match str2 w.r.t index, so it will try to add object
var str1="acd", str2="b";
if(str1.indexOf(str2) == -1) 
{
  alert("add object");
}
else 
{
 alert("object not added");
}


1

Tôi đang sử dụng ReactJs và được sử dụng import 'core-js/es6/string';khi bắt đầuindex.js giải quyết vấn đề của mình.

Tôi cũng đang sử dụng import 'react-app-polyfill/ie11';để hỗ trợ chạy React trong IE11.

phản ứng-ứng dụng-polyfill

Gói này bao gồm các polyfill cho các trình duyệt khác nhau. Nó bao gồm các yêu cầu tối thiểu và các tính năng ngôn ngữ thường được sử dụng bởi các dự án Tạo ứng dụng.

https://github.com/facebook/create-react-app/blob/master/packages/react-app-polyfill/README.md


1
Tôi đã bắt đầu tự điền đầy đủ tất cả các chức năng không thành công trong bảng điều khiển IE11 ... Thực sự đánh giá cao câu trả lời tiết kiệm thời gian của bạn. Để thêm những 2 gói cùng một lúc để bạn package.json :npm i --save core-js react-app-polyfill
CPHPython

Btw, core-js/es6dường như không còn tồn tại trong v3, vì vậy, import 'core-js';như được đề xuất trong Github .
CPHPython

0

Câu hỏi này và câu trả lời của nó đã đưa tôi đến giải pháp của riêng tôi (với sự trợ giúp từ SO), mặc dù một số người nói rằng bạn không nên can thiệp vào các nguyên mẫu bản địa:

  // IE does not support .includes() so I'm making my own:
  String.prototype.doesInclude=function(needle){
    return this.substring(needle) != -1;
  }

Sau đó, tôi chỉ cần thay thế tất cả .includes()bằng .doesInclude()và vấn đề của tôi đã được giải quyết.


2
.includes ()hoạt động trên cả chuỗi và mảng. substring()Giải pháp của bạn chỉ hoạt động với chuỗi và thất bại với mảng. Theo trả lời của người khác, sử dụng indexOf()thay vì substring()tốt hơn bởi vì điều này hoạt động trong cả hai trường hợp.
Memet Olsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.