jsandroidjson
『壹』 android js 交互 能傳json對象嗎
最近幾個項目的測試結果,Android無法主動通過調用
webview.loadUrl("javascript:"+callbackFunction+"('"+data+"')"); 這種方式將jsonobject類型的data傳給js,因為js那邊得到就是一個string的對象。
與此同時,js主動調用android的對象方式,android也無法返回給js一個jsonobject,需要js做一下轉換,例如:
Android 代碼:
[java] view plainprint?
WebView mWebView = (WebView) this.findViewById(R.id.webview);
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setPluginsEnabled(true);
settings.setAllowFileAccess(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);//不加上,會顯示白邊
String url="file:///android_asset/t.html"; //js代碼卸載t.html里
NavigationInstance navigation =new NavigationInstance(this);
mWebView.addJavascriptInterface(navigation, "Navigation");
NavigationInstance里的代碼:
[java] view plainprint?
@Override
public JSONObject GetManeuverInfo() {
try{
JSONObject test=new JSONObject();
test.put("maomao", "value");
return test;
//return new JSONObject(bean.ManeuverInfo);
}catch(Exception e){
Log.e(TAG, "",e);
}
return null;
}
t.html里的代碼:
[javascript] view plainprint?
function testAPI(el){
console.log("---------testAPI---------");
eval("var obj = "+Navigation.GetManeuverInfo());
alert('typeof:'+typeof(obj));
alert('maomao:'+obj.maomao);
alert('obj:'+obj);
}
如果直接寫成 Navigation.GetManeuverInfo.maomao是會提示undefined,因為js那邊只得到了一個string對象而已,它不知道maomao是個key。
通過eval將其轉化成表達式就可以調用obj.maomao得到value。
在此ps一下ios,貌似人家支持webview很好,js可以直接獲取到json對象.
『貳』 jsbridge android 匹配無效 被斷開什麼原因
native向js的通信協議也需要制定,一個必不可少的元素就是返回值,這個返回值和js的參數做法一樣,通過json對象進行傳遞,該json對象中有狀態碼code,提示信息msg,以及返回結果result,如果code為非0,則執行過程中發生了錯誤,錯誤信息在msg中,返回結果result為null,如果執行成功,返回的json對象在result中。下面是兩個例子,一個成功調用,一個調用失敗。
Java
{
"code":500,
"msg":"method is not exist",
"result":null
}
Java
{
"code":0,
"msg":"ok",
"result":{
"key1":"returnValue1",
"key2":"returnValue2",
"key3":{
"nestedKey":"nestedValue"
"nestedArray":["value1","value2"]
}
}
}
那麼這個結果如何返回呢,native調用js暴露的方法即可,然後將js層傳給native層的port一並帶上,進行調用即可,調用的方式就是通過WebView.loadUrl方式來完成,如下。
Java
1
mWebView.loadUrl("javascript:JSBridge.onFinish(port,jsonObj);");
關於JsBridge.onFinish方法的實現,後面再敘述。前面所提到了native層的方法必須遵循某種規范,不然就非常不安全了。在native中,我們需要一個JSBridge統一管理這些暴露給js的類和方法,並且能實時添加,這時候就需要這么一個方法
Java
JSBridge.register("jsName",javaClass.class)
這個javaClass就是滿足某種規范的類,該類中有滿足規范的方法,我們規定這個類需要實現一個空介面,為什麼呢?主要作用就混淆的時候不會發生錯誤,還有一個作用就是約束JSBridge.register方法第二個參數必須是該介面的實現類。那麼我們定義這個介面
Java
publicinterfaceIBridge{
}
類規定好了,類中的方法我們還需要規定,為了調用方便,我們規定類中的方法必須是static的,這樣直接根據類而不必新建對象進行調用了(還要是public的),然後該方法不具有返回值,因為返回值我們在回調中返回,既然有回調,參數列表就肯定有一個callback,除了callback,當然還有前文提到的js傳來的方法調用所需的參數,是一個json對象,在java層中我們定義成JSONObject對象;方法的執行結果需要通過callback傳遞回去,而java執行js方法需要一個WebView對象,於是,滿足某種規范的方法原型就出來了。
Java
publicstaticvoidmethodName(WebViewwebview,JSONObjectjsonObj,Callbackcallback){
}
js層除了上文說到的JSBridge.onFinish(port,jsonObj);方法用於回調,應該還有一個方法提供調用native方法的功能,該函數的原型如下
Java
JSBridge.call(className,methodName,params,callback)
在call方法中再將參數組合成形如下面這個格式的uri
Java
jsbridge://className:callbackAddress/methodName?jsonObj
然後調用window.prompt方法將uri傳遞過去,這時候java層就會收到這個uri,再進一步解析即可。
萬事具備了,只欠如何編碼了,別急,下面我們一步一步的來實現,先完成js的兩個方法。新建一個文件,命名為JSBridge.js
Java
(function(win){
varhasOwnProperty=Object.prototype.hasOwnProperty;
varJSBridge=win.JSBridge||(win.JSBridge={});
varJSBRIDGE_PROTOCOL='JSBridge';
varInner={
callbacks:{},
call:function(obj,method,params,callback){
console.log(obj+" "+method+" "+params+" "+callback);
varport=Util.getPort();
console.log(port);
this.callbacks[port]=callback;
varuri=Util.getUri(obj,method,params,port);
console.log(uri);
window.prompt(uri,"");
},
onFinish:function(port,jsonObj){
varcallback=this.callbacks[port];
callback&callback(jsonObj);
deletethis.callbacks[port];
},
};
varUtil={
getPort:function(){
returnMath.floor(Math.random()*(130));
},
getUri:function(obj,method,params,port){
params=this.getParam(params);
varuri=JSBRIDGE_PROTOCOL+'://'+obj+':'+port+'/'+method+'?'+params;
returnuri;
},
getParam:function(obj){
if(obj&typeofobj==='object'){
returnJSON.stringify(obj);
}else{
returnobj||'';
}
}
};
for(varkeyinInner){
if(!hasOwnProperty.call(JSBridge,key)){
JSBridge[key]=Inner[key];
}
}
})(window);
java層有一個空介面來進行約束暴露給js的類和方法,同時也便於混淆
Java
publicinterfaceIBridge{
}
首先我們要將js傳來的uri獲取到,編寫一個WebChromeClient子類。
Java
{
@Override
publicbooleanonJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,JsPromptResultresult){
result.confirm(JSBridge.callJava(view,message));
returntrue;
}
}
之後不要忘記了將該對象設置給WebView
Java
WebViewmWebView=(WebView)findViewById(R.id.webview);
WebSettingssettings=mWebView.getSettings();
settings.setJavaScriptEnabled(true);
mWebView.setWebChromeClient(newJSBridgeWebChromeClient());
mWebView.loadUrl("file:///android_asset/index.html");
核心的內容來了,就是JSBridgeWebChromeClient中調用的JSBridge類的實現。前文提到該類中有這么一個方法提供注冊暴露給js的類和方法
Java
JSBridge.register("jsName",javaClass.class)
該方法的實現其實很簡單,從一個Map中查找key是不是存在,不存在則反射拿到對應的Class中的所有方法,將方法是public static void 類型的,並且參數是三個參數,分別是Webview,JSONObject,Callback類型的,如果滿足條件,則將所有滿足條件的方法put進去,整個實現如下
Java
publicclassJSBridge{
privatestaticMap>exposedMethods=newHashMap();
publicstaticvoidregister(StringexposedName,ClassextendsIBridge>clazz){
if(!exposedMethods.containsKey(exposedName)){
try{
exposedMethods.put(exposedName,getAllMethod(clazz));
}catch(Exceptione){
e.printStackTrace();
}
}
}
(ClassinjectedCls)throwsException{
HashMapmMethodsMap=newHashMap();
Method[]methods=injectedCls.getDeclaredMethods();
for(Methodmethod:methods){
Stringname;
if(method.getModifiers()!=(Modifier.PUBLIC|Modifier.STATIC)||(name=method.getName())==null){
continue;
}
Class[]parameters=method.getParameterTypes();
if(null!=parameters¶meters.length==3){
if(parameters[0]==WebView.class&¶meters[1]==JSONObject.class&¶meters[2]==JSCallback.class){
mMethodsMap.put(name,method);
}
}
}
returnmMethodsMap;
}
}
publicstaticStringcallJava(WebViewwebView,StringuriString){
StringmethodName="";
StringclassName="";
Stringparam="{}";
Stringport="";
if(!TextUtils.isEmpty(uriString)&uriString.startsWith("JSBridge")){
Uriuri=Uri.parse(uriString);
className=uri.getHost();
param=uri.getQuery();
port=uri.getPort()+"";
Stringpath=uri.getPath();
if(!TextUtils.isEmpty(path)){
methodName=path.replace("/","");
}
}
if(exposedMethods.containsKey(className)){
HashMapString,Method>methodHashMap=exposedMethods.get(className);
if(methodHashMap!=null&methodHashMap.size()!=0&&methodHashMap.containsKey(methodName)){
Methodmethod=methodHashMap.get(methodName);
if(method!=null){
try{
method.invoke(null,webView,newJSONObject(param),newCallback(webView,port));
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
returnnull;
}
publicclassCallback{
privatestaticHandlermHandler=newHandler(Looper.getMainLooper());
_JS_FORMAT="javascript:JSBridge.onFinish('%s', %s);";
privateStringmPort;
;
publicCallback(WebViewview,Stringport){
mWebViewRef=newWeakReference(view);
mPort=port;
}
publicvoidapply(JSONObjectjsonObject){
finalStringexecJs=String.format(CALLBACK_JS_FORMAT,mPort,String.valueOf(jsonObject));
if(mWebViewRef!=null&mWebViewRef.get()!=null){
mHandler.post(newRunnable(){
@Override
publicvoidrun(){
mWebViewRef.get().loadUrl(execJs);
}
});
}
}
}
{
publicstaticvoidshowToast(WebViewwebView,JSONObjectparam,finalCallbackcallback){
Stringmessage=param.optString("msg");
Toast.makeText(webView.getContext(),message,Toast.LENGTH_SHORT).show();
if(null!=callback){
try{
JSONObjectobject=newJSONObject();
object.put("key","value");
object.put("key1","value1");
callback.apply(getJSONObject(0,"ok",object));
}catch(Exceptione){
e.printStackTrace();
}
}
}
(intcode,Stringmsg,JSONObjectresult){
JSONObjectobject=newJSONObject();
try{
object.put("code",code);
object.put("msg",msg);
object.putOpt("result",result);
returnobject;
}catch(JSONExceptione){
e.printStackTrace();
}
returnnull;
}
}
你可以往該類中扔你需要的方法,但是必須是public static void且參數列表滿足條件,這樣才能找到該方法。
不要忘記將該類注冊進去
Java
JSBridge.register("bridge",BridgeImpl.class);
進行一下簡單的測試,將之前實現好的JSBridge.js文件扔到assets目錄下,然後新建index.html,輸入
html>
head>
metacharset="utf-8">
title>JSBridgetitle>
metaname="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1, user-scalable=no"/>
scriptsrc="file:///android_asset/JSBridge.js"type="text/javascript">script>
scripttype="text/javascript">
script>
style>
style>
head>
body>
div>
h3>JSBridge測試h3>
div>
ulclass="list">
li>
div>
buttononclick="JSBridge.call('bridge','showToast',{'msg':'Hello JSBridge'},function(res){alert(JSON.stringify(res))})">
測試showToast
button>
div>
li>
br/>
ul>
body>
html>
『叄』 如何用java編寫android後台程序
使用J2EE技術或者叫Java Web技術開發一個Web伺服器,伺服器返回Json數據,android客戶端解析json數據,使用http協議和伺服器通信,android有相應模塊和API。
首先樓主得懂Java後台也就是Java EE,用Servlet搭建Web服務,Serlvet映射一個URL,Android請求這個URL,Servlet處理請求,然後就是Java編程,Web分層、JDBC等技術。伺服器返回標準的JSON輕量數據(就是純文本),Android來解析。
具體技術:
(1)Java Servlet作為Web服務的處理入口;
(2)Java編程編寫業務處理程序;
(3)JDBC訪問資料庫;
(4)Android端的HTTP模塊,API;
(5)Android端解析JSON數據;
(6)Servlet或者Java端生成JSON數據;
等樓主技術強了,就可以接觸各種框架、EJB技術了。Spring、Spring MVC、Struts、Hibernate,甚至NOSQL、分布式、負載、node.js、模板技術等等。
『肆』 在Android上怎樣實現JAVA和JS交互
在Android的開發過程中、遇到一個新需求、那就是讓Java代碼和Javascript代碼進行交互、在IOS中實現起來很麻煩、而在Android中相對來說容易、Android對這種交互進行很好的封裝、其實可以很簡單的用Java代碼調用WebView中的js函數、也可以用WebView中的js來調用Android應用中的Java代碼
一、網頁的JS代碼調用ANDROID中JAVA代碼的方法
在網頁中調用java代碼、需要在webview控制項中添加javascriptInterface
contentWebView = (WebView) findViewById(R.id.webview);
//啟用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
contentWebView.addJavascriptInterface(this, "js對象名");
在Activity中定義一個要被js調用的方法、src為js傳遞過來的參數、如果沒有不傳也可以的。
public void jsFunction(final String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
//在里對Android應用的UI進行處理
}
});
}
在網頁中、只需要像調用js方法一樣、進行調用就可以
<a onClick="window.js對象名.jsFunction(´hello world´)" >
點擊調用java代碼並傳遞參數
</a>
二、ANDROID中JAVA代碼調用網頁的JS代碼的方法
Java代碼調用js並傳參其實是通過WebView的loadUrl方法去調用的、只是參數url的寫法不一樣
// 無參數調用
contentWebView.loadUrl("javascript:javacalljs()");
// 傳遞參數調用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");
三、JAVA和JS交互注意事項
1、Java 調用 js 裡面的函數、效率並不是很高、估計要200ms左右吧、做交互性很強的事情、這種速度很難讓人接受、而js去調Java的方法、速度很快、50ms左右、所以盡量用js調用Java方法
2、Java 調用 js 的函數、沒有返回值、調用就控制不到
3、Js 調用 Java 的方法、返回值如果是字元串、你會發現這個字元串是 native 的、轉成 locale 的才能正常使用、使用 toLocaleString() 函數就可以、不過這個函數的速度並不快、轉化的字元串如果很多、將會很耗費時間
4、網頁中盡量不要使用jQuery、執行起來需要5-6秒、最好使用原生的js寫業務腳本、以提升載入速度、改善用戶體驗
『伍』 webview判斷 js是否有 交互對象
android與js交互有兩種方式,第一種是通過系統提供的@JavascriptInterface註解實現,第二種就是js注入。下面來詳細講解一下二者的使用方式,原理,區別。
一、@JavascriptInterface實現
實現步驟:
a.設置WebView支持js腳本
b.為提供給js調用的方法加上@JavascriptInterface註解c.給WebView添加js介面
[java] view plain
webView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(new JSMethod(mContext), "lh");public class JSMethod {
private Context mContext;
public JSMethod(Context mContext) {
this.mContext = mContext;
}
@JavascriptInterface
public void toast(String msg) {
Toast.makeText(mContext, msg == null ? "" : msg, Toast.LENGTH_SHORT).show();}
}
js端調用android方法:
[javascript] view plain
lh.toast("Hello,China!");
android端執行js方法:
[java] view plain
webView.loadUrl("javascript:console(" + "'Hello,China!'" + ")"");二、js注入實現
先來說說原理吧,當js調用prompt()方法時,WebChromeClient.onJsPrompt()方法會被觸發,當js觸發Android提供的介面方法時,將該方法的方法名稱、參數類型、參數值轉成json,然後通過prompt方法傳遞給android端,android端解析json並通過反射執行對應的方法,同時也支持執行匿名回調。
整個流程比較復雜,看圖:
為WebView綁定WebChormeClient監聽,在Html載入進度25%時進行js注入(注入的js是根據android提供給js的對象類名動態生成);動態注入的js代碼如下:
[javascript] view plain
javascript: (function(b) {
console.log("HostApp initialization begin");var a = {
queue: [],
callback: function() {
var d = Array.prototype.slice.call(arguments, 0);//獲取該函數參數並轉換為Array數組var c = d.shift();//取得數組第一個元素
var e = d.shift();
this.queue[c].apply(this, d);//新建一個對象 屬性名稱為取得的c,並將d數組作為他的值。然後將這個對象push到queue數組if(!e) {//e為空的時候,將queue數組屬性名稱為c的對象刪除delete this.queue[c]
}
}
};
//各種賦值,最後都等於同一個函數
a.alert = a.alert = a.alert = a.delayJsCallBack = a.getIMSI = a.getOsSdk = a.goBack = a.overloadMethod = a.overloadMethod = a.passJson2Java = a.passLongType = a.retBackPassJson = a.retJavaObject = a.testLossTime = a.toast = a.toast = function() {var f = Array.prototype.slice.call(arguments, 0);if(f.length < 1) {
throw "HostApp call error, message:miss method name"}
var e = [];
//此段判斷,然後賦值
for(var h = 1; h < f.length; h++) {
var c = f[h];
var j = typeof c;
e[e.length] = j;
if(j == "function") {
var d = a.queue.length;
a.queue[d] = c;
f[h] = d
}
}
//將匿名對象{method: f.shift(),types: e,args: f}轉換成json字元串並用瀏覽器彈出確認可輸入框,然後取得輸入框的值json序列化為js對象var g = JSON.parse(prompt(JSON.stringify({method: f.shift(),
types: e,
args: f
})));
if(g.code != 200) {
throw "HostApp call error, code:" + g.code + ", message:" + g.result}
return g.result
};
//獲取a的屬性值,然後循環
Object.getOwnPropertyNames(a).forEach(function(d) {var c = a[d];
//判斷賦值
if(typeof c === "function" && d !== "callback") {a[d] = function() {
//concat 連接兩個數組
return c.apply(a, [d].concat(Array.prototype.slice.call(arguments, 0)))}
}
});
b.HostApp = a;
console.log("HostApp initialization end")})(window);//閉包函數默認執行,然後賦給window。這樣window.b就可以執行了 b.HostApp就是執行a的內容,但是a具體處理邏輯不對外開放,避免外部污染a內部邏輯代碼不難,可以自行理解,其中回調函數被封裝在了a對象裡面,確保android端可以通過webview.loadUrl()執行回調。
android端回調js代碼如下:
[javascript] view plain
javascript:HostApp.callback(0, 0 ,"call back haha");android提供的每一個js方法都對應一個JsCallback對象,android就可以通過JsCallback對象來生成並執行回調js的代碼。
三、優缺點
a.第一種方式不安全,不添加addJavascriptInterface,甚至默認false,在低於API17的WebView上默認添加"SearchBoxJavaBridge_"到mJavaScriptObjects中。這樣就有可能通過用戶信任的客戶端獲取SD卡的數據;b.第一種方式必須要API大於等於17才能使用
c.第一種方式當有js回調函數需要android端執行時,都需要將匿名回調函數賦值給全局函數才能供android端回調,增加了js和android端通信的封裝層的低效代碼量;而第二種方式則是通過動態注入js的方式則非常方便。
d.第二種方式也有一定限制,比如android提供的方法必須是static修飾的,且方法第一個參數必須為WebView,不過這不影響使用。
『陸』 在windows系統中,常見的文件類型主要由哪幾種
常見的文件類型
1、文檔文件
txt(所有文字處理軟體或編輯器都可打開)、doc(word及wps等軟體可打開)、hlp(adobe acrobat reader可打開)、wps(wps軟體可打開)、rtf(word及wps等軟體可打開)、html(各種瀏覽器可打開、用寫字板打開可查看其源代碼)、pdf(adobe acrobat reader 和各種電子閱讀軟體可打開)
2、壓縮文件
rar(winrar可打開)、zip(winzip可打開)、arj(用arj解壓縮後可打開)、gz(unix系統的壓縮文件,用winzip可打開)、z(unix系統的壓縮文件,用winzip可打開)
3、圖形文件
bmp、gif、jpg、pic、png、tif(這些文件類型用常用圖像處理軟體可打開)
4、聲音文件
wav(媒體播放器可打開)、aif(常用聲音處理軟體可打開)、au(常用聲音處理軟體可打開)、mp3(由winamp播放)、ram(由realplayer播放)、wma、mmf、amr、aac、flac
5、動畫文件
avi(常用動畫處理軟體可播放)、mpg(由vmpeg播放)、mov(由activemovie播放)、swf(用flash自帶的players程序可播放)
6、系統文件
int、sys、dll、adt
7、可執行文件
exe、com
8、語言文件
c、asm、for、lib、lst、msg、obj、pas、wki、bas
9、映像文件
map (其每一行都定義了一個圖像區域以及當該區域被觸發後應返回的url信息)
10、備份文件
bak(被自動或是通過命令創建的輔助文件,它包含某個文件的最近一個版本)
11、臨時文件
tmp (word、excel等軟體在操作時會產生此類文件)
12、模板文件
dot(通過word模板可以簡化一些常用格式文檔的創建工作)
13、批處理文件
bat、cmd(在ms-dos中,bat與cmd文件是可執行文件,由一系列命令構成,其中可以包含對其他程序的調用)
(6)jsandroidjson擴展閱讀
用擴展名識別文件格式的方式最先在數字設備公司的CP/M操作系統被採用。而後又被DOS和Windows操作系統採用。擴展名是指文件名中,最後一個點(.)號後的字母序列。
例如,HTML文件通過.htm或.html擴展名識別;GIF圖形文件用.gif擴展名識別。在早期的FAT文件系統中,擴展名限制只能是三個字元,因此盡管絕大多數的操作系統已不再有此限制,許多文件格式至今仍然採用三個字元作擴展名。
因為沒有一個正式的擴展名命名標准,所以,有些文件格式可能會採用相同的擴展名,出現這樣的情況就會使操作系統錯誤地識別文件格式,同時也給用戶造成困惑。
擴展名方式的一個特點是,更改文件擴展名會導致系統誤判文件格式。例如,將文件名.html簡單改名為文件名.txt會使系統誤將HTML文件識別為純文本格式。
盡管一些熟練的用戶可以利用這個特點,但普通用戶很容易在改名時發生錯誤,而使得文件變得無法使用。因此,現代的有些操作系統管理程序,例如Windows Explorer加入了限制向用戶顯示文件擴展名的功能。
『柒』 ajax請求 andriod正常,ios上
可能是因為請求的url問題。
如果在https的域名請求http的資源,ios會攔截請求,不能發送成功。
『捌』 如何系統地學習前端
目前入門前端的人群分類
1、計算機相關專業出身系統走過計算機的理論基礎,比如計算機組成原理、操作系統原理、計算機網路、演算法數據結構、設計模式,至少用過兩門以上編程語言(強類型+弱類型)。
優點:理論、架構方面扎實,有整體計算機思維,內功不錯,外功學起來比較快。
缺點:部分人,前端相關細節技術不扎實,不過花時間能很快搞定。
2、非計算機出身自學(也包括計算機專業沒好好學的)理論基礎薄弱,後來因個人興趣或者職業需求,自學前端開發技能。
優點:自學能力比較強,能夠根據自己的興趣規劃學習內容。
缺點:部分人對前端沒有整體的學習框架 ,屬於東一片,西一片,不成體系,部分人計算機沒有整體思維,建議系統梳理下前端知識體系結構,該補的還是要補起來。
門前端時的一些困境
1、因一些基礎演算法、數據結構理論不扎實導致一些編程思維難於理解。比如 原型鏈,如果清楚 數據結構中鏈表結構,那麼這個東西不難理解,再比如 哈希值,懂得數據結構中哈希表,哈希值也就迎刃而解。
2、計算機體系結構、操作系統理論、網路理論不扎實導致到後期一些東西難於理解。比如有同學從前端學習入手,後來學習node開發 ,在 I/O ,進程、線程、IPC 、線程鎖方面有些概念就比較難於理解,而導致不能很好得使用node 的api 。
3、前端整體體系架構沒有做過深入思考。
導致用會用,但不知道為什麼用,用另外一個有什麼區別。
4、學習環境中無高手。
沒有高手能夠指導自己進入下一個層次。
5、有意識但是沒有行動我的網盤收集了一堆資料或者一堆視頻,然後就沒有然後了 。
如何系統學習前端
網站開發開發大致分為前端和後端,前端主要負責實現視覺和交互效果,以及與伺服器通信,完成業務邏輯。其核心價值在於對用戶體驗的追求。如果你現在是零基礎學員,大致可以按如下思路學習系統學習:
基礎部分
1、HTML + CSS 這部分學習,可以模仿一些網站做些頁面。在實踐中積累了一些經驗後,可以系統的讀一兩本書,推薦《Head First HTML 與 CSS 中文版》,這本書講的太細了,我沒能拿出耐心細讀。你可以根據情況斟酌。
2、Java 要學的內容實在很多,如果沒有其他編程語言的基礎的話,學起來可能要費些力,建議馬上看《Java語言精粹》,JS是一門很混亂的語言,這本書能夠幫助你區分哪些是語言的精華,哪些是糟粕,對於語言精華,應該深入學習。糟粕部分能看懂別人寫的代碼就行,自己就不用嘗試了。
進階部分
有了以上基礎,就可以進行一般的靜態網頁設計,不過對於復雜的頁面還需要進一步學習。
1、CSS。必看《精通CSS》,看完這本書你應該對:盒子模型,流動,Block,inline,層疊,樣式優先順序,等概念非常了解了。作為練習可以看下《CSS藝門之匠》這本書,它對標題,背景,圓角,導航條,table,表單等主題都有詳細的介紹。
2、Java。上面提到內容還不足以讓你勝任JS編程。在有了基礎之後,進一步學習內容包括:
a) 框架。
推薦jQuery,簡單易用,學習方法也很簡單,照著產品文檔做幾個頁面就行了,不用面面俱到,以後遇到問題查文檔就行了。框架可以幫你屏蔽瀏覽器的差異性,讓你能更專注與Web開發學習的精髓部分。補充:可以使用 Codecademy 學習 Java,jQuery,用戶體驗真的很好(感謝 TonyOuyang )。
b) Java 語言範式 。這個名字可能並不恰當,只是我找不到可以描述「面向對象」,「函數式」這個兩個概念的概念。Java不完全是一個面向對象的語言,它的很多設計理念都有函數編程語言的影子,甚至說如果你不用面向對象,完全可以把它理解成一門函數式編程語言。
Java的很多語言特性,都是因為他具有函數式語言的特點才存在的。這部分推薦先學習面向對象的基本理論,對封裝,繼承,多態等概念要理解,維基網路,網路會是你的幫手,另外推薦《Object Oriented Java》,應該有中文版。對與函數式編程我了解的也不系統,不好多說,可以自己網路一下。
c) Java 語言內部機制。必須弄清如下概念:JS 中變數的作用域,變數傳遞方式,函數的定義環境與執行環境,閉包,函數的四種調用方式(一般函數,對象的方法,apply,call),以及四種調用方式下,『this』指向的是誰。這部分內容你會在《Java語言精粹》中詳細了解。另外,你必須理解 json。
d) dom編程,這個Web前端工程師的核心技能之一。必讀《Dom編程藝術》,另外《高性能 Java》這本書中關於dom編程的部分講的也很好。
e) Ajax編程,這是另一核心技術。Ajax建議在網上查些資料,了解這個概念的來龍去脈,網路,維基網路上的內容就足夠了。真正編程是很容易的,如今幾乎所有框架都對Ajax有良好的封裝,編程並不復雜。
f) 了解瀏覽器差異性。這部分包括CSS和js兩部分,瀏覽器差異內容很多,建議在實踐中多多積累。另外對於瀏覽器的渲染模式,DOCTYPE等內容應該系統學習。
3、HTML5和CSS3 。HTML5規范已經於2014年10月28日發布了,移動端HTML5和CSS3已經得到了非常廣泛的使用,必知必會呀。
升級部分
有了以上知識,對於大多數小型網站,你應該已經可以寫出能夠工作的代碼了。但要想成為更專業的前端,你還需繼續努力。更高的要求大概還有四方面:1)易維護,2)可測試,3)高性能,4)低流量(移動端)。
易維護。對於頁面你該理解『樣式』,『數據』,『行為』三者分離,對應的當然就是CSS,HTML,js。對於js代碼,你最好了解設計模式,重構,MVC等內容。
可測性。
高性能。必讀《高性能Java》
低流量。移動端關注比較多。
額外補充部分
前端項目同樣面臨軟體生命周期的各個環節,首先是代碼管理,你必須學會使用Svn和Git。其次是代碼的構建,如今前端代碼構建已經不是簡單的壓縮一下了,需要進行依賴管理、模塊合並、各種編譯,比需要學會使用Grunt、Gulp等前端構建工具。
以上內容只是簡單說了前端學習的順序。對於前端開發,基本內容就這些了,可以根據自己的興趣愛好選擇性學習以下內容。
1、交互設計。大公司依然有專業人士搞這些,不過不懂交互的前端一定不是好前端。推薦《簡約至上》。
2、後端。
應該說前端工程師必須至少了解一門後端語言,不過如果愛好也可深入學習,入手難度比較低的應該是PHP了。這部分由可分為基於頁面,基於框架兩種。大型項目都是基於框架開發的,建議至少了解一個MVC框架,比如PHP的Ci、Yii、Yaf 等,好還框架的設計思想都大同小異。如今NodeJs在大公司已經得到普遍的使用,推薦大家使用在Node上使用Express框架做一些後端服務的開發。
3、Android和IOS開發。
時至今日,前端的工作領域已經非常廣泛,native的界面開發本質上也是前端開發,個大公司都面臨著Native環境和web環境頁面同時維護的問題,如果能夠在技術上得到統一,將會有巨大的價值。
如何才能快速入門前端
1、學習東西,自學是一種途徑,然而在自學的過程中,很多人處於不知道自己不知道的狀態。
2、另一種是跟著高手,開闊視野,達到知道自己不知道的境界,從而有方向,在短時期內進入到一個新的境界,節約時間成本。