jQuery, zaman uyumlu XMLHTTPRequest'i kullanımdan kaldırdı


119

Diğerleri gibi benim web sitem de jQuery kullanıyor. Geliştirici araçlarını açtığımda, XMLHTTPRequest'in şu şekilde olduğunu belirten bir uyarı görüyorum:

son kullanıcının deneyimi üzerindeki zararlı etkileri nedeniyle kullanımdan kaldırıldı.

Devam ettim ve belgelerin bir bölümünü okudum , ancak oldukça teknikti. XMLHTTPRequest'ten WHATWG'ye geçişin sonuçlarını basit terimlerle açıklayabilir mi? 2012'de olduğunu söylüyor.

Ayrıca, dokümantasyon, çalışanların dışındaki Senkronize XMLHttpRequest'in web platformundan kaldırılma sürecinde olduğunu söylüyor, bu olduğunda, bir kullanıcı aracısı bir hizmete sahipse, mevcut kodlarını değiştirmeleri gerekir mi?


2
Eşzamanlı XMLHTTP İsteklerinden bahsediyor olmalısınız, eşzamansız olanlardan değil, doğru mu? Eşzamanlı istekler son kullanıcı deneyimi için korkunçtur (istek sırasında tarayıcıyı kilitler) ve genellikle kullanılmamalıdır.
jfriend00

2
bunu tetikleyen bir kod sağlayın
charlietfl

3
Bu söz konusu tam metin mi? Ana iş parçacığı üzerindeki senkronize XMLHttpRequest, son kullanıcının deneyimi üzerindeki zararlı etkileri nedeniyle kullanımdan kaldırıldı.
Qantas 94 Heavy

1
jQuery bu uyarıyı yalnızca eşzamanlı istekler için verir, değil mi? Kasıtlı olarak eşzamanlı bir talepte mi bulunuyorsunuz? Öyleyse çözüm, kodunuzu eşzamansız isteklerle çalışacak şekilde yapılandırmaktır; bu, kullanıcının bakış açısından çok daha hoş oldukları için yine de yapmalısınız.
nnnnnn

1
Bu bayrağı sadece web sitemde değil, Youtube gibi bazılarında da gördüm. Spesifikasyonlarla ilgili olarak, kodum hangi spesifikasyonlara uygun olmalı, W3C'ler veya WHATWG'ler? , referans ana başlıkta sormak istemiyorum çünkü sanırım bir fikir meselesi olarak işaretlenecekti. @ Qantas94Heavy
Edd

Yanıtlar:


136

Bu uyarıyı önlemek için şunları kullanmayın:

async: false

$.ajax()aramalarınızdan herhangi birinde . Bu, XMLHttpRequestkullanımdan kaldırılan tek özelliktir .

Varsayılan async: true, bu nedenle bu seçeneği hiç kullanmazsanız, özellik gerçekten kaldırılırsa kodunuz güvenli olmalıdır.

Ancak muhtemelen olmayacak - standartlardan kaldırılabilir, ancak eminim tarayıcılar bunu yıllarca desteklemeye devam edecek. Dolayısıyla, herhangi bir nedenle gerçekten senkronize AJAX'a ihtiyacınız varsa async: false, uyarıları kullanabilir ve göz ardı edebilirsiniz . Ancak senkronize AJAX'ın kötü stil olarak görülmesinin iyi nedenleri var, bu yüzden muhtemelen bundan kaçınmanın bir yolunu bulmaya çalışmalısınız. Ve Flash uygulamalarını yazan kişiler muhtemelen onun da ortadan kalkacağını hiç düşünmemişlerdir, ancak şu anda aşamalı olarak kaldırılma sürecindedir.

FetchDeğiştirilen API'nin XMLHttpRequesteşzamanlı bir seçenek sunmadığına dikkat edin .


9
Bu jQuery'nin uyarısıdır. Görmezden gelebilir miyim? Sunucuya senkronize aramalar kullanmıyorum. Mükemmeliyetçi yanım uyarılardan hiç hoşlanmıyor.
Ürdün

2
@Jordan Uyarının jQuery'den değil tarayıcıdan geldiğini düşünüyorum. Senkronize AJAX'ı her kullanmaya çalıştığınızda gerçekleşecektir. JQuery kullanırsanız, bu yalnızca bu seçeneği belirtirseniz gerçekleşir $.ajax.
Barmar

2
Kullanıyorum jquery.i18n.properties.jsama yanımda $.ajax.Belki dahili olarak açık bir çağrı yok , ama emin değilim.
Manuel Jordan

1
Bu eklenti, .propertiesdosyalardan kaynak paketlerini yükler . Muhtemelen bunu yapmak için senkronize AJAX kullanıyor ve bu uyarıya neden oluyor.
Barmar

1
@ManuelJordan i18n'de zaman uyumsuz: true ayarı, yavaş bağlantıda sayfanızda görüntülenen dizelerin gösterilmesinde gecikmeye neden olabilir. Bunun yerine dize kodunu göster
Siyon DP

62

Kabul edilen cevap doğrudur, ancak ASP.NET altında Visual Studio 2013 veya üzeri ile geliştirme yapıyorsanız ve senkronize ajax istekleri yapmadığınızdan veya yanlış yerde komut dosyası tanımlamadığınızdan eminseniz başka bir neden buldum.

Çözüm, saat yönünü gösteren küçük yenileme simgesiyle gösterilen VS araç çubuğu açılır menüsünde "Tarayıcı Bağlantısını Etkinleştir" seçeneğinin işaretini kaldırarak "Tarayıcı Bağlantısı" özelliğini devre dışı bırakmaktır. Bunu yapıp sayfayı yeniden yüklediğinizde uyarılar durmalıdır!

Tarayıcı Bağlantısını Devre Dışı Bırak

Bu, yalnızca yerel olarak hata ayıklarken gerçekleşmelidir, ancak yine de uyarıların nedenini bilmek güzel.


Burada açıklandığı gibi içeriyi web.configekleyerek devre dışı bırakılabilir : poconosystems.com/software-development/… . <add key="vs:EnableBrowserLink" value="false" /><appSettings>
Beel

3
Bunun sadece konsolda uyarı mesajları almak için kötü bir öneri olduğunu düşünüyorum. Tarayıcı bağlantısını devre dışı bırakın ve tarayıcı konsolunda bir uyarı mesajı görmemeniz için tarayıcının eklediği üretkenlik geliştirmelerinden kurtulun. Microsoft ile hata bildirmek daha iyidir ve düzeltilir.
coding4fun

4
@ coding4fun Fikriniz için teşekkürler; Microsoft ile hata bildirmekten çekinmeyin. Tarayıcı Bağlantısını devre dışı bırakmanız gerektiğini söylemiyordum. Bazı durumlarda bu uyarının nedeni konusunda cevabım doğrudur ve kendi kodunuzdaki bir şeyi göz ardı etmek yararlıdır. Yanlış yaptığım bir şey olmadığını anladığımda ve başkalarının da yararlı bulabileceğini düşündüğümde kişisel olarak daha iyi hissettim.
Sam

Bu, ajax uyarısından daha fazlasını düzeltti. Asp core kullanarak javascript konsolunda her türlü tarayıcı bağlantısı karışıklığı var.
JoeBass

Tarayıcı bağlantısının ne olduğunu bilen var mı ve neden böyle bir uyarı veriyor?
gideon

15

Bu, vücut bölümünün sonundan hemen önce başın dışındaki harici js'lere bir bağlantı kurarak başıma geldi. Biliyorsun, bunlardan biri:

<script src="http://somesite.net/js/somefile.js">

JQuery ile hiçbir ilgisi yoktu.

Muhtemelen aynısını böyle bir şey yaparken görürsünüz:

var script = $("<script></script>");
script.attr("src", basepath + "someotherfile.js");
$(document.body).append(script);

Ama bu fikri test etmedim.


Zaten kullanmadığım böyle bir satırı kaldırdığımda uyarı benim için kayboldu: @ Html.Script ("~ / scripts / apps / appname.js")
MsTapp

10

@ Henri-chan tarafından bir yorum olarak bahsedilmişti , ancak biraz daha ilgiyi hak ettiğini düşünüyorum:

JQuery / javascript kullanarak bir öğenin içeriğini yeni html ile güncellediğinizde ve bu yeni html <script>etiketleri içerdiğinde , bunlar eşzamanlı olarak yürütülür ve bu hatayı tetikler. Aynı stil sayfaları için de geçerli.

XHRKonsol penceresinde olduğu gibi (birden çok) komut dosyası veya stil sayfası yüklendiğinde bunun olduğunu bilirsiniz . (ateş).


3

Önceki yanıtlardan hiçbiri (hepsi doğru) durumuma uygun değildi: asyncparametresini içinde kullanmıyorum ve jQuery.ajax()döndürülen içeriğin bir parçası olarak şu şekilde bir komut dosyası etiketi eklemiyorum:

<div> 
     SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 

Benim durumum, aynı anda iki div'i güncellemek amacıyla art arda iki AJAX isteğini çağırıyorum:

function f1() {
     $.ajax(...); // XMLHTTP request to url_1 and append result to div_1
}

function f2() {
     $.ajax(...); // XMLHTTP request to url_2 and append result to div_2
}

function anchor_f1(){
$('a.anchor1').click(function(){
     f1();
})
}

function anchor_f2(){
$('a.anchor2').click(function(){
     f2();
});
}

// the listener of anchor 3 the source of problem
function anchor_problem(){
$('a.anchor3').click(function(){
     f1();
     f2();
});
}

anchor_f1();
anchor_f2();
anchor_problem();

Ben tıkladığımda a.anchor3, bu flag.I tarafından f2 başvurmalarını, değiştirerek sorunu çözüldü uyarı yükseltir click()fonksiyonu:

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}

5
Komut dosyaları, bunları innerHTML yoluyla doğrudan DOM'a eklerseniz çalıştırılmaz. Bu nedenle .html () 'yi çağırdığınızda, jQuery html yanıtına dahil olan komut dosyalarını eşzamanlı olarak alır ve yürütür.
Henry Chan

@HenryChan, seni anlamaya çalıştım ama boşuna. Lütfen bana daha basit kelimelerle açıklar mısınız? DOM'a komut dosyaları eklemiyorum, yalnızca HTML ekliyorum ve yine de bu çözüm benim için çalışan tek çözüm. Şimdiden teşekkürler
Adib Aroui

2
@whitelettersinblankpapers Bence ajax geri aramanızın içinde, "div" lerinize eklediğiniz içerikler komut dosyası etiketleri içeriyorsa, bunlar eşzamanlı olarak çağrılacaktır.
Haitham Sweilem

1

Çalışmam: Kodu bir arabelleğe aktaran zaman uyumsuz istekleri kullanıyorum. Her saniye tamponu kontrol eden bir döngüm var. Döküm tampona ulaştığında kodu çalıştırırım. Ayrıca bir zaman aşımı kullanıyorum. Son kullanıcı için sayfa, eşzamanlı istekler kullanılacakmış gibi çalışır.


bunu nasıl başaracağımı bilmem için küçük bir kodun var mı?
ZerOne

5
@runback, done () sözü geri araması kullanılamaz mı? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) Umarım hiçbir şeyi yanlış okumamışımdır.
pravin

0

Komut dosyasını kısmi görünümde yüklersek, bu sorun

  1. Komut dosyasını kısmi görünümde kaldırdım ve ana görünüme geçtim.

Bu çözüm benim için iyi çalışıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.