Permintaan jQuery Ajax dibatalkan tanpa dikirim

87

Saya mencoba menghubungkan skrip ke aplikasi Microsoft World-Wide Telescope. Yang terakhir mendengarkan pada port 5050 untuk perintah. Ini berjalan pada mesin yang sama dengan browser (Chrome sekarang, tapi sejauh yang saya tahu perilakunya sama dengan Firefox 7 dan IE 9).

Saya mengirim header "Access-Control-Allow-Origin: *" dengan file html asli untuk mencoba menghilangkan batasan XSS sebagai masalah saya.

Kode saya untuk mengakses WWT adalah sebagai berikut:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

url dalam hal ini adalah "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." (jelas ... adalah singkatan di sini untuk beberapa parameter tambahan).

Melihat diagnostik jaringan di Chrome, saya dapat melihat ini:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

Permintaan akan keluar - Saya melihat WWT membuat layer baru. Namun, saya tidak mendapatkan panggilan balik. Jika saya menambahkan callback error yang dipanggil, tetapi properti error pada objek jqXHR hanya "error" dan statusnya 0. Jika saya melihat permintaan jaringan di Chrome, saya melihat "(dibatalkan)" sebagai status dan tidak ada respons .

Jika saya mengambil URL yang sama dan menempelkannya di tab browser baru, saya dapat melihat bahwa tanggapannya adalah XML yang diharapkan.

Tentu saja, perbedaannya di sini adalah bahwa ini adalah GET bukan POST, tetapi saya sudah mencobanya di skrip saya dan tidak ada bedanya.

Saya cukup bingung dengan ini dan akan menghargai ide-ide segar.

Graham Wheeler
sumber
Sudahkah Anda mencoba menangani errorpanggilan balik untuk melihat apakah itu kembali dengan kesalahan?
StriplingWarrior
1
"Saya mengirim tajuk" Access-Control-Allow-Origin: * "dengan file html asli untuk mencoba menghilangkan pembatasan XSS sebagai masalah saya." Apakah maksud Anda server mengirim kembali header Access-Control-Origin? Atau Anda mengirimkannya bersama dengan permintaan Ajax?
Jason Dean
coba akses halaman secara langsung melalui url dan lihat apakah Anda mendapatkan hasil
zod
1
Ya, saya mendapatkan panggilan balik kesalahan dengan teks status "" dan kode 0. Ini bukan masalah jQuery; Saya menulis ulang kode menggunakan XHR langsung dan saya mendapatkan hasil yang sama - yaitu readyState 4 dengan request.status nol dan request.responseText kosong. Header Access-Control-Allow-Origin sedang dikirim oleh server. Mengakses halaman secara langsung melalui URL akan mengembalikan respons XML yang diharapkan.
Graham Wheeler

Jawaban:

134

Jika ada orang lain yang mengalami ini, masalah yang kami hadapi adalah kami membuat permintaan ajax dari sebuah tautan, dan tidak mencegah tautan untuk diikuti. Jadi jika Anda melakukan ini dalam sebuah onclickatribut, pastikan return false;juga.

Kazetsukai
sumber
Ini berhasil juga untuk saya. Terima kasih. Saya lupa mengapa saya mengembalikan false di onClick handler saya, dan mengubahnya menjadi true, dan setelah membaca postingan Anda, saya tiba-tiba sadar.
Shiprack
4
Selain itu, jika Anda menggunakan formulir, Anda perlu menambahkan atribut return falsedi akhir Anda onsubmit.
Jason Axelson
8
@VincentClyde "return false;"memberi tahu formulir dan tautan untuk membatalkan tindakan. Ini awalnya dimaksudkan untuk validasi formulir javascript, di mana fungsi validasi akan mengembalikan false jika formulir tidak valid, menghentikan formulir untuk dikirim.
Tyzoid
13
Anda juga dapat menggunakan e.preventDefault();, di mana eadalah onclickparameter event.
Hannele
1
@Hannele Terima kasih banyak telah berbagi event.preventDefault. Aku sangat membutuhkannya. Saya tidak melihat jawaban lain yang menyarankan hal ini. Anda harus memposting ini sebagai jawaban terpisah.
Mohit
112

Jika Anda menggunakan Chrome, Anda tidak dapat melihat informasi yang cukup di panel jaringan Chrome standar untuk menentukan akar penyebab (canceled)permintaan.

Anda perlu menggunakan chrome://net-internals/#eventsyang akan menunjukkan kepada Anda detail mengerikan dari permintaan yang Anda kirim - termasuk pengalihan tersembunyi / informasi keamanan tentang cookie yang dikirim, dll.

misalnya, berikut ini menunjukkan pengalihan yang tidak saya lihat di jejak jaringan - karena cookie saya tidak dikirim lintas sub-domain:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)
Ben Walding
sumber
Saya juga punya masalah (dibatalkan). @Ben, asik mengetahui jejak ini, sayangnya tidak memberikan info apapun. Server dalam kasus saya adalah S3 dan cors dikonfigurasikan di bucket saya. Yang saya lakukan hanyalah GET sederhana untuk sebuah gambar. Saya melihat di panel jaringan permintaan dengan header Origin, tetapi tidak ada tanggapan. Rupanya Chrome membatalkan permintaan sebelum mengirimkannya ke server. Tanpa pengalihan, tanpa https, tanpa konten-panjang 0. Membenturkan kepala sepanjang hari, masih menjadi misteri.
Gene Vayngrib
@GeneVayngrib Coba Firefox - debugger jaringan akan langsung menampilkan lebih banyak informasi - Anda mungkin dapat menyelesaikan masalah di sana dan membuatnya berfungsi di Chrome.
Ben Walding
@BenW terima kasih, tetapi Firefox tidak memiliki masalah dengan gambar yang disajikan dari Amazon S3 ini.
Gene Vayngrib
YUPP. Itu sangat membantu!
rubmz
23

Dalam kasus saya, saya mengalami type='submit'jadi ketika saya mengirimkan formulir, halaman memuat ulang sebelum ajax hit berjalan sehingga solusi sederhana adalah memilikinya type="button". Jika Anda tidak menentukan jenisnya, itu submitsecara default jadi Anda harus menentukantype="button"

type='submit' => type='button'

ATAU

Tidak ada tipe => type='button'

Mamba hitam
sumber
3
necro posting di sini, tuntut saya stackoverflow. Saya telah mencari tinggi dan rendah sepanjang hari mengapa permintaan saya berfungsi dari konsol tetapi bukan skrip, dan ini adalah jawabannya .. terima kasih !!!
pcort
1
Saya masuk dan menemukan utas ini lagi untuk memberi suara positif pada jawaban ini !!, ini sangat membantu. memecah kepalaku selama berjam
dev
Jai shree krishna, semoga bisa membantu banyak orang untuk datang. Dan mereka tahu sebelumnya.
Black Mamba
1
Bro, saya pikir Anda adalah dewa 😍😍
cosmicsage
6

Saya punya masalah serupa. Dalam kasus saya, saya mencoba menggunakan layanan web pada server apache + django (layanan ini ditulis sendiri). Saya memiliki hasil yang sama seperti Anda: Chrome mengatakan itu dibatalkan sementara FF melakukannya dengan baik. Jika saya mencoba mengakses layanan secara langsung di browser alih-alih ajax, itu akan berhasil juga. Mencari-cari di Google, saya menemukan bahwa beberapa versi apache yang lebih baru tidak mengatur panjang respons dengan benar di header respons, jadi saya melakukan ini secara manual. Dengan django, yang harus saya lakukan adalah:

response['Content-Length'] = len(content)

Jika Anda memiliki kendali atas layanan yang Anda coba akses, cari tahu cara mengubah header respons di platform yang Anda gunakan, jika tidak, Anda harus menghubungi penyedia layanan untuk memperbaiki masalah ini. Rupanya, FF dan banyak browser lainnya dapat menangani situasi ini dengan benar, tetapi desainer Chrome memutuskan untuk melakukannya seperti yang ditentukan.

Felipe Sodre Silva
sumber
Saya mencoba mengatur header panjang konten, dan masih memiliki masalah yang sama seperti yang dijelaskan dalam pertanyaan asli. Saya menggunakan PHP 5.3.8 dan Apache 2.2.21 (menggunakan WAMP di Windows 7)
rodrigo-silveira
4

Saya memiliki masalah serupa. Dengan menggunakan chrome: // net-internals / # events, saya dapat melihat bahwa masalah saya disebabkan oleh beberapa pengalihan diam-diam. Permintaan get saya dipecat dalam skrip onload. Url-nya berbentuk " http://example.com/inner-path " dan 301 secara permanen dialihkan ke "/ inner-path". Untuk memperbaiki masalah, saya baru saja mengubah url menjadi "/ inner-path" dan itu memperbaiki masalah. Saya masih tidak tahu mengapa skrip yang bekerja seminggu yang lalu tiba-tiba memberi saya masalah ... Semoga ini membantu seseorang

RedEight
sumber
3

(Menggunakan Formulir Web ASP.NET)

Masalah saya adalah saya mencoba untuk mengaktifkan Ajax dari peristiwa klik tombol kirim yang memiliki pengaturan peristiwa klik sisi server. Saya harus membuat tombol hanya dengan tombol sederhana (yaitu <input type="button">)

contactmatt
sumber
3

Saya mengalami masalah yang sama, bagi saya, saya membuat iframe untuk sementara dan saya menghapus iframe sebelum ajax selesai, sehingga browser akan membatalkan permintaan ajax saya.

Reza
sumber
Bagaimana Anda mengatasi masalah ini? Situs saya disematkan di iFrame yang tidak saya kendalikan. Saya ingin panggilan saya diselesaikan karena beberapa setelan data latar belakang
Rips
@Rips ini selama 4 tahun yang lalu, bagaimanapun saya pikir saya menyelesaikannya dengan menggunakan Promises
Reza
3

Memperluas jawaban @ Kazetsukai, Anda mungkin mengalami masalah ini jika Anda membuat permintaan AJAX dari pengguna yang mengklik tautan.

Jika Anda mengatur tautan Anda seperti ini:

<a href="#" onclick="soAjax()">click me!</a>

Dan kemudian handler javascript seperti berikut:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

Untuk mencegah browser Anda mengikuti tautan dan membatalkan permintaan apa pun yang sedang berlangsung, Anda harus menambahkan return falseatau e.preventDefault()menghentikan penyebaran peristiwa klik:

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

Atau:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}
Hannele
sumber
2

Ada dua kemungkinan saat permintaan AJAX dijatuhkan (jika bukan permintaan Cross-Origin):

  1. Anda tidak mencegah perilaku default elemen untuk acara tersebut.
  2. Anda menyetel waktu tunggu AJAX terlalu rendah, atau server backend jaringan / aplikasi lambat.

Solusi untuk 1) : Tambahkan return false;atau e.preventDefault();di event handler.

Solusi untuk 2) : Tambahkan opsi batas waktu saat membentuk permintaan AJAX. Contoh di bawah ini.

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

Untuk permintaan Lintas-asal, periksa header HTTP Cross-Origin Resource Sharing (CORS).

AnkitK
sumber
1

Saya mendapat kesalahan ini saat membuat permintaan menggunakan http ke url yang membutuhkan https. Saya kira panggilan ajax tidak menangani pengalihan. Ini terjadi bahkan dengan opsi ajax crossDomain disetel ke true (pada JQuery 1.5.2).

ptutt
sumber
1

Untuk kasus Dropzone.js. Dalam kasus saya itu disebabkan karena nilai timeoutopsi terlalu rendah secara default. Jadi tingkatkan dengan kebutuhan Anda.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}
Scofield
sumber
0

Dalam kasus saya, saya menulis ulang mod Apache cocok dengan url dan mengarahkan permintaan ke https.

Lihat permintaan di chrome: // net-internals / # events.

Ini akan menunjukkan log internal permintaan. Periksa pengalihan.

bbrame
sumber
0

Saya memiliki masalah yang sama, tetapi dalam kasus saya ternyata itu adalah masalah cookie. Orang-orang yang bekerja di bagian belakang telah mengubah jalur cookie JSESSIONID yang disetel saat kami masuk ke aplikasi kami, dan saya memiliki cookie lama dengan nama itu di komputer saya, tetapi dengan jalur lama. Jadi ketika saya mencoba masuk ke browser (Chrome) mengirim dua cookie yang disebut JSESSIONID, dengan nilai berbeda, ke server - yang bisa dimengerti membingungkannya - jadi itu membatalkan permintaan. Menghapus cookie dari komputer saya memperbaikinya.

Joe Dyndale
sumber
0

Saya mendapatkan kesalahan ini dengan cara yang lebih menyeramkan: Tab jaringan dan chrome: // net-internals / # events tidak menampilkan permintaan setelah js selesai. Saat menjeda js dalam panggilan kesalahan tab jaringan memang menunjukkan permintaan sebagai (dibatalkan). Itu secara konsisten dipanggil untuk tepat satu (selalu sama) dari beberapa permintaan serupa di halaman web. Setelah memulai ulang Chrome, kesalahan tidak muncul lagi!

Kristen
sumber
0

Saya telah membatalkan di Firefox . Beberapa panggilan ajax bekerja dengan baik untuk saya, tetapi gagal untuk rekan kerja yang benar-benar harus menggunakannya.

Ketika saya memeriksanya melalui trik Chrome yang disebutkan di atas, saya tidak menemukan ada yang mencurigakan. Saat memeriksanya di firebug, itu menunjukkan animasi 'memuat' setelah dua panggilan mallicous, dan tidak ada tab hasil.

Solusinya sangat sederhana: buka riwayat, temukan situs web, klik kanan -> lupakan situs web.
Lupakan, bukan hapus.

Setelah itu, tidak ada masalah lagi. Dugaan saya ini ada hubungannya dengan .htaccess.

Martijn
sumber
0

Dalam kasus saya, itu adalah garis miring yang hilang di url. Menambahkan garis miring memecahkan masalah saya.

Aftab Baig
sumber
-1

Saya mengalami masalah ini dengan jaringan 3G tertentu.
Itu akan selalu gagal pada permintaan DELETE dengan net_error = -101di chrome: // net-internals / # events.

Jaringan lain berfungsi dengan baik jadi saya berasumsi ada server proxy yang salah atau semacamnya.

Dan Abramov
sumber