當前位置:首頁 » 安卓系統 » jsandroidjson

jsandroidjson

發布時間: 2023-02-07 16:56:40

『壹』 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&parameters.length==3){

if(parameters[0]==WebView.class&&parameters[1]==JSONObject.class&&parameters[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、另一種是跟著高手,開闊視野,達到知道自己不知道的境界,從而有方向,在短時期內進入到一個新的境界,節約時間成本。

熱點內容
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:26
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:99
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:934
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:727
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:797
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:504
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:366
ef資料庫查詢數據 發布:2025-05-18 03:29:36 瀏覽:668
百度雲下載文件夾 發布:2025-05-18 03:17:33 瀏覽:674
php雲開發 發布:2025-05-18 03:12:41 瀏覽:447