İframe Sorunsalı?
-
Selam arkadaşlar,
ihtiyacım bir sunucu üzerinde 2 websitesi var ve birinden diğerini iframe ile çekmem ve login olmam gerekiyor. iframe içine koyduğum linkte kullanıcı adı, şifre ve submit butonu var. bunlar aynı domainde lakin farklı portlardan çalıştığı için iframe içindeki textboxlara vs lere erişim vermiyor. işin garip tarafı javascript ile kullanıcı adı textboxuna erişip value bilgisine değer set ediyorum lakin textboxun textine yazmıyor bu değeri. iframe ile çektiğim sitenin textboxlarını doldurup butonuna clickletmem lazım. bir yolu var mıdır?
B nin içinde A yı göstereceğim lakin login sayfasını görmeyecek. B ye girdiğinde iframe içindeki A benim belirlediğim kullanıcı adı ve şifre ile login olacak.
A) hasan.xyz.com/login.aspx
B) ahmet.xyz.com/fiyat_listesi.aspx
veyahut javascript jquery ajax ya da bilmediğim bir teknoloji ile B ye giren bir kullanıcı A ya post get ne bileyim bişeyle kullanıcı adı şifre gönderip buttona clickleteblir miyim?
-
cross domain oluyor sanırım o ve izin verilmiyor öyle bir şeye.
PHP, cURL ile post edebilirsin ama o da sunucu üzerinden olur kullanıcı üzerinden değil.
http://madskristensen.net/post/Iframe-cross-domain-JavaScript-calls
şöyle bir şey ama bu sanırım iframe içersindeki js'yi çağırmayla alakalı.
pSkpt tarafından 21/Eyl/14 23:39 tarihinde düzenlenmiştir -
@rappercms, iki siten de aynı alan adı (xyz.com) altında yayınlandığından her iki sayfada js ile document.domain = 'xyz.com' gibi bir tanımla Same Origin'i bildirdikten sonra birbirlerine erişebilirler.
buzukatak tarafından 21/Eyl/14 23:46 tarihinde düzenlenmiştir -
buzukatak bunu yazdı
@rappercms, iki siten de aynı alan adı (xyz.com) altında yayınlandığından her iki sayfada js ile document.domain = 'xyz.com' gibi bir tanımla Same Origin'i bildirdikten sonra birbirlerine erişebilirler.
süper hocam yarın sabah iş yerinde ilk işim bunu denemek olacak..
-
buzuk atak hocam dediğin gibi eklemeyle eriştim. lakin bu sefer de text i set etmekte sorun yaşıyorum. Aslında set ediyorum fakat textbox içerisinde göremiyorum.. manuel elle test yazdım okuyorum sonra üzerine yazıyorum fakat value değişmesine rağmen text değişmiyor.. bunun için ne yapabilirim?
-
benimde aklıma gelmişti bu ama sormamıştım bile olmaz diye, takipteyim, ama umut bu topraklardan çoktan gitti .)
S0KR4T3S tarafından 22/Eyl/14 09:51 tarihinde düzenlenmiştir -
şimdi cross site olduğu için direk erişimin bulunmuyor. bunun için karşılıklı mesajlaşman gerekiyor.
Bunun için oluşturduğun frame içerisindeki message listenera postMessage ile haber vermen gerekiyor.
<script>
var win = document.getElementById("iframe").contentWindow;
$('.clickme').on('click', function (e) {
e.preventDefault();
win.postMessage({ username: 'test', password: 'password' }, '*'); // * = mesaj origini
});
</script>
Diğer taraftada bu mesajı alacak olan eventlistenerı ekliyoruz.
<script>
function listener(event) {
// event.data diğer taraftan yolladığımız { username: 'test', password: 'password' } objesini alıyor
}
if (window.addEventListener) {
addEventListener("message", listener, false)
} else {
attachEvent("onmessage", listener)
}
</script>
event.data ile yakaladığın obje ile frame içerisine taşıdığın datayı kullanabilirsin artık.
farklı portlarda denemedim ama çalışması gerekiyor.
-
https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage
şurda daha detaylı bilgi bulabilirsin bak
-
SinusX bunu yazdı
şimdi cross site olduğu için direk erişimin bulunmuyor. bunun için karşılıklı mesajlaşman gerekiyor.
Bunun için oluşturduğun frame içerisindeki message listenera postMessage ile haber vermen gerekiyor.
//
var win = document.getElementById("iframe").contentWindow;
$('.clickme').on('click', function (e) {
e.preventDefault();
win.postMessage({ username: 'test', password: 'password' }, '*'); // * = mesaj origini
});
// ]]>
Diğer taraftada bu mesajı alacak olan eventlistenerı ekliyoruz.
//
function listener(event) {
// event.data diğer taraftan yolladığımız { username: 'test', password: 'password' } objesini alıyor
}
if (window.addEventListener) {
addEventListener("message", listener, false)
} else {
attachEvent("onmessage", listener)
}
// ]]>
event.data ile yakaladığın obje ile frame içerisine taşıdığın datayı kullanabilirsin artık.
farklı portlarda denemedim ama çalışması gerekiyor.
sinux hocam hep aradığım açıklama buydu :) postmessage ı bir türlü uygulayammıştım gayet açıklayıcı olmuş. Diğer projeler için çok işime yarayacak.. Teşekkür ettim.
buzukatak ın bahsettiği şekilde aynı domainde tanımlayıp aşağıdaki jquery koduyla gerekli değişimleri yapabildim.
var $currentIFrame = $("#FRAME");
$currentIFrame.load(function () {
$('#FRAME').contents().find('#txtUserName').val("kullanıcı adı");
$('#FRAME').contents().find('#txtPassword').val("şifre");
$('#FRAME').contents().find('#btnLogin').click();
});