問題需求:父頁面與子頁面iframe跨域巢狀,子頁面要觸發父頁面所定義的js方法、父子頁面的資料傳遞。
下文中會用到一些檔案:父頁面: parent.html;嵌在父頁面的子iframe頁面:child.html。
同域時 iframe 呼叫父頁面的js方法
在同域的情況下,子iframe頁面可以很方便地直接呼叫父頁面定義的js方法:window.parent.fn(); 或者 window.top.fn();
當頁面中不存在 iframe 巢狀時,則 window.self, window.parent, window.top 三者均是當前視窗自身的引用。比如,parent.html 和 child.html 均在 a.com 的同一網域名稱下:
window.parent.sayhi(); //或者 top.sayhi();
當 的鏈結與父頁面不同域時,則子頁面的 iframe 不能呼叫父頁面定義的方法,會報錯;如:parent.html 在 a.com 網域名稱下,但子 iframe 的鏈結與 a.com 不同域:
實際上,跨域直接呼叫其它頁面所定義的js方法是做不到的。
postmessage 的傳送與接收
window.postmessage 是 html5 提供的乙個跨域解決方案。基本的傳送和接收使用如下。
(1)傳送:otherwindow.postmessage(message, targetorigin, [transfer]);
引數說明:
message: 將要傳送到其他 window的資料;
otherwindow:其他視窗的乙個引用,如iframe的contentwindow屬性、執行window.open返回的視窗物件、或者是命名過或數值索引的window.frames;
targetorigin: 通過視窗的origin屬性來指定哪些視窗能接收到訊息事件,其值可以是字串」*」(表示無限制)或者乙個uri。
(2)接收:
window.addeventlistener("message", function(event)
});
event 包含很多的資訊,其中重要的幾個分別是:
跨域時 iframe 觸發父頁面的js方法,資料雙向傳輸
a.com 網域名稱下的父頁面 parent.html 定義了功能函式 sayhi();父頁面 parent.html 中巢狀了子 iframe 頁面 child.html(在網域名稱b.com網域名稱下) 。現在要實現:1)在child.html中引起觸發、執行父頁面定義的 sayhi()方法。2)在child.html中向父頁面請求獲取資料 uname 值。
基本思路:parent.html 和 child.html 2個頁面分別設定 傳送和接收,如下:
1) child.html**:
2) child.html 中引入的js檔案 sdk_child.js **:
;(function(); sdk.uname = null
;
//傳送
sdk.getuname = function
(), "*")};
sdk.sayhi = function
(info)
}, "*")};
//接收
window.addeventlistener("message", function
(e) }
});//寫入window
window.sdk =sdk;
})();
3) parent.html 中引入的js檔案 sdk_parent.js**:
;(function(), 'b.com');
},sayhi:
function
(info),
};//監聽接收
window.addeventlistener("message", function
(e) }
});})();
iframe 跨域 父頁面向子頁面傳值
今天碰到乙個需求,是不同域的兩個頁面之間傳值 在網上找了一下,一般有兩個解決方案,乙個是建立乙個 頁面,通過 頁面傳值,另乙個方法是通過h5的postmessage方法傳值,今天用的是第二種。var iframe document.getelementbyid onemap var msg var ...
iframe跨域獲取的父頁面URL
這2天主要處理乙個子頁面與父頁面跨域互動問題,子頁面需要獲取父頁面的url來傳遞資料,取不到,查資料得知,故整理一波.當iframe與父頁面不屬於同乙個網域名稱時,像上面的獲取會因為安全策略原因而失敗。在nczonline的一篇文章上看到一種方法,使用document.referrer。方法很簡單,...
iframe跨域獲取的父頁面URL
當iframe與父頁面不屬於同乙個網域名稱時,像上面的獲取會因為安全策略原因而失敗。在nczonline的一篇文章上看到一種方法,使用document.referrer。方法很簡單,通過parent window檢測iframe與父頁面是否同源,當不同源時,使用document.referrer,否...