ใช้“ window.location.hash.includes” พ่น“ วัตถุไม่สนับสนุนคุณสมบัติหรือวิธีการ” รวม '” ใน IE11


173

ฉันกำลังตรวจสอบ URL เพื่อดูว่ามีหรือรวม?อยู่ในนั้นหรือไม่เพื่อควบคุมสถานะป๊อปแฮชในหน้าต่าง เบราว์เซอร์อื่น ๆ ทั้งหมดไม่มีปัญหามีเพียง IE เท่านั้น

ตัวดีบักให้ข้อผิดพลาดนี้แก่ฉันเมื่อฉันพยายามโหลดด้วยวิธีนี้:

วัตถุไม่สนับสนุนคุณสมบัติหรือวิธีการ ' includes'

ฉันไม่มีข้อผิดพลาดเมื่อฉันโหลดหน้าเว็บผ่าน 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')});
            };
        });
});

ค่าของคืออะไรwindow.location.hashใน Internet Explorer 11?
nils

คำตอบ:


242

ตามที่หน้าอ้างอิง MDN , includesไม่ได้รับการสนับสนุนบน Internet Explorer ทางเลือกที่ง่ายที่สุดคือใช้indexOfเช่นนี้:

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

1
ตกลงดีตอนนี้ฉันไม่สามารถทำงานได้ถ้า (window.location.hash.indexOf ("?")> = 0) {// ไม่ต้องทำอะไรเลย} อื่น {location.href = location.href + '?'; }
Erik Grosskurth

ฉันต้องการเพิ่มหรือไม่ ถึงจุดสิ้นสุดของ url ถ้า url ยังไม่มีอยู่
Erik Grosskurth

1
ฉันรู้ว่านี่เป็นคำถามและคำตอบเก่า แต่ดูเหมือนว่า String.prototype.includes จะทำงานให้ฉันบน Windows 10 IE 11
troxwalt

2
@troxwalt ยินดีที่ได้ฟัง แต่ก็ยังไม่สามารถใช้งานได้กับ Windows 7 IE11!
nevada_scout

หากคุณเป็นReact ing คุณสามารถใช้แพ็คเกจ polyfillและหลีกเลี่ยงการเพิ่ม polyfills ด้วยตนเอง ...
CPHPython

58

IE11 ใช้งาน String.prototype.includes ดังนั้นทำไมไม่ใช้ Polyfill อย่างเป็นทางการ?

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

ที่มา: แหล่ง polyfill


1
คุณสามารถใช้ polyfill จาก core-js ได้ที่นี่: github.com/zloirock/core-js#stage-4-proposals
David Barreto

@DavidBarreto แน่นอน! และตอบสนองคำตอบเมื่อเร็ว ๆ นี้ได้รับการเพิ่มที่นี่
CPHPython

36

การเพิ่มimport 'core-js/es7/array';การpolyfill.tsแก้ไขปัญหาให้ฉัน


โพสต์นี้ถูกโพสต์เมื่อนานมาแล้ว แต่บางทีนี่อาจช่วยใครบางคนในกรอบงานที่ใหม่กว่าอย่างไรก็ตามฉันคิดว่าคำตอบที่เลือกควรเพียงพอสำหรับทุกอย่างนอกเหนือจากกรณีการใช้งานพิเศษ
Erik Grosskurth

1
นำเข้า 'core-js / es / array'; ตั้งแต่ปี 2020
timhc22

14

ฉันมีปัญหาคล้ายกันกับโครงการเชิงมุม ใน polyfills.ts ของฉันฉันต้องเพิ่มทั้งสอง:

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

นอกเหนือจากการเปิดใช้งานค่าเริ่มต้น IE 11 อื่น ๆ ทั้งหมดแล้ว (ดูความคิดเห็นใน polyfills.ts หากใช้เชิงมุม)

หลังจากเพิ่มการนำเข้าเหล่านี้แล้วข้อผิดพลาดก็หายไปและข้อมูลวัตถุของฉันเติมตามที่ต้องการ


สิ่งนี้ใช้ได้กับฉัน การนำเข้าทั้งสองนั้นทำหน้าที่อะไรกันแน่ และสิ่งที่นำเข้าแก้ไขข้อผิดพลาดรวมถึง? หรือ em ทั้งสองมีข้อผิดพลาดรวม?
iamjoshua

เนื่องจาก IE11 ไม่ได้รับการอัปเดตคุณลักษณะโดย Microsoft อีกต่อไปการใช้งานจาวาสคริปต์จึงเป็นวันที่และมีการสนับสนุนเฉพาะวิธีการที่ผ่าน ES5 เท่านั้น โดยการนำเข้าไฟล์ 2 ไฟล์นี้คุณกำลังเพิ่มสคริปต์ polyfill สำหรับ Array และ Object thru ES7 ซึ่งรวมถึงวิธีการ 'รวม'
bsheps

5

เช่นเดียวกับใน Internet Explorer วิธีการจาวาสคริปต์ "รวมถึง" ไม่รองรับซึ่งนำไปสู่ข้อผิดพลาดดังต่อไปนี้

dijit.form.FilteringSelect TypeError: วัตถุไม่รองรับคุณสมบัติหรือเมธอด 'include'

ดังนั้นฉันจึงเปลี่ยนวิธีการสตริง JavaScript จาก "include" เป็น "indexOf" ดังนี้

//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

ฉันใช้ ReactJs และใช้import 'core-js/es6/string';ตอนเริ่มต้นindex.jsเพื่อแก้ไขปัญหาของฉัน

ฉันยังใช้import 'react-app-polyfill/ie11';เพื่อรองรับการเรียกใช้ React ใน IE11

ตอบสนองแอป-polyfill

แพ็คเกจนี้ประกอบด้วย polyfills สำหรับเบราว์เซอร์ต่างๆ มันมีข้อกำหนดขั้นต่ำและคุณสมบัติภาษาที่ใช้กันทั่วไปที่ใช้โดยโครงการสร้างแอป React

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


1
ฉันเริ่ม polyfilling ด้วยตนเองทุกฟังก์ชั่นที่ล้มเหลวในคอนโซล IE11 ด้วยตนเอง ... ขอขอบคุณคำตอบประหยัดเวลาของคุณจริงๆ ในการเพิ่ม 2 แพ็คเกจเหล่านี้พร้อมกันในpackage.jsonของคุณ:npm i --save core-js react-app-polyfill
CPHPython

Btw, core-js/es6ดูเหมือนว่าจะไม่อยู่อีกต่อไปใน v3 ดังนั้นเพียงแค่import 'core-js';เป็นข้อเสนอแนะใน Github
CPHPython

0

คำถามและคำตอบนี้นำฉันไปสู่โซลูชันของฉันเอง (ด้วยความช่วยเหลือจาก SO) แต่บางคนบอกว่าคุณไม่ควรยุ่งเกี่ยวกับต้นแบบพื้นเมือง:

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

จากนั้นฉันก็แทนที่ทั้งหมด.includes()ด้วย.doesInclude()และปัญหาของฉันได้รับการแก้ไข


2
.includes ()ทำงานได้ทั้งสายและอาร์เรย์ substring()โซลูชันของคุณทำงานกับสตริงและล้มเหลวกับอาร์เรย์เท่านั้น ตามคำตอบของคนอื่นการใช้indexOf()แทนที่จะsubstring()ดีกว่าเพราะวิธีนี้ใช้ได้ทั้งสองกรณี
Memet Olsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.