Rumah >hujung hadapan web >Tutorial H5 >Cara menggunakan postMessage untuk melaksanakan permintaan merentas domain Ajax dalam kemahiran tutorial HTML5_html5

Cara menggunakan postMessage untuk melaksanakan permintaan merentas domain Ajax dalam kemahiran tutorial HTML5_html5

WBOY
WBOYasal
2016-05-16 15:51:551593semak imbas

Disebabkan sekatan dasar asal yang sama, Javascript mempunyai masalah komunikasi merentas domain yang biasa termasuk komunikasi antara iframe dan induk, dsb.

Beberapa penyelesaian biasa:

(1) document.domain iframe;
(2) Buat skrip secara dinamik;
(3) iframe location.hash;

Saya tidak akan menerangkan butiran tentang kaedah ini di sini. Apa yang direkodkan ialah tetingkap HTML5.postMessage.
postMessage serasi dengan IE8, Firefox, Opera, Safari dan Chrome.

Dua pelayan asing diperlukan untuk ujian Sudah tentu, pelayan tempatan dan dalam talian juga boleh digunakan sebagai dua pelayan asing.
Jika anda menggunakan phonegap untuk membangunkan, anda boleh memasang fail permintaan pada klien, dan kemudian meminta pemprosesan data pelayan secara dinamik untuk mendapatkan dan memaparkan data. Dengan cara ini, sebarang bahasa dan kaedah pembangunan web boleh digunakan untuk membangunkan bahagian belakang yang diperlukan oleh Phonegap App.


1. Penggunaan postMessage
postMessage ialah API baharu yang diperkenalkan oleh HTML5 untuk menyelesaikan masalah merentas domain js, membenarkan berbilang iframe/tetingkap komunikasi merentas domain.

Andaikan strukturnya adalah seperti berikut:

Kod JavaScriptSalin kandungan ke papan keratan
  1. test.html"pembungkus">
  2. postMessage (cross-domain)

  3.  
  4.   

  5. untuk=
  6. "mesej">Hantar mesej ke iframe:    
  7. "teks" nama=
  8. "mesej" nilai="anak" id="mesej"/>  "serahkan"/> 
  9.    
  10. Maklumat daripada iframe sasaran:

  11. "ujian">Belum ada maklumat

     
  12. iframe.html
  13. Kod JavaScriptSalin kandungan ke papan keratan
    1. iframe menunjuk ke xiebiji.com

    2. untuk="mesej">Hantar mesej ke tetingkap induk: < / label> 
    3. "teks" nama="mesej" nilai="ayah" id="mesej"/> 
    4. "serahkan"/>

      "ujian"

    5. >Tiada maklumat lagi.

      Berikut ialah kod Javascript (menghantar data) dalam test.html: var win = document.getElementById("iframe" ).contentWindow;document.querySelector('form').onsubmit=fungsi(e){ win.postMessage(document.getElementById("mesej"
    6. ).nilai,"*"); jika
    7. (e.preventDefault) e.preventDefault();
    8. e.returnValue = palsu
    9. ;
    10. Kod kunci hanyalah satu ayat:
    Kod JavaScript
Salin kandungan ke papan keratan

win.postMessage(document.getElementById(
"mesej"
    ).nilai,
  1. "*"); PostMessage ialah kaedah objek komunikasi, jadi untuk berkomunikasi dengan iframe, objek iframe memanggil kaedah postMessage. postMessage mempunyai dua parameter, satu daripadanya sangat diperlukan. Parameter pertama ialah data yang akan dihantar, dan parameter kedua ialah domain yang membenarkan komunikasi "*" bermakna domain yang diakses tidak dinilai, yang boleh difahami sebagai membenarkan komunikasi dalam semua domain. Kemudian terdapat kod dalam iframe.html yang mendengar untuk menerima data:
Kod JavaScript


Salin kandungan ke papan keratan

var
parentwin = window.parent;window.onmessage=
    fungsi
  1. (e){  document.getElementById("test").innerHTML = e.origin
  2. "katakan:" e. data; parentwin.postMessage('HI! Anda menghantar saya "' e.data
  3. '" . ',"*");};

    Ia sangat mudah, saya percaya anda akan memahaminya sepintas lalu. e.data mengandungi data yang dihantar, dan e.origin merujuk kepada domain sumber.

    Kemudian iframe.html juga menghantar data respons ke test.html dan test.html menerima data tersebut. Jika kodnya serupa, saya tidak akan menyiarkan kod itu.

    2. Permintaan merentas domain Ajax

    Berdasarkan komunikasi merentas domain di atas, letakkan kod Ajax dalam fungsi pemprosesan onmessage dalam iframe. html, Hantar permintaan ke test.html menggunakan data yang diluluskan oleh postMessage sebagai parameter, dan kemudian hantar data yang dikembalikan ke test.html menggunakan postMessage. Dengan cara ini, permintaan Ajax merentas domain dilaksanakan. Ia sebenarnya satu perkara yang sangat mudah.

    Siarkan kod sampel, tetapi ia tiada kaitan dengan kod di atas.

    Kod JavaScriptSalin kandungan ke papan keratan
    1. (fungsi(){ //Dapatkan tetingkap data merentas domain.onmessage = fungsi(e){
    2. var url = "http://yangzebo.com/demo/noforget/test.php?msg=" e.data;
    3. //Ajax var xhr = getXHR();
    4. jika(xhr){
    5. xhr.open("GET",url,true);
    6. xhr.onreadystatechange = changeHandle;
    7. xhr.send(null);
    8. makluman("Ajax tidak disokong");
    9. function changeHandle(){//Pulangan pemprosesan
    10. if(xhr.readyState == 4){
    11. var parentwin = window.parent;
    12. parentwin.postMessage(xhr.responseText,"*");//Menghantar data merentas domain
    13. } }
    14. fungsi getXHR(){//Dapatkan XMLHttpRequest
    15. var xhr_temp; if(window.XMLHttpRequest){
    16. xhr_temp = XMLHttpRequest();
    17. } else if(window.ActiveXObject){
    18. xhr_temp = ActiveXObject baharu("Microsoft.XMLHTTP");
    19. }lain{
    20. xhr_temp = null;
    21. kembalikan xhr_temp;
    22. } };})();
    23. Dann geben Sie eine unansehnliche Demo.

      Wenn Sie an der Code-Anfrage interessiert sind, verwenden Sie bitte die Entwicklertools, um sie auszuprobieren. „zebo man“ wird aus der Datenbank gelesen und „my msg“ ist der Parameter der von sendAndReceive gesendeten Ajax-Anfrage .html an test.php, zurück an sendAndReceive.html über test.php und iframeforAjax.html.

      3. Tipps

      Sie müssen das ContentWindow des Iframes abrufen, um postMessage aufzurufen.

      postMessage muss nach dem Laden des Iframes aufgerufen werden, damit es normal ausgeführt werden kann. (Das hat lange gedauert)

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn