解決kindediter中的iframe用ipad訪問時無法滾動的問題

一、前言

好久木有寫點東西了,最近一直忙着開發,本來想晚上幹完活後還想再做點什麼有意義的事,直接累趴下了睡覺,今天趁着有時間趕快把這個解決問題的過程記錄下來,備以後參考,也給其他遇到同樣問題的朋友一個思路。ok,開始吧!


二、從ipad對iframe的偏見開始說起

儘管越來越多的人不推薦使用iframe,但有些時候我們還是無法避免要使用到iframe,例如使用了kindediter(其生成的編輯框中爲一個iframe)。當你的頁面使用了iframe並且需要支持ipad訪問時,就不得不做一些工作了。

首先,是爲iframe設置高度會不起作用。無論是使用height屬性,還是在css中指定高度,都無效。解決此問題的辦法是爲iframe再加一個父容器,並且爲父容器指定高度。代碼結構應該是這樣的:

<div style="height:500px;">
    <iframe style="height:500px;"></iframe>
</div>
另外一個問題,就是本文的核心內容,iframe的內容很長時,ipad下無法滾動,你只能看着上半截內容乾着急。。。


三、網上搜搜解決辦法

經搜索,網上對此還是有不少的解決辦法的,主要思想是用js解決,我找到一個比較精巧的,聲明的函數如下,代碼先貼出來:

var toScrollFrame = function(iFrame, mask){ 
	var mouseY = 0; 
	var mouseX = 0; 
	
	$(iFrame).ready(function(){ 
		$(iFrame).contents()[0].body.addEventListener('touchstart', function(e){ 
			mouseY = e.targetTouches[0].pageY; 
			mouseX = e.targetTouches[0].pageX; 
		}); 
		
		$(iFrame).contents()[0].body.addEventListener('touchmove', function(e){ 
			e.preventDefault(); 
			var box = $(mask); 
			box.scrollLeft(box.scrollLeft()+mouseX-e.targetTouches[0].pageX); 
			box.scrollTop(box.scrollTop()+mouseY-e.targetTouches[0].pageY); 
		}); 
	}); 
	
}; 

可以看到使用了jquery的語法,所以在使用時你的網頁中要引入jquery。觀其代碼,其實就是在iframe加載完畢的時候,爲內部的document添加了touchstart和touchmove監聽器,然後將滑動的數值加到外層的一個容器上。使用的時候只要在頁面加載完畢調用即可:如代碼:

<style>
.myMask{ 
width: 100%; 
height: 245px; 
overflow: auto; 
} 
.myFrame{ 
width: 100%; 
height: 245px; 
}
</style>
<body class="content" onload="toScrollFrame('.myFrame','.myMask')">
<div id="a">
<div class='myMask' style="height:200px; display:block;"> 
<IFRAME class='myFrame' id = "lead_frame" NAME="lead_frame" style="border-style:thin;" ALIGN="center" FRAMEBORDER="1" WIDTH="98%" HEIGHT="245" SRC='2.html'></IFrame> 
</div> 
</div>
</body>

注意::外層div一定要設置overflow屬性爲auto,否則不能起作用。

 在ipad上瀏覽一下,可以滾動了!


四、將該函數應用到項目中

如此精簡的代碼就能解決了問題,真是讓人心情大爽!好,把它應用到項目中去。接下來就該說說這個國產在線編輯器kindeditor了,功能強大,bug諸多。(若是想簡單實現富文本編輯問題不大,若想實現複雜點的功能,它可夠讓人頭疼的,爲此我已經將源碼改的千瘡百孔了。。。),使用過kindeditor的應該知道,其編輯部分是一個iframe(應該是爲了避免css與頁面中的其他定義衝突),那我們就拿這個iframe開刀。

測試頁面上,我們在body的onload事件中調用了這個函數,但是在使用編輯器的時候,頁面一開始是沒有iframe的,是在編輯器出現的時候纔有。所以調用函數的時機自然是編輯窗口創建完成後,查看kindeditor API,afterCreate,此參數正和我意。 那麼函數的兩個參數如何傳呢,看一下kiindeditor的DOM結構:


就是紅色圈出來的那兩個啦!在調用kindeditor的地方這麼寫:

afterCreate:function(){
			if($.isMobile()){
			    $('.ke-edit').css('overflow','auto');//這個overflow千萬不能忘記!!!
			    toScrollFrame('.de-edit-iframe','.ke-edit');	
				}
							
	}
可以看到我還用了一個$.isMobile函數,是用來判斷客戶端是否是移動設備。代碼如下:

sUserAgent= navigator.userAgent.toLowerCase(); 
 bIsIpad= sUserAgent.match(/ipad/i) == "ipad"; 
 bIsIphoneOs= sUserAgent.match(/iphone os/i) == "iphone os"; 
 bIsMidp= sUserAgent.match(/midp/i) == "midp"; 
 bIsUc7= sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4"; 
 bIsUc= sUserAgent.match(/ucweb/i) == "ucweb"; 
 bIsAndroid= sUserAgent.match(/android/i) == "android"; 
 bIsCE= sUserAgent.match(/windows ce/i) == "windows ce"; 
 bIsWM= sUserAgent.match(/windows mobile/i) == "windows mobile"; 

         
//是否是移動設備
$.isMobile = function(){
	if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) { 
            return true;
         }
	return false;
}

這個函數是通用的,此處只判斷客戶端是否是ipad,所以把其他的刪掉。現在全貼出來了,供大家參考。


五、結束了

好了,現在你可以享受在ipad上把iframe滑上滑下的快感了,爽!

那麼,通過這個問題學到了點什麼呢?首先,這個核心函數toScrollFrame,其實並不難寫,而我卻花了半天的時間,在網上找了各種插件,最後才把它篩選出來。假如,一開始我並沒有從網上找資料,而是自己想如何實現它,那我是不是也可以寫出這個函數呢??或許從小白到大牛,也就在於這一點呢,有一天,遇到問題時,我自己寫出解決方案!共勉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章