⑴ 如何用js判斷手機操作系統是否為EMUI系統,用js判斷為安卓系統時,EMUI不屬於安卓系統。
這個恐怕不行。web判斷系統類型是通常通過瀏覽器UA來判斷,而安卓瀏覽器的UA一般不會細致到第三方安卓OS的名稱,一般只會出現android以及設備型號名稱,比如華為手機一般在UA會顯示HUAWEIEDISON。
⑵ 如何用JS調用幾十萬原生API
《近匠》HBuilder:如何用JS調用幾十萬原生API?
發表於2014-04-15 18:02| 次閱讀| 來源CSDN| 0 條評論| 作者翟方慶
近匠訪談開發工具HBuilder王安DCloudHTML5
摘要:《近匠》第25期:HBuilder是DCloud開發的一套Web開發IDE,它通過完整的語法提示和代碼輸入法、代碼塊等,大幅提升HTML、JS、css的開發效率。更有意思的是,它可以利用JS調用原生API。
CSDN:請講講團隊和您以往的從業經歷?
DCloud CEO王安:我們團隊從03年起開始做手機App,從J2me、Symbian、Win mobile、Brew一直做到現在的Android、iOS和WP。之前一直在為企業市場提供跨平台手機App的無線中間件。
後來我們看好HTML5的前途,而且也經不住toC市場的誘惑,就毅然出來二次創業。成立了 DCloud.io,開始做基於HTML5的生態系統服務,包括開發工具和雲服務。
我們是W3C的會員,也是HTML5中國產業聯盟的發起單位。我們是一個典型的輕團隊,人不多,但極客化。我們的合夥人之一王淮也在Facebook工作了很久,給我們帶來了很多矽谷的模式。
CSDN:為什麼要做HBuilder這樣一款工具?
王安:人稱HTML5是「性、工、能」缺失,其中「工」指工具不給力,確實如此。
任何主流編程語言,都有優秀的開發IDE,不管是java、.net、Obj-C,但HTML5領域卻一直在用低效的文本編輯器開發。我個人用了十幾年文本編輯器,對比我熟悉的其他語言的IDE,效率也實在讓我受不了。我們就動手開發了HBuilder。
HTML十幾年前初生時,是簡單的標記語言,確實文本編輯器足矣。那時候寫頁面的人都不被視為真正的程序員。但時代不同了,現在JS、css已經發展為真正的編程語言,一個工程會非常龐大,此時沒有IDE會很低效。就像用文本編輯器寫java或Obj-C一樣,效率比專業IDE差很多。
過去也確實沒有太好的HTML5 IDE,更不用提免費的好工具。因為web IDE開發確實很困難,web語法庫沒有統一標准,月月更新,JS是無類型的動態語言……
但是有問題,就會有解決問題的人。所以我們花費大力氣,建立最全的語法庫和瀏覽器兼容資料庫,開發動態JS解析引擎,開源框架語法庫。並且我們在開發效率提升上下了非常大的功夫,快是HBuilder最大的特點,能提升數倍開發效率。
另一方面,HTML5的重要價值是開發手機App,HBuilder為開發者提供移動App開發的全套支持,支持插上數據線真機聯調,不需xcode等原生開發環境就能打包手機App。此外,我們有項創新的技術是JS調用幾十萬原生API。
CSDN:HBuilder是針對移動應用的哪一個環節?在這個環節中,現在是一種什麼狀況?格局是什麼樣的?
王安:使用HTML5、JS、css開發跨平台手機App,這類工具其實之前已經有Phonegap、Titanium。從品類相比,Phonegap只有Runtime沒有IDE,Titanuim的IDE是為其特殊API而製作的專有工具。但HBuilder是一個通用的HTML5開發IDE且又內置了手機runtime。也就是開發者只需要HBuilder就夠了,PC web、Mobile web、App,一個工具一套代碼。
我們推崇一個理念叫「響應式應用」:一套代碼根據不同運行環境調用不同能力來優化用戶體驗。比如文本框,在普通瀏覽器下就是一個文本輸入框,在Chrome瀏覽器下運行時加個判斷調Chrome的語音輸入,而運行在App模式下,則再加一個判斷調用原生的語音識別SDK,比如plus.speech。這樣一個應用可以根據設備的不同而最大化的優化用戶體驗,這種模式很有魅力,對用戶而言體驗更好,對開發者而言成本更低。
當然,比其他同類產品更神奇的一點是,HBuilder里能通過JS代碼的寫法操作幾十萬原生API,即Obj-C和Android原生的對象。
CSDN:HTML5在跨平台App開發上有哪些問題?
王安:前景美好,但卻有四個致命缺點阻礙它的爆發,就是「性、工、能」缺失,碎片化嚴重。相對於原生,HTML5的App性能低,工具差,能力弱。原生雖然不跨平台,但HTML5的瀏覽器兼容性也讓開發者撓頭。HBuilder為了解決這些難題做了很多努力。
1. 先說工具
HBuilder大幅提升了HTML5開發效率。並且也擁有最全且實時更新的HTML5新語法庫。瀏覽器更新版本後一周內其新增的語法就可以被HBuilder提示出來。
HBuilder追求快,還有一個目的,就是降低開發者對框架的依賴。PC Web里框架非常流行,很多框架簡化了開發。但是框架的簡化開發建立在性能下降的基礎上,手機上HTML5本來就慢,層層封裝後只會越來越慢。但開發者使用HBuilder會發現,在HBuilder里不用框架開發的速度,比用其他開發編輯器配合框架的速度,更快。
目前主流HTML5開發工具都更新在沒有手機真機聯調等功能,HBuilder提供了這些功能才能有效的語法庫里幫助開發者開發手機App。
2. 瀏覽器兼容性
由於瀏覽器內核不同,自有擴展語法多,新語法增加速度快,導致碎片化很嚴重,而且是持續性的給開發者造成困擾。HBuilder里每個語法,都有瀏覽器兼容性說明,是目前最全的瀏覽器兼容資料庫。見下圖,-webkit-user-select這個屬性的值域all,IE和Firefox自然不支持,圖標為灰色。但同為webkit內核,Chrome支持;而Android瀏覽器不支持,圖標為灰色;Safari也只有7.0以上才支持,圖標是半亮。
有人說手機上都是webkit內核瀏覽器,應該沒有兼容性問題。但上圖告訴開發者殘酷的真相:iOS、Safari、Android瀏覽器、Chrome安卓版,主流的3款手機瀏覽器一樣有兼容性問題。Google和Apple聯手打破IE的壟斷後,又開始分裂,Chrome去年另起了Blink引擎,開始獨立擴展語法。另外雖然Safari的Mac版和iOS版有點差別,但不多;而Chrome的Android版和Android系統自帶的瀏覽器完全是2個產品。作為開發者,我甚至有點懷念IE壟斷市場的日子。
我們努力做出這個瀏覽器兼容庫,希望可以幫助到廣大開發者。
3. 能力
HTML5規范的好處是跨平台的,但壞處是規范能力比原生差非常多。為了解決這個問題,我們推出了兩套方案:HTML5+的跨平台規范和JS直調原生API。
HTML5+的跨平台規范:開發者常用的手機能力,封裝在HTMLplus.org規范里,包括二維碼、語音輸入等,比如在JS里輸入plus.barcode調用二維碼,plus.speech調用語音輸入。開發一次在不同手機上都可以運行。JS直調原生API:我們提供了plus.ios和plus.android這2個很神奇的對象,使得web開發者不用學習Obj-C,不用買Mac設備,就能在JS里調用原生對象。我們可以這么定義一個JS變數,但實際上是Obj-C對象:我們可以這么定義一個JS變數,但實際上是Obj-C對象:JS直調原生API:我們提供了plus.ios和plus.android這2個很神奇的對象,使得web開發者不用學習Obj-C,不用買Mac設備,就能在JS里調用原生對象。我們可以這么定義一個JS變數,但實際上是Obj-C對象:
var a = plus.ios.implements("NSObject",{"authenticationChanged:":authenticationChanged});
或者如下圖中的:var Intent = plus.android.import("android.content.Intent");其中的"android.content.Intent"是Android的原生類。這段代碼就是使用JS方式給在安卓手機桌面創建一個App快捷方式。這樣,使用HTML5編程的App,在能力方面就和原生一樣強大了。 以前用HTML5做的游戲都無法調用Game Center,O2O應用也調不了Passbook,現在這些都輕而易舉。我們相信這對於web工程師而言,是極大的能力解放,充滿機會的一扇新窗口!
4. 性能
HTML5應用的性能一直是這個產業發展的瓶頸。
手機硬體比PC差、HTML5作為解釋性語言比原生的編譯型語言性能差、手機瀏覽器的默認控制項樣式未優化導致需要在應用層重新封裝UI。這一系列問題疊加在一起,使得性能成為所有HTML5開發者心頭的痛。
另外前端工程師大多長於UI,相比伺服器工程師,他們的代碼性能也要低不少。比如前端工程師很習慣使用框架,框架層層封裝越來越慢,性能如何上的去。HBuilder在解決這個問題上也花費了很多心血:
a. 調用原生繪制界面
在HTML5+規范里有一個plus.ui的子集。一些原生樣式或動畫,比如翻頁動畫或下拉刷新,使用HTML5+JS+css模擬要寫很多代碼,執行起來很慢,此時通過plus.ui擴展就可以在窗體上設置一塊區域,交給原生繪制。性能可大幅提升。
b. 性能第一的UI庫
以前宣稱為手機優化的框架,其實都不是把性能作為產品取捨的第一優先,或者為了框架使用者方便、或者為了框架維護者方便而犧牲了執行性能。我們決定自己做一個。這個項目我們還在開發中,不久會上線。
我們沒有把它稱為框架而是叫UI庫,是因為這里的控制項都是使用最簡單的css樣式的,直接寫class=」xxx」。相比於寫成data-role,然後在JS運行時才替換Dom,使用class的方式要高效的多。
控制項含有的必要的JS代碼,也是本著性能優先的原則開發的,代碼極其精簡高效,沒有$等三方框架,但又可以跨手機瀏覽器。並且這套UI庫會和HBuilder的打包機、Runtime深度整合,做到更高性能的優化。
CSDN:相對於編寫大量JS實現來說,HBuilder利用JS調用原生API,有哪些優點?
王安:JS調用原生API,最大的優點,是大大強化了HTML5的能力,突破了瀏覽器的限制,原生有幾十萬API,數量遠多於HTML5。比如攔截Android來電。
JS的執行效率肯定還是低於原生的,提升性能需要使用前述方案。
這項技術對於JS程序員來講是非常友好易學的,他不需要學習原生語言和配置開發環境,只需要查詢每個原生對象是做什麼用的,然後在JS的plus.ios或plus.andriod里把原生類名作為參數傳進去,就可以通過JS調用該原生對象的方法。
我們還製作了一批常用原生代碼模板,包括創建快捷方式、登錄game center的樣例代碼已經預置在HBuilder里。
CSDN:JS調用原生API,是如何實現的?
王安:這個非常復雜,不同的api需要不同的方法,手機、雲、IDE的共同配合。IDE的顯示代碼、打包機編譯、runtime實際運行這幾種情況下執行碼是不同的。
CSDN:HTML5跨平台開發領域的趨勢是怎麼的?
王安:HTML5的光明前途是毋庸置疑的,當Java被攔在iOS門外時、當終端和屏幕越來越多樣時,HTML5的簡單易用和跨平台這些特點都代表了未來的方向。
現在的問題僅僅是阻礙HTML5發展的那幾個難題,會在何時、會被哪些人解決。當性能、工具、能力、兼容性得到有效突破時,HTML5必將迎來發展爆發。
CSDN:接下來針對HBuilder,Dcloud還有哪些計劃?
王安:除了上面提到的高性能手機UI框架,HBuilder下一步會引入SNS和UGC,強化插件體系,聯合眾多開發者打造大家更滿意的工具和服務。我們很認真的開發著這個免費工具,也希望所有開發者都參與到這個工具的打造中來。目前HBuilder已經在 github.com/dcloudio上設立了3個開源項目,歡迎大家一起打造自己滿意的工具。
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
⑶ 用js判斷用戶瀏覽器是否是XP
下面是兩個比較典型的IE6瀏覽器UserAgent欄位:
1、Windows XP + SP1 (NT 5.1)
Connection: Keep-Alive
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-cn
Host: lee.aehk.com
Referer: http://www.cnblogs.com/birdshome/archive/2005/03/11/113723.html
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
2、Windows 2003 + SP1 (NT 5.2)
Connection: Keep-Alive
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-cn
Host: lee.aehk.com
Referer: http://www.cnblogs.com/bluefee/archive/2005/03/28/127455.html
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)
UA-CPU: x86
這兩個UA string和普通的UA string最大區別就是,裡面多了一個"SV1"標志,這個是什麼意思呢?SV1的本意是"Security Version 1",它就是用來專門標注使用IE6瀏覽器的用戶使用的操作系統是否是XPSP2或WS03SP1。
既然XPSP2和WS03SP1對IE6有影響,為什麼不提升IE的版本號,而是單獨使用SVX標注呢?IE開發團隊是這么解釋的,他們說雖然這兩個操作系統的補丁對IE6的設置有影響,但是並沒有修改IE6本身的任何功能,比如呈現、DHTML和DOM等。所以這樣的一些安全設置不適合升級IE本身的版本號。
在後續的IE版本中,SVX標志可能會被移除,所以目前我們使用UA string檢測操作系統的SP版本,只是一個臨時的辦法。
var ua = navigator.userAgent;
if ( ua.indexOf("SV1") != -1 )
{
if ( ua.indexOf("NT 5.1") != -1 )
{
// windows xp + sp2
}
else if ( ua.indexOf("NT 5.2") != -1 )
{
// windows 2003 + sp1
}
else
{
// wrong user agent string
}
}