2014-09-10 12 views
11

Kısa süre önce Chrome'un artık kurumsal sistemimiz bu yöntemi kullandığı için sorunlu olan window.showModalDialog'u desteklemediğini keşfettik. Görünüşe göre, showModalDialog'u geri yüklemenizi sağlayan kısa vadeli bir geçici çözüm var, ancak ortalama kullanıcı sayımızın çok karmaşık (ve riskli) kayıt defterini değiştirmeyi içeriyor. Bu yüzden bu geçici çözümün büyük bir hayranı değilim.window.open'den bir değer döndürme

Uzun süreli çözüm, bu eski yönteme yapılan tüm çağrıları kaldırmak ve uygun bir jQuery eklentisi ile değiştirmek (örneğin, VistaPrint'in Skinny Modal Dialog plugin gibi.). Diğer önerileri bu arada bekliyoruz.

Kalıcı iletişim kutusunu kullandığımız tipik senaryo, geri alınamayan bir eylemi gerçekleştirmeden önce kullanıcının Evet/Hayır onayını istemesini istemektir, kullanıcının devam etmeden önce şartlar ve koşulları kabul etmesini istemek, vb. Genellikle onclick olayı kalıcı bir iletişim kutusunda "Evet" veya "Tamam" düğmesine şuna benzer:

window.returnValue = true; 
window.close(); 

benzer şekilde, "Hayır" butonuna şuna benzer "İptal" veya:

window.returnValue = false; 
window.close(); 

gerçek şu ki biz iletişim kutusundan bir değer döndürebilir, çünkü "Üst" pencerede kullanıcı "Tamam" ya da düğme şöyle "İptal" tıklamadığını haberdar olmak için:

var options = "center:1;status:1;menubar:0;toolbar:0;dialogWidth:875px;dialogHeight:650px"; 
var termsOfServiceAccepted = window.showModalDialog(myUrl, null, options); 
if (termsOfServiceAccepted) { 
    ... proceed ... 
} 

Ben ShowModalDialog hakkında söz edeceğim son şey büyük bile çalışır olmasıdır iletişim kutusunda görüntülenen belge farklı bir etki alanından olduğunda. Bizim javascript bizim http://the-client.com çalışıyor ama bizim "Hizmet Şartları" web sayfası http://the-enterprise-vendor.com

için çok yaygındır Biz uzun vadeli çözüm üzerinde çalışırken ASAP dağıtabileceğim geçici bir çözüme ihtiyacım var. pop-up pencere "ebeveyn" bir değer döndürmek gerekir varolan JavaScript

  • yılında

    • asgari kod değişikliği: İşte benim kriterdir. Genellikle bu değer bir Boole ama herhangi basit tür olabilir: içeriğin URL farklı bir etki İşte

    den ise

  • çözüm bile çalışmalıdır (örneğin ip, int, vs.) Elimde ne var Şimdiye kadar:

    1) benim JavaScript aşağıdaki yöntemi ekleyin:

    function OpenDialog(url, width, height, callback) 
    { 
        var win = window.open(url, "MyDialog", width, height, "menubar=0,toolbar=0"); 
        var timer = setInterval(function() 
        { 
         if (win.closed) 
         { 
          clearInterval(timer); 
          var returnValue = win.returnValue; 
          callback(returnValue); 
         } 
        }, 500); 
    } 
    

    Bu yöntemle görebileceğiniz gibi, pop up penceresi gizleyerek mümkün olduğunca iletişim kutusuna benzer görünmesi için deneyin menü ve araç çubuğu, her zaman bir zaman ayarlıyorum Pencerenin kullanıcı tarafından kapatılıp kapatılmadığını kontrol etmek için 500 milisaniyedir ve eğer öyleyse, 'returnValue' değerini alın ve bir geri çağırma çağırın.

    2) yerine aşağıdaki tüm ile ShowModalDialog çağrıları:

    OpenDialog(myUrl, 875, 650, function (termsOfServiceAccepted) 
    { 
        if (termsOfServiceAccepted) 
        { 
         ... proceed .... 
        } 
    }); 
    

    yönteme dördüncü parametre kullanıcı onu durdurdu, önce "Tamam" düğmesine tıklandığında olmadığını kontrol geri arama olduğunu.Eğer ben teklif çözümün ne düşünüyorsunuz

    1. :

      Uzun bir soru olduğunu biliyorum ama temelde aşağı kaynar?

    2. Özellikle, window.open ile açılan bir pencereden bir returnValue alabileceğimi düşünüyor musunuz?
    3. Önerebileceğiniz başka bir alternatif var mı?
  • +0

    bağlı olmadığını fark olduğunu yazdı var

    DÜZENLEME: http://stackoverflow.com/a/9276310/1086511 – Rodrigo

    +0

    yalnızca krom kullanmaya devam ederseniz, "showModal" ve "

    " ile gidebilir: http://stackoverflow.com/questions/43183930/how- -oluştur-showmodal-tamamen-blok-içerik-out-promised – cregox

    cevap

    12

    Size yardımcı olabilecek iki fikrim var ancak bunlardan ilki CORS'e bağlı, dolayısıyla farklı alanlardan kullanamayacaksınız, en azından her iki hizmete de erişebilir ve bunları yapılandırabilirsiniz.

    İLK IDEA:

    ilk bu native api ile ilgilidir. Eğer ihtiyacınız boole değer tutabilen bir sonuç argüman alır görebileceğiniz gibi

    window.callback = function (result) { 
        //Code 
    } 
    

    : Sen ana penceresinde böyle bir küresel işlev oluşturabilir. Açılan pencereyi aynı eski window.open (url) işlevini kullanarak açabilirsiniz. Popup onlick olay işleyicisi bu gibi görünebilir:

    function() { 
        //Do whatever you want. 
        window.opener.callback(true); //or false 
    } 
    

    İKİNCİ IDEA: aldığım diğer fikri ebeveyn penceresinde bir olayı tetiklemek için bu diğer native api kullanmaktır

    sorunu çözer zaman açılır pencereler (daha iyi belgeler arası mesajlaşma olarak bilinir). Yani ana penceresinden yapabilirsiniz: mesajın ekinde veriler gerçek ise

    window.onmessage = function (e) { 
        if (e.data) { 
         //Code for true 
        } else { 
         //Code for false 
        } 
    }; 
    

    bu pencereden herhangi yayınlanan mesajında ​​dinlerken bu arada, ve kontrol (kullanıcı Tamam tıklar pop-up) veya yanlış (kullanıcı, pop-up pencerede iptal etmeyi tıklatır). Eğer takılarak üst penceresine bir mesaj gönderilmesi gerekiyor popup penceresinde

    bir gerçek veya karşılık bir yanlış değeri:

    window.opener.postMessage(true, '*'); //or false 
    

    ben bu çözüm mükemmel ihtiyaçlarınıza uygun olduğunu düşünüyorum. İkinci çözüm ayrıca CORS bağlıydı ama kazma derin ben çapraz belge mesajlaşma Bu yanıt bir göz atın CORS

    +0

    Ben ilk fikrinizi denedim ama "geri arama" yöntemini çağırmaya çalıştığınızda "Erişim engellendi" almadım. İkinci önerinize devam ediyor ... – desautelsj

    +1

    İkinci fikrinizi biraz başarı ile denedim.Ben bir popup penceresinden açacağı için 'postMessage' başardı ama görünüşe göre IE (göründüğü kadar inanılmaz) farklı pencereler arasındaki mesajları desteklemiyor (bilinmeyen arabirim hakkında bir hata mesajı alırsınız). Bu yüzden, benim çözümüm showModalDialog'un desteklenip desteklenmediğini ve mesajlaşma çözümünü yalnızca kalıcı diyaloglar desteklenmiyorsa kullanacak. – desautelsj

    +0

    Bu teknik (ikinci fikir) kullanılarak iki pencere arasında tam çift yönlü iletişim protokolleri oluşturabilir mi? – Victoria