ข้อผิดพลาด 'No Transport' w / jQuery ajax call ใน IE


110

ฉันจำเป็นต้องใช้ foursquare API เพื่อค้นหาสถานที่ แน่นอนว่าเป็นการข้ามโดเมน

ไม่มีปัญหาใด ๆ ใน Firefox แต่ใน Internet Explorer (7, 8, 9 ฉันได้ทดสอบแล้ว)

รหัสจาวาสคริปต์ของฉันดูเหมือนว่า:

searchVenues: function(searchQuery) {
    $.ajax({
       url: 'https://api.foursquare.com/v2/venues/search',
       data: {
            sw: bound_south_west,
            ne: bound_north_east,
            query: searchQuery.query,
            oauth_token: FSQ_OAUTH_TOKEN,
            limit: 25,
            intent: 'browse',
            v: 20120206
       },
       cache: false,
       dataType: 'json',
       success: function(data) {
           displayResults(data, searchQuery.query);
       },
       error: function(xhr, status, errorThrown) {
           console.log(errorThrown+'\n'+status+'\n'+xhr.statusText);
       }
    });
}

ใน Firefox จะแสดงข้อมูลที่ได้รับอย่างสมบูรณ์แบบ ใน Internet Explorer จะเข้าสู่ระบบคอนโซล:

No Transport
Error
Error

ฉันควรทำอย่างไรดี?


6
ตรวจสอบคำตอบสำหรับโพสต์ SO นี้
mkozicki

คำตอบ:


265

ฉันทดสอบสิ่งนี้บน Windows Mobile 7

หลังจากใช้เวลาทำความเข้าใจมากมายในที่สุดฉันก็พบสิ่งนี้:

http://bugs.jquery.com/ticket/10660

วิธีแก้ปัญหานั้นง่ายเพียงตั้งค่าสิ่งนี้:

$.support.cors = true;

และคำขอข้ามโดเมนของ Ajax จะทำงาน!


47
ฉันได้รับ 'ข้อผิดพลาด: การเข้าถึงถูกปฏิเสธ' เช่นกันใน IE8 และ IE9
Darren Cooney

1
เป็นเรื่องที่น่าท้อใจเล็กน้อยที่คำตอบที่ได้รับการยอมรับไม่สามารถแก้ปัญหาได้จริงบน IE8 หรือ IE9
Warren Rumak

2
ฉันมีปัญหาที่คล้ายกัน ทำงานใน IE10 แต่ไม่ใช่ใน IE8 หรือ IE9
mishka

7
ฉันได้รับ "ข้อผิดพลาด: การเข้าถึงถูกปฏิเสธ" ด้วยความผิดพลาดของฉันคือฉันดึงเนื้อหา HTTPS จากโดเมน HTTP ตรวจสอบให้แน่ใจว่าเว็บไซต์ของคุณและเป้าหมาย ajax ของคุณใช้โปรโตคอลเดียวกัน (HTTP หรือ HTTPS)
Torben

2
ฉันเชื่อว่านี่ถูกตั้งค่าเป็นค่าเริ่มต้นแล้ว สำหรับฉันวิธีแก้ปัญหาคือการส่งคำขอ XDR - ดูคำตอบยอดนิยมนี้: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

$.ajax({
  crossDomain: true,
  url: "",
  type: "POST",
  dataType: "xml",
  data: soapMessage,
});

คุณต้องทำให้ค่าข้ามโดเมนเป็นจริง


8
อะไรคือความแตกต่างระหว่างคำตอบของคุณและคำตอบที่ได้รับการยอมรับซึ่งถูกโพสต์ไว้ก่อนหน้าคุณสักระยะหนึ่ง?
javanna

2
@javanna การเพิ่มของcrossDomain: trueอาร์กิวเมนต์ตัวเลือก
Chris Marasti-Georg

8
ข้ามโดเมนคืออะไรและทำไมจึงต้องเป็นจริง
Aziz Saleh

คุณไม่ต้องการcrossDomain: trueนั่นคือสิ่งที่เป็น$.support.corsค่าเริ่มต้นถ้าฉันไม่เข้าใจผิด
Mark Pieszak - Trilon.io

7

ปัญหานี้รบกวนฉันมาระยะหนึ่งแล้ว เพื่อเป็นการแก้ปัญหาฉันใช้สคริปต์พร็อกซีที่อยู่บนไซต์เดียวกัน สคริปต์ดังกล่าวดำเนินการตามคำขอ HTTP แบบเซิร์ฟเวอร์ต่อเซิร์ฟเวอร์ที่ไม่ใช่ ajax (นึกถึง curl และ WinHttp.WinHttpRequest) และส่งสถานะและข้อมูลกลับไปยังผู้โทร ใช้งานได้ แต่เห็นได้ชัดว่าไม่ค่อยมีประสิทธิภาพเพราะต้องดำเนินการสองคำขอ HTTP

ในกรณีของฉันวิธีแก้ปัญหาคือการรวมกันของทุกสิ่งที่อธิบายไว้ข้างต้นบวกกับส่วนหัว "Access-Control-Allow-Origin"

$.support.cors = true; // this must precede $.ajax({}) configuration

$.ajax({
  crossDomain: true, // added in jQuery 1.5
  headers: {
    'Access-Control-Allow-Origin': '*'
  },
  ...
});

บริการเว็บที่รับสายเหล่านี้ยังตอบสนองด้วยส่วนหัว "Access-Control-Allow-Origin: *"


4
... แต่นี่เป็นคำตอบแรกที่กล่าวถึงส่วนหัว CORS วิธีแก้ปัญหาที่ยอมรับไม่ได้ผลสำหรับฉัน
seanhodges

2
ฉันเดาว่าน่าจะอยู่ใน web.config ของบริการ
Fjodr

6

ลองใช้วิธีนี้:

https://stackoverflow.com/a/14463975/237091

หรือเพียงใส่รหัสนี้ใน HTML ของคุณทันทีหลังจากรวม jquery

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->

ฉันพบปัญหาเดียวกันที่เกิดขึ้นใน Chrome (และอาจเป็นเบราว์เซอร์ Android) บน Android ดังนั้นอาจจะทิ้งความคิดเห็นตามเงื่อนไขเพื่อให้เบราว์เซอร์ทั้งหมดใช้สคริปต์นี้ (หน้าแรกของโครงการอยู่ที่นี่: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt

1
สิ่งนี้ได้ผลสำหรับฉัน นอกเหนือจากการตรวจสอบให้แน่ใจว่าประเภทเนื้อหาตอบกลับเป็น 'ข้อความ / ธรรมดา'
Nikolay Melnikov

ฉันเพิ่มใน Grunt หลังจาก jquery และตอนนี้ใช้งานได้แล้ว ( npmjs.com/package/jquery-ajax-transport-xdomainrequest )
tobias47n9e

0

ฉันเพิ่งเปลี่ยนเวอร์ชัน jquery และแทนที่ลิงก์ CDN และใช้งานได้! เพียงแค่ทำถ้าcrossDomain:trueและ$.support.cors= จริงไม่ได้ผล

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.