1. 程式人生 > >去除ios移動端alert/confirm的網址(url)

去除ios移動端alert/confirm的網址(url)

去除移動端alert/confirm的網址(url),有需要的朋友可以參考下。

在移動端使用原生的alert/confirm總是會顯示網址(url),介面看起來很醜,搜尋半天也找不到解決辦法,在絕望的時候看到一篇文章寫的很好,在此感謝http://ifindever.com/archives/260.html,還希望能幫助到大家。

最近在做小小創客 webapp,碰到一個問題,以前的版本,ios 和Android都可以通過重寫webview的alert等彈窗事件來隱藏掉彈窗的標題,但是ios7之後,api被禁用了,導致ios無法重寫隱藏標題:

1.通過js呼叫ios原生程式碼來實現,即:window.alert = function(str){window.local.href = " xx://str/" +str}

2.js+html+css模擬,但是為了實現alert等的阻塞執行,需要把後面的程式碼放入回撥函式中執行

但是還是感覺這兩種方式實現不太優雅,都需要對現有程式碼做比較大的改動,不死心,於是繼續google,終於發現個好辦法:

<span style="font-size:10px;">     <script>
		window.alert = function(name){
			 var iframe = document.createElement("IFRAME");
			iframe.style.display="none";
			iframe.setAttribute("src", 'data:text/plain,');
			document.documentElement.appendChild(iframe);
			window.frames[0].window.alert(name);
			iframe.parentNode.removeChild(iframe);
		}
			
		alert('xxx');
		</script></span>

這個方法在於重寫了alert方法(confirm方法同理),不需要改動現有程式碼,並且解決了彈窗標題出現網址的問題。不過需要注意的是,每次在框架中執行完一個alert/confirm後,需要將框架移除,下次再重新載入,否則在chrome中會引發跨域執行,從而被chrome攔截。

這裡還有confirm,重寫window.confirm之後,確認和取消點選的事件都是執行取消,這時需要這樣寫:

confirm需要return子框架的結果:

var result = window.frames[0].window.confirm(name);
    iframe.parentNode.removeChild(iframe);
    return result;