gönderi verilerini window.location.href ile iletin


113

Window.location.href kullanırken, POST verilerini açtığım yeni sayfaya aktarmak istiyorum. JavaScript ve jQuery kullanılarak bu mümkün müdür?


11
Ayar window.location.href, yeni URL için POST değil GET isteğinde bulunur.
Chetan S

Yanıtlar:


85

Kullanarak window.location.hrefPOST isteği göndermek mümkün değildir.

Yapmanız gereken, formiçinde veri alanları olan bir etiket actionoluşturmak, formun methodözniteliğini URL'ye ve özniteliği POST olarak ayarlamak ve ardından etiket submitüzerindeki yöntemi çağırmaktır form.


3 farklı formdan gelen verilerim var ve 3 formu da aynı sayfaya göndermeye çalışıyorum, bu yüzden formları jQuery ile serileştirmeye ve başka bir yolla göndermeye çalışıyorum
Brian

@Brian: Her şeyi bir formaraya koyamaz mısın , her şey otomatik olarak birlikte gönderilir mi?
Marcel Korpel

Bir form jQueryUI iletişim kutusundadır - bu yüzden hepsini dahil edemem.
Brian

12
Tüm değerlerini çıkarın, üç formdaki tüm alanlarla dinamik olarak bir form oluşturun ve bu formu gönderin. Form görünmez olabilir. JQuery AJAX yöntemi kullanmayın, kullanın $("#myForm").submit(). Görünmez olacak ve yalnızca müşteri tarafındaki kodunuzdan değerler göndermek için kullanılacak, kullanıcı girdisi için kullanılmayacak olan form asla gösterilmeyecek veya başka bir şekilde kullanılmayacak ve sayfa yenilenecektir.
Matt Luongo 03

79

HTML'nize aşağıdaki gibi bir form ekleyin:

<form style="display: none" action="/the/url" method="POST" id="form">
  <input type="hidden" id="var1" name="var1" value=""/>
  <input type="hidden" id="var2" name="var2" value=""/>
</form>

ve bu değerleri doldurmak için JQuery'yi kullanın (elbette benzer bir şey yapmak için javascript de kullanabilirsiniz)

$("#var1").val(value1);
$("#var2").val(value2);

Sonunda formu gönderin

$("#form").submit();

sunucu tarafında kontrol ederek gönderdiğiniz verileri alabilmelisiniz var1ve var2bunun nasıl yapılacağı, kullandığınız sunucu tarafı diline bağlıdır.


bunu yaptığımda tarayıcımın etki alanına / tanımsız'a yönlendirmesini sağlıyorum. Neyi yanlış yapıyorum?
vigamage


9

Diğer cevaplarda da söylendiği gibi, window.location.href kullanarak POST isteği yapmanın bir yolu yoktur, bunu yapmak için bir form oluşturabilir ve hemen gönderebilirsiniz.

Bu işlevi kullanabilirsiniz:

function postForm(path, params, method) {
    method = method || 'post';

    var form = document.createElement('form');
    form.setAttribute('method', method);
    form.setAttribute('action', path);

    for (var key in params) {
        if (params.hasOwnProperty(key)) {
            var hiddenField = document.createElement('input');
            hiddenField.setAttribute('type', 'hidden');
            hiddenField.setAttribute('name', key);
            hiddenField.setAttribute('value', params[key]);

            form.appendChild(hiddenField);
        }
    }

    document.body.appendChild(form);
    form.submit();
}

postForm('mysite.com/form', {arg1: 'value1', arg2: 'value2'});

https://stackoverflow.com/a/133997/2965158


8

Kısa cevap: hayır. window.location.hrefPOST verilerini geçiremez.

Biraz daha tatmin edici cevap: Bu işlevi tüm form verilerinizi klonlamak ve göndermek için kullanabilirsiniz.

var submitMe = document.createElement("form");
submitMe.action = "YOUR_URL_HERE"; // Remember to change me
submitMe.method = "post";
submitMe.enctype = "multipart/form-data";
var nameJoiner = "_";
// ^ The string used to join form name and input name
//   so that you can differentiate between forms when
//   processing the data server-side.
submitMe.importFields = function(form){
    for(k in form.elements){
        if(input = form.elements[k]){
            if(input.type!="submit"&&
                     (input.nodeName=="INPUT"
                    ||input.nodeName=="TEXTAREA"
                    ||input.nodeName=="BUTTON"
                    ||input.nodeName=="SELECT")
                     ){
                var output = input.cloneNode(true);
                output.name = form.name + nameJoiner + input.name;
                this.appendChild(output);
            }
        }
    }
}
  • Göndermek submitMe.importFields(form_element);istediğiniz üç formun her biri için yapın.
  • Bu işlev, bir varsa (onun çocuk girdilerin adlarına her formun adını katacak <input name="email">in <form name="login">, gönderilen ad olacaktır login_name.
  • nameJoinerDeğişkeni _, giriş adlandırma düzeninizle çakışmaması için başka bir şeye değiştirebilirsiniz .
  • Gerekli tüm formları içe aktardıktan sonra, submitMe.submit();

4

bu kadar basit

$.post({url: "som_page.php", 
    data: { data1: value1, data2: value2 }
    ).done(function( data ) { 
        $( "body" ).html(data);
    });
});

Kullanıcı olarak hassas verileri ve çalıştığı url'yi iletmem gereken uygulamamın ekran kilidini açmak için bunu çözmem gerekiyordu. Ardından bu kodu çalıştıran bir işlev oluşturun


1
Veya done()işlev setindewindow.location.href
Chris Edwards

Evet @ChrisEdwards, örneğimde jquery postasından gelen dönüş verilerini kullanmaya çalışıyorum. Umarım birisi için yararlı olur.
Sergio Roldan

3

Yalnızca Yerel / Oturum Depolamasını kullanmayı düşündünüz mü? -veya- Yaptığınız şeyin karmaşıklığına bağlı olarak; indexDB'yi bile kullanabilirsiniz.

not :

Local storageve indexDBgüvenli değildir - bu nedenle herhangi bir hassas / kişisel veriyi (örn. isimler, adresler, e-posta adresleri, DOB vb.) bunlardan herhangi birinde saklamaktan kaçınmak istersiniz.

Session Storage hassas herhangi bir şey için daha güvenli bir seçenektir, yalnızca öğeleri ayarlayan ve aynı zamanda tarayıcı / sekme kapatılır kapatılmaz temizlenen kaynak tarafından erişilebilir.

IndexDBbiraz daha karmaşıktır [ama çok daha fazla değil] ve 30MB noSQL databaseher tarayıcıda yerleşiktir (ancak kullanıcı tercih ederse temelde sınırsız olabilir) -> Google docs'u bir sonraki kullanışınızda, sizi DevTools -> uygulama -> IndexDB açın ve bir zirve yapın. [spoiler uyarısı: şifrelenmiştir].

Odaklanmak Localve Session Storage; bunların her ikisinin de kullanımı son derece basit:

// To Set 
sessionStorage.setItem( 'key' , 'value' );

// e.g.
sessionStorage.setItem( 'formData' , { name: "Mr Manager", company: "Bluth's Frozen Bananas", ...  } );    

// Get The Data 
const fromData = sessionStorage.getItem( 'key' );     

// e.g. (after navigating to next location)
const fromData = sessionStorage.getItem( 'formData' );

// Remove 
sessionStorage.removeItem( 'key' );

// Remove _all_ saved data sessionStorage
sessionStorage.clear( ); 

Basitlik senin işin değilse -veya- belki yoldan çıkıp hep birlikte farklı bir yaklaşım denemek istiyorsun -> muhtemelen bir shared web worker... y''know, sadece eğlence için kullanabilirsin .


-4

Geçiş yerine GET kullanabilirsiniz, ancak bu yöntemi önemli değerler için kullanmayın,

function passIDto(IDval){    
window.location.href = "CustomerBasket.php?oridd=" +  IDval ;
}   

CustomerBasket.php'de

<?php
  $value = $_GET["oridd"];
  echo  $value;
?>

3
GET yöntemi ancak soru POST yöntemi dostum
Thamaraiselvam

@thamaraiselvam Kissa Mia cevabı iyi ifade etmemiş olabilir, ancak buradaki GET rotası hakkında haklı. Soru, POST yöntemini kullanmakla bağlantılı değildir - kullanıcı sadece POST verilerini alıp window.location.href aracılığıyla göndermenin bir yolu olup olmadığını sormuştur . Ve ilk window.location.href bilmeli IS bir GET isteği. Bu yanıt yanlış değil - QueryString olarak kodlanmış çok sayıda form alanına ölçeklendirmek kolay olmayacak. Bununla birlikte, bir URL aracılığıyla veri göndermenin en açık yolu (window.location.href ile değiştirebileceğiniz şey budur) sorgu dizesi parametreleridir.
SylonZero

@SylonZero POST verilerini bir GET isteğine ekleyemezsiniz. Bunlar farklı türde isteklerdir ve veriler bir POST'ta farklı görünür. HTTP spesifikasyonunun önemli kısımları oldukça kısadır.
Colin vH

@ColinvH Yazdıklarımı daha dikkatli okumalısın. TLDR sürümü: POST oluşturmak için kullanılacak verileri alabilir ve bunları sorgu dizesi parametreleri olarak kodlayabilirsiniz.
SylonZero
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.