Düzenli bir forma göndermek veya bir Ajax isteği ya erişildiğinde tarayıcı yönlendirme yapar Formu - Bu mümkün mü?

8 Cevap php

Ben bir form ile bir web sayfası var. Kullanıcı formu gönderdiğinde, ben sunucu tarayıcı form eylemi farklı bir sayfaya yönlendirme yapmak istiyorum. Şu anda, ben bir 302 durum kodu göndermek için PHP'nin header işlevini kullanarak yapıyorum. Bu çalışıyor.

Ben sunucu üzerinde sayfa olursa olsun (Javascript olmadan) veya Ajax ile normalde sunuldu olsun, aynı şekilde tarayıcı yönlendirmek yapmaya çalışıyorum. Ben konumu başlığında ne olursa olsun URL için pencere konumu ayarlayarak bu yapmaya çalıştım. JQuery kullanarak ve böyle bir çağrı yapıyorum:

$.ajax({
    url: this.action,
    type: "POST",
    data: getFormData(this),
    complete: function(request) {
        window.location.assign(request.getResponseHeader("Location"));
    }
});

Ancak, bu işe yaramadı. Düşündükten sonra, ben bu çok şaşırtıcı olmadığını fark etti. Bir Ajax isteği, tarayıcı şeffaf readyState değiştirmeden önce böyle 302 kodları gibi yanıtları yönlendirmek işlemek gerekiyordu. Komple fonksiyon çalıştığında, nihai hedef Location başlığı arıyor ve bulgu değildir.

Bir deneme olarak, sonra bir Location başlığı ile bir 200 durum kodu gönderme çalıştı. Ben Ajax isteği denedim ve gayet iyi çalıştı. Ben olmayan Ajax göndermek yaptım Ancak, bu işe yaramadı. Tarayıcı form action sayfasına gitti ve Yer başlığını göz ardı edilmiş gibi, orada kaldı.

Sunucu biliyor veya isteği bir Ajax isteği olup olmadığını bakım zorunda kalmadan, her iki durumda da aynı yönlendirme sayfası yapmak için herhangi bir yolu var mı?

Bu konularda durumda, ben benzer sonuçlar ile farklı tarayıcılarda (IE8, IE7, IE6, Firefox 3.5, Chrome) her zaman formu çalıştı. Ayrıca, ben IE 2083-karakter URL uzunluğu sınırı içine çarpmasını önlemek için bir post isteği yapıyorum.

8 Cevap

HTTP 302 response are consumed silently by XmlHttpRequest uygulamaları (e.g. jQuery's ajax işlevi). Bu bir özellik.

Ben geçmişte bu çözdük yolu XMLHttpRequest'ler algılamak ve bir "Content-Location" header (rather than a "Location" başlık) hazırlamaktır. Bunu yapmanın en çapraz kütüphane yolu (diğerleri bu set arasında jQuery, Prototype, Mootools) sunucu tarafı kodu "X-Requested-With" http başlık için kontrol etmektir:

if (@$_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest') {
    header('Content-Location: ' . $redirect_url);
} else {
    header('Location: ' . $redirect_url);
}

Hala özel durum istemci tarafı kodu gerekir:

$.ajax({
    // ...
    complete: function(xhr) {
        var redirect_url = xhr.getResponseHeader("Content-Location");
        if (redirect_url) {
            window.location = redirect_url;
        }
    }
})

Kullanıcı bakılmaksızın yönlendirilir oluyor, neden Ajax? Bu gibi Ajax bütün mesele bir sayfa yenileme olmadan sayfada değişiklik yapmak için, bu nedenle kullandığınız teknik biraz bir parçalayıcı hazneye çıktılar bir yazıcı bina gibi görünüyor.

Ben bunun için bir use-case hakkında daha fazla bilmek istiyorum. Ben senin içindeki bir Ajax çağrısı 'Yer' başlığına dayanan bir sayfayı yüklemek için başvuru almaya çalışırken anlamak ne? Nedenini sormak istiyorum?

Bir HTTP başlık seem bu bilgileri almak için doğru yer değildir. Uygulama esas diyor bir sorgu yapmak değil mi "Ben yönlendirmek zorundadır Nerede?". Ajax yanıtı aslında bir 302 ve 'Yer' başlığı ile yanıt var neden yok. Neden sadece yeni URL içeren JSON veya XML ile cevap yok?

Düzenleme: Sadece sondan bir önceki paragrafı tekrar okuyun. Ne istediğinizi elde iyi bir yolu var emin değilim. Kavram bana kırılmış gibi. :)

Istek kolay tespit türü için ajax isteği için ek bir parametre geçmek. Ajax - yönlendirme yok - sadece hedef url göndermek, sonra location.href via ajax geri arama istemci tarafında yönlendirme

gibi bu:

$.post('/controller/action', {formdata}, function (redirect_to) {
    location.href = redirect_to;
});

Işi "tamamlamak" Will:

$.ajax({
    type: frm.attr('method'),
    url: frm.attr('action'),
    data: frm.serialize(),
    complete: complete(xhr, status) {
       window.location.assign(xhr.getResponseHeader("Location"));

    }
});

Eğer hata işlevini kullanarak yerine tam denemek mi?

$.ajax({
    url: this.action,
    type: "POST",
    data: getFormData(this),
    error: function(request) {
        if(request.status == 302)
            window.location.assign(request.getResponseHeader("Location"));
    }
});

jQuery hata işlev herhangi 3xx yanıt gönderir. Belki 'Yer' başlığı hala bu aşamada sunulacak.

Neden "ajax eylem" sadece gerekli form alanları doldurun değil ve bunun yerine formu göndermek? Bu şekilde tam olarak elle göndererek olduğu gibi aynı davranışı alırsınız.

Burada bazı çapraz tarayıcı testleri yapmak gerekir ancak başka bir seçenek:

complete: function(request) {
    if(request.status == 200) {
        var doc = document.open(request.getResponseHeader('Content-Type'));
        doc.write(request.responseText);
        doc.close();
    }
}

Önemli sakıncaları: adres çubuğuna URL değişmez; ebil geri düğmesi / geçmişi ile karışıklık

Ben @ crescentfresh fikri gitmek için yol olduğunu düşünüyorum rağmen,