java偽協議_通過偽協議解決父頁面與iframe頁面通信的問題

我們經常會有父頁面與iframe頁面的操作,比如

這個iframe里面的內容是js寫的。如以下代碼

var iframe = document.getElementById("iframe"),

doc = iframe.contentWindow.document;

doc.open();

doc.write("---------something------");

doc.close();

以上代碼在大多數情況下是對的。但有種情況,即父頁面顯式的寫了document.domain = "xxx";

在ie系列(IE10沒試過)會出現沒權限的錯誤。 而在firefox, chrome都沒問題.

這是為什么呢?這是ie的一個bug, 即父頁沒有顯式的設置document.domain時,iframe會默認document.domain與父頁面一致,即都是

location.host,父子頁面是可以進行通信,即文章頭的例子, 但當父頁面顯式的設置了document.domain="", iframe里面的頁面必須也顯式的設置document.domain="xxx",否則是

沒有權限得到iframe.contentWindow.document的, 即也沒辦法去動態寫內容,其實也可以讓iframe指向一個特定的頁面,這個頁面顯式的設置document.domain="xxx",再通過文章開頭的方

的方式來寫,但問題是我的父頁面有很多這樣的iframe,個數是未知的(都是廣告位),所以也不能通過特定頁面。

這樣問題就來了,在這種情況下,我們貌似沒有辦法

1. 父頁面設置了并且必須會顯式的設置document.domain

2.iframe頁面的內容需要js動態生成。

3.沒有機會為iframe設置src。

但上面3個條件都滿足時,我們可以通過偽協議來解決此類的問題。

iframe.src="javascript:void((function(){var d=document;d.open();d.domain='xxx;d.write('---something');d.close()})())";

通過這種方式可以顯式的設置iframe的document.domain與父頁面一致。

這樣寫了后,的確實現了動態寫iframe內容的需求,但這個頁面會單獨彈出來,像window.open();

這是為什么呢? 這也是ie系列的bug ,即父頁面有, 通過iframe的偽協議所寫的內容會類似window.open一樣彈出新頁面,

但父頁面的又必須是_self, 所以只能在調用iframe.src之前將base的target設置為_self, 內容寫完后,再將base的target設為_blank

這樣就解決了此問題。

雖然偽協議可以解決此問題,但也有些風險,如果不到萬不得已,也別隨便用這種方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django項目--靜態首頁的數據緩存(設置、獲取、更新)

0 前言 將處理計算的結果先臨時保存起來,下次使用的時候可以先直接使用,如果沒有這個備份的數據,重新進行計算處理。 將緩存數據保存在內存中 (本項目中保存在redis中) cache注意事項: 1)如果…

關于騰訊算法大賽

騰訊算法大賽 本文參考于我協會前會長吳師兄的文檔 騰訊社交廣告高校算法大賽是面向高校大學生的算法大賽,作為騰訊核心的廣告業務單元,騰訊社交廣告通過對海量社交數據進行深入分析,構建多樣廣告場景,與8億用戶連接對話。在大數據…

列表推導式

#麻煩辦法new_lst []for i in range(10): new_lst.append(i**2)print(new_lst)#簡單辦法print([i**2 for i in range(10)])# 小題下面列表中取余list_a [1,2,3,-5,20,-7]print([i%2 for i in list_a])# 30以內所有能被3整除的數print([won for won in range(30) if won%3 …

軟件過程

軟件過程是為了獲得高質量軟件所需要完成的一系列任務的框架,它規定了完成各項任務的工作步驟。 軟件過程描述為了開發出客戶需要的軟件,什么人(who)、在什么時候(when)、做什么事(what&#x…

【總結整理】JavaScript的DOM事件學習(慕課網)

事件:在文檔或者瀏覽器窗口中發生的一些,特定的交互瞬間 HTML和JavaScript的交互通過事件 來實現 比如:1.滾動條向下滑動,加載圖片 2.圖片輪播,鼠標由2-5頁調換 本章內容1、理解事件流2、使用事件處理程序3、不同的事件…

Python面試題總結(6)--數據類型(綜合)

1. Python 里面如何實現 tuple 和 list 的轉換? 答: Python 中的類型轉換,一般通過類型強轉即可完成 tuple 轉 list 使用 list() 方法 list 轉 tuple 使用 tuple() 方法 2. 我們知道對于列表可以使用切片操作進行部分元素的選擇&#xff0c…

項目經理需要的思維批判

想做好項目經理,就一定要改變你的思維方式。這對于技術出身的朋友尤其重要。 清末人們自以為天朝,他國皆為蠻夷。結果如何呢?喪師辱國,自己淪為病夫。其根本莫非自己腦筋不對頭?后來又搞洋務運動,以為洋人…

NavigationView更改菜單icon和title顏色變化效果

NavigationView menu默認icon和title會隨著菜單狀態改變而改變,選擇某個菜單后再次打開側邊菜單后會發現該菜單的icon和title會變成應用的主顏色,其他菜單項仍然為黑色。 如果想關閉系統默認的這個效果,有兩種方式: 1. XML布局文件…

java項目打鏡像_docker通過dockerfile打java項目鏡像

環境:centos7思路:java -jar 啟動的項目打包成docker images進行運行創建dockerfile——>創建shell腳本——>打包images1、dockerfile內容如下[rootk8s-master xxl-execl]# more dockerfile#網上拖取java8的鏡像FROM java:8MAINTAINER zhangshan-m…

什么是數據庫

數據庫(Database,簡稱DB)是長期儲存在計算機內、有組織的、可共享的大量數據的集合。1.數據庫的基本特征2.數據按一定的數據模型組織、描述和儲存3.可為各種用戶共享4.冗余度較小5.數據獨立性較高6.易擴展

NumPy常用屬性及方法

NumPy是高性能科學計算和數據分析的基礎包。部分功能如下: ndarray, 具有矢量算術運算和復雜廣播能力的快速且節省空間的多維數組。用于對整組數據進行快速運算的標準數學函數(無需編寫循環)。用于讀寫磁盤數據的工具以及用于操作內存映射文件…

Windows下gmssl使用記錄

使用gmssl進行計算sm4,編譯的版本是gmssl2.0,2.1版本編譯不過去 第一步下載軟件,下載Visual Studio 2010旗艦版、nasm-2.13.03-installer-x86、ActivePerl-5.22.4.2205-MSWin32-x86-64int-403863這三個軟件, 注意vs版本不能太低&a…

公司管理項目管理中的技巧

如果在項目實施中選出最難解決的幾個問題,那么管理問題一定名列前茅。在管理問題中,團隊管理又是其中的難點。一個項目管理的好壞,很大程度就體現在團隊的建設和管理上。團隊管理涉及到管理學、心理學和哲學等諸多方面內容,具體實…

數據庫管理系統

什么是數據庫管理系統位于用戶與操作系統之間的一層數據管理軟件是基礎軟件,是一個大型復雜的軟件系統 數據庫管理系統的用途科學地組織和存儲數據、高效地獲取和維護數據數據定義功能提供數據定義語言(DDL)定義數據庫中的數據對象數據組織、…

kangle服務器搭建java_linux下kangle虛擬主機-架設java空間的教程及心得

1. chmod x jdk-6u31-linux-i586-rpm.bin2. ./jdk-6u31-linux-i586-rpm.bin復制代碼(注:如果下載的版本不同輸入實際版本)2.下載插件包:1. wget http://www.kanglesoft.com/download/ent/easypanel-tomcat-lin-1.0.tar.gz2. tar xzf easypanel-tomcat-lin-1.0.tar.g…

Django項目--登錄判斷裝飾器

view.py中定義登錄判斷裝飾器函數 def login_required(view_func):登錄判斷裝飾器def wrapper(request, *view_args, **view_kwargs):# 判斷用戶是否登錄if request.session.has_key(islogin):# 用戶已登錄,調用對應的視圖return view_func(request, *view_args, **view_kwarg…

Apple著手拋棄32位macOS應用程序

\看新聞很累?看技術新聞更累?試試下載InfoQ手機客戶端,每天上下班路上聽新聞,有趣還有料!\\\Apple已經著手拋棄macOS上的32位應用程序了。macOS的下一個維護更新版本High Sierra 10.13.4將會在用戶打開32位應用程序時對…

HiveQL與SQL區別

1、Hive不支持等值連接 ?SQL中對兩表內聯可以寫成:?select * from dual a,dual b where a.key b.key;?Hive中應為?select * from dual a join dual b on a.key b.key; 而不是傳統的格式:SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2WHERE t1.a2 t…

Django項目--csrf攻擊

1.案例流程圖: 2.django防止csrf的方式: 1 ) Django中默認打開csrf中間件。settings.py文件中: MIDDLEWARE_CLASSES (django.contrib.sessions.middleware.SessionMiddleware,django.middleware.common.CommonMiddleware,django.middlewar…