在開發(fā)過程中,有這么一個需求,無線傳輸設(shè)備給安卓傳送一串字符,安卓接受并轉(zhuǎn)發(fā)給前端頁面。
字段形如:font-family:'黑體'
前端要根據(jù)傳輸過來的字符進(jìn)行變更頁面的字體,問題悄無聲息的出現(xiàn)了......
在windows系統(tǒng)中,可以直接調(diào)用'黑體'字體庫。在安卓中卻行不通,在經(jīng)過測試以后發(fā)現(xiàn),可以通過@font-face自定義
字體,指定安卓系統(tǒng)字體文件后,就可以調(diào)用字體庫。
但是,如何進(jìn)行動態(tài)的切換font-face中的src路徑呢? 以保證可以正常的在安卓系統(tǒng)中 切換h5頁面的字體。
=======================================================================================
經(jīng)過指點,解決過程如下:
1.字體切換要考慮到原先的樣式是否存在-->如果存在則刪除style標(biāo)簽重新添加新的標(biāo)簽
2.字體切換要考慮到原先的樣式是否存在-->如果存在則刪除style標(biāo)簽內(nèi)所有樣式重新添加新的樣式
方法1中 與 方法2在時間上差不多,但是涉及到刪除節(jié)點,保險起見,我還是選擇2了。
首次切換字體存在5ms-10ms的白板畫面,具體原因不知道... 麻煩知道原因的大神,不吝賜教!
附上demo代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
</head>
<body>
<section>
<p>我愛中華人民共和國啊?。。?lt;/p>
</section>
</body>
<script>
const xsStyle = `@font-face{
font-family:myFont;
src:url(./xingshu.TTF);
}
section p{
font-family:myFont;
}`;
const ftStyle = `@font-face{
font-family:myFont;
src:url(./msjh.ttf);
}
section p{
font-family:myFont;
}`;
window.onload = function() {
let count = 0;
let style = '';
setInterval(function() {
count++;
if (count == 1) {
style = ftStyle;
} else {
style = xsStyle;
count = 0;
}
changeFont(style);
}, 3000);
}
// method 2
function changeFont(style) {
let headEleNode = document.getElementsByTagName('head')[0];
let headChildNode = headEleNode.children;
let childList = headChildNode.length;
let styleNode = document.createElement('style');
for (let i = 0; i < childList; i++) {
if (headChildNode[i].tagName == 'STYLE') {
headChildNode[i].innerHTML = style;
return;
}
}
styleNode.type = 'text/css';
styleNode.innerHTML = style;
headEleNode.appendChild(styleNode);
}
// method 1
// function changeFont(style) {
// let headEleNode = document.getElementsByTagName('head')[0];
// let headChildNode = headEleNode.children;
// let childList = headChildNode.length;
// let styleNode = document.createElement('style');
// for (let i = 0; i < childList; i++) {
// if (headChildNode[i].tagName == 'STYLE') {
// headEleNode.removeChild(headChildNode[i]);
// }
// }
// styleNode.type = 'text/css';
// styleNode.innerHTML = style;
// headEleNode.appendChild(styleNode);
// }
</script>
</html>
總結(jié): 由于基礎(chǔ)薄弱,認(rèn)為style無法進(jìn)行操作,所以導(dǎo)致問題的出現(xiàn)。非常感謝大神的解析,另外首次創(chuàng)建標(biāo)簽時,需要花費較長時間,而再次創(chuàng)建標(biāo)簽時則不需要花費較長時間,不知道原因是什么,麻煩知道的大神賜教~~~
如果事先寫好css文件,可以動態(tài)創(chuàng)建link標(biāo)簽,把相關(guān)字體css文件引進(jìn)來
function changeFont(url){
var doc=document;
var link=doc.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.setAttribute("href", url);
var heads = doc.getElementsByTagName("head");
if(heads.length)
heads[0].appendChild(link);
else
doc.documentElement.appendChild(link);
}
如果事先沒有css文件,可以動態(tài)創(chuàng)建style標(biāo)簽,再插到head中
var newFont = "@font-face
{
font-family: myFont;
src: url('aa.ttf'),
url('aa.eot');
}
div
{
font-family:myFont;
}"
function addStyleNode( str){
var styleNode=document.createElement("style");
styleNode.type="text/css";
if( styleNode.styleSheet){
styleNode.styleSheet.cssText= str;
}else{
styleNode.innerHTML=str;
}
document.getElementsByTagName("head")[0].appendChild( styleNode );
}
addStyleNode(newFont);
原文鏈接:S動態(tài)引入js,CSS——動態(tài)創(chuàng)建script/link/style標(biāo)簽
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。