Android:你要的WebView與 JS 交互方式

轉(zhuǎn)載:https://blog.csdn.net/carson_ho/article/details/64904691

前言

現(xiàn)在很多App里都內(nèi)置了Web網(wǎng)頁(yè)(Hybrid App)胆绊,比如說(shuō)很多電商平臺(tái),淘寶照筑、京東儒搭、聚劃算等等池颈,如下圖

上述功能是由Android的WebView實(shí)現(xiàn)的贩毕,其中涉及到Android客戶端與Web網(wǎng)頁(yè)交互的實(shí)現(xiàn)

今天我將全面介紹Android通過(guò)WebView與JS交互的全面方式

閱讀本文前請(qǐng)先閱讀:Android開(kāi)發(fā):最全面、最易懂的Webview詳解

目錄

1. 交互方式總結(jié)

Android與JS通過(guò)WebView互相調(diào)用方法亥啦,實(shí)際上是:

Android去調(diào)用JS的代碼

JS去調(diào)用Android的代碼

二者溝通的橋梁是WebView

對(duì)于Android調(diào)用JS代碼的方法有2種:?

1. 通過(guò)WebView的loadUrl()?

2. 通過(guò)WebView的evaluateJavascript()

對(duì)于JS調(diào)用Android代碼的方法有3種:?

1. 通過(guò)WebView的addJavascriptInterface()進(jìn)行對(duì)象映射?

2. 通過(guò)?WebViewClient?的shouldOverrideUrlLoading ()方法回調(diào)攔截 url?

3. 通過(guò)?WebChromeClient?的onJsAlert()炭剪、onJsConfirm()、onJsPrompt()方法回調(diào)攔截JS對(duì)話框alert()禁悠、confirm()念祭、prompt()?消息

2. 具體分析

2.1 Android通過(guò)WebView調(diào)用 JS 代碼

對(duì)于Android調(diào)用JS代碼的方法有2種:?

1. 通過(guò)WebView的loadUrl()?

2. 通過(guò)WebView的evaluateJavascript()

方式1:通過(guò)WebView的loadUrl()

實(shí)例介紹:點(diǎn)擊Android按鈕,即調(diào)用WebView JS(文本名為javascript)中callJS()

具體使用:

步驟1:將需要調(diào)用的JS代碼以.html格式放到src/main/assets文件夾里

為了方便展示碍侦,本文是采用Andorid調(diào)用本地JS代碼說(shuō)明粱坤;

實(shí)際情況時(shí),Android更多的是調(diào)用遠(yuǎn)程JS代碼瓷产,即將加載的JS代碼路徑改成url即可

需要加載JS代碼:javascript.html

// 文本名:javascriptCarson_Ho// JS代碼// Android需要調(diào)用的方法functioncallJS(){alert("Android調(diào)用了JS的callJS方法");? }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

步驟2:在Android里通過(guò)WebView設(shè)置調(diào)用JS代碼

Android代碼:MainActivity.java

注釋已經(jīng)非常清楚

publicclassMainActivityextendsAppCompatActivity{WebView mWebView;? ? Button button;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.activity_main);? ? ? ? mWebView =(WebView) findViewById(R.id.webview);? ? ? ? WebSettings webSettings = mWebView.getSettings();// 設(shè)置與Js交互的權(quán)限webSettings.setJavaScriptEnabled(true);// 設(shè)置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先載入JS代碼// 格式規(guī)定為:file:///android_asset/文件名.htmlmWebView.loadUrl("file:///android_asset/javascript.html");? ? ? ? button = (Button) findViewById(R.id.button);? ? ? ? button.setOnClickListener(newView.OnClickListener() {@OverridepublicvoidonClick(View v) {// 通過(guò)Handler發(fā)送消息mWebView.post(newRunnable() {@Overridepublicvoidrun() {// 注意調(diào)用的JS方法名要對(duì)應(yīng)上// 調(diào)用javascript的callJS()方法mWebView.loadUrl("javascript:callJS()");? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? });? ? ? ? ? ? }? ? ? ? });// 由于設(shè)置了彈窗檢驗(yàn)調(diào)用結(jié)果,所以需要支持js對(duì)話框// webview只是載體站玄,內(nèi)容的渲染需要使用webviewChromClient類去實(shí)現(xiàn)// 通過(guò)設(shè)置WebChromeClient對(duì)象處理JavaScript的對(duì)話框//設(shè)置響應(yīng)js 的Alert()函數(shù)mWebView.setWebChromeClient(newWebChromeClient() {@OverridepublicbooleanonJsAlert(WebView view, String url, String message,finalJsResult result) {? ? ? ? ? ? ? ? AlertDialog.Builder b =newAlertDialog.Builder(MainActivity.this);? ? ? ? ? ? ? ? b.setTitle("Alert");? ? ? ? ? ? ? ? b.setMessage(message);? ? ? ? ? ? ? ? b.setPositiveButton(android.R.string.ok,newDialogInterface.OnClickListener() {@OverridepublicvoidonClick(DialogInterface dialog,intwhich) {? ? ? ? ? ? ? ? ? ? ? ? result.confirm();? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? });? ? ? ? ? ? ? ? b.setCancelable(false);? ? ? ? ? ? ? ? b.create().show();returntrue;? ? ? ? ? ? }? ? ? ? });? ? }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

特別注意:JS代碼調(diào)用一定要在?onPageFinished()?回調(diào)之后才能調(diào)用,否則不會(huì)調(diào)用濒旦。

onPageFinished()屬于WebViewClient類的方法株旷,主要在頁(yè)面加載結(jié)束時(shí)調(diào)用

方式2:通過(guò)WebView的evaluateJavascript()

優(yōu)點(diǎn):該方法比第一種方法效率更高、使用更簡(jiǎn)潔。

因?yàn)樵摲椒ǖ膱?zhí)行不會(huì)使頁(yè)面刷新晾剖,而第一種方法(loadUrl )的執(zhí)行則會(huì)锉矢。

Android 4.4 后才可使用

具體使用

// 只需要將第一種方法的loadUrl()換成下面該方法即可mWebView.evaluateJavascript("javascript:callJS()",newValueCallback() {? ? ? ? @OverridepublicvoidonReceiveValue(Stringvalue) {//此處為 js 返回的結(jié)果}? ? });}

1

2

3

4

5

6

7

8

2.1.2 方法對(duì)比

2.1.3 使用建議

兩種方法混合使用,即Android 4.4以下使用方法1齿尽,Android 4.4以上方法2

// Android版本變量finalintversion = Build.VERSION.SDK_INT;// 因?yàn)樵摲椒ㄔ?Android 4.4 版本才可使用沽损,所以使用時(shí)需進(jìn)行版本判斷if(version <18) {? ? mWebView.loadUrl("javascript:callJS()");}else{? ? mWebView.evaluateJavascript("javascript:callJS()",newValueCallback() {@OverridepublicvoidonReceiveValue(String value) {//此處為 js 返回的結(jié)果}? ? });}

1

2

3

4

5

6

7

8

9

10

11

12

13

2.2 JS通過(guò)WebView調(diào)用 Android 代碼

對(duì)于JS調(diào)用Android代碼的方法有3種:?

1. 通過(guò)WebView的addJavascriptInterface()進(jìn)行對(duì)象映射?

2. 通過(guò)?WebViewClient?的shouldOverrideUrlLoading ()方法回調(diào)攔截 url?

3. 通過(guò)?WebChromeClient?的onJsAlert()、onJsConfirm()循头、onJsPrompt()方法回調(diào)攔截JS對(duì)話框alert()绵估、confirm()、prompt()?消息

2.2.1 方法分析

方式1:通過(guò)?WebView的addJavascriptInterface()進(jìn)行對(duì)象映射

步驟1:定義一個(gè)與JS對(duì)象映射關(guān)系的Android類:AndroidtoJs

AndroidtoJs.java(注釋已經(jīng)非常清楚)

// 繼承自O(shè)bject類publicclassAndroidtoJsextendsObject{// 定義JS需要調(diào)用的方法// 被JS調(diào)用的方法必須加入@JavascriptInterface注解@JavascriptInterfacepublicvoidhello(String msg) {? ? ? ? System.out.println("JS調(diào)用了Android的hello方法");? ? }}

1

2

3

4

5

6

7

8

9

10

步驟2:將需要調(diào)用的JS代碼以.html格式放到src/main/assets文件夾里

需要加載JS代碼:javascript.html

CarsonfunctioncallAndroid(){// 由于對(duì)象映射卡骂,所以調(diào)用test對(duì)象等于調(diào)用Android映射的對(duì)象test.hello("js調(diào)用了android中的hello方法");? ? ? ? }//點(diǎn)擊按鈕則調(diào)用callAndroid函數(shù)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

步驟3:在Android里通過(guò)WebView設(shè)置Android類與JS代碼的映射

詳細(xì)請(qǐng)看注釋

publicclassMainActivityextendsAppCompatActivity{WebView mWebView;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.activity_main);? ? ? ? mWebView = (WebView) findViewById(R.id.webview);? ? ? ? WebSettings webSettings = mWebView.getSettings();// 設(shè)置與Js交互的權(quán)限webSettings.setJavaScriptEnabled(true);// 通過(guò)addJavascriptInterface()將Java對(duì)象映射到JS對(duì)象//參數(shù)1:Javascript對(duì)象名//參數(shù)2:Java對(duì)象名mWebView.addJavascriptInterface(newAndroidtoJs(),"test");//AndroidtoJS類對(duì)象映射到j(luò)s的test對(duì)象// 加載JS代碼// 格式規(guī)定為:file:///android_asset/文件名.htmlmWebView.loadUrl("file:///android_asset/javascript.html");

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

特點(diǎn)

優(yōu)點(diǎn):使用簡(jiǎn)單

僅將Android對(duì)象和JS對(duì)象映射即可

缺點(diǎn):存在嚴(yán)重的漏洞問(wèn)題国裳,具體請(qǐng)看文章:你不知道的 Android WebView 使用漏洞

方式2:通過(guò)?WebViewClient?的方法shouldOverrideUrlLoading ()回調(diào)攔截 url

具體原理:?

Android通過(guò)?WebViewClient?的回調(diào)方法shouldOverrideUrlLoading ()攔截 url

解析該 url 的協(xié)議

如果檢測(cè)到是預(yù)先約定好的協(xié)議,就調(diào)用相應(yīng)方法?

即JS需要調(diào)用Android的方法

具體使用:?

步驟1:在JS約定所需要的Url協(xié)議?

JS代碼:javascript.html

以.html格式放到src/main/assets文件夾里

Carson_HofunctioncallAndroid(){/*約定的url協(xié)議為:js://webview?arg1=111&arg2=222*/document.location ="js://webview?arg1=111&arg2=222";? ? ? ? }點(diǎn)擊調(diào)用Android代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

當(dāng)該JS通過(guò)Android的mWebView.loadUrl("file:///android_asset/javascript.html")加載后全跨,就會(huì)回調(diào)shouldOverrideUrlLoading ()缝左,接下來(lái)繼續(xù)看步驟2:

步驟2:在Android通過(guò)WebViewClient復(fù)寫(xiě)shouldOverrideUrlLoading ()

MainActivity.java

publicclassMainActivityextendsAppCompatActivity{WebView mWebView;//? ? Button button;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.activity_main);? ? ? ? mWebView = (WebView) findViewById(R.id.webview);? ? ? ? WebSettings webSettings = mWebView.getSettings();// 設(shè)置與Js交互的權(quán)限webSettings.setJavaScriptEnabled(true);// 設(shè)置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 步驟1:加載JS代碼// 格式規(guī)定為:file:///android_asset/文件名.htmlmWebView.loadUrl("file:///android_asset/javascript.html");// 復(fù)寫(xiě)WebViewClient類的shouldOverrideUrlLoading方法mWebView.setWebViewClient(newWebViewClient() {@OverridepublicbooleanshouldOverrideUrlLoading(WebView view, String url) {// 步驟2:根據(jù)協(xié)議的參數(shù),判斷是否是所需要的url// 一般根據(jù)scheme(協(xié)議格式) & authority(協(xié)議名)判斷(前兩個(gè)參數(shù))//假定傳入進(jìn)來(lái)的 url = "js://webview?arg1=111&arg2=222"(同時(shí)也是約定好的需要攔截的)Uri uri = Uri.parse(url);// 如果url的協(xié)議 = 預(yù)先約定的 js 協(xié)議// 就解析往下解析參數(shù)if( uri.getScheme().equals("js")) {// 如果 authority? = 預(yù)先約定協(xié)議里的 webview螟蒸,即代表都符合約定的協(xié)議// 所以攔截url,下面JS開(kāi)始調(diào)用Android需要的方法if(uri.getAuthority().equals("webview")) {//? 步驟3:// 執(zhí)行JS所需要調(diào)用的邏輯System.out.println("js調(diào)用了Android的方法");// 可以在協(xié)議上帶有參數(shù)并傳遞到Android上HashMap params =newHashMap<>();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Set collection = uri.getQueryParameterNames();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }returntrue;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }returnsuper.shouldOverrideUrlLoading(view, url);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? );? }? ? ? ? }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

特點(diǎn)

優(yōu)點(diǎn):不存在方式1的漏洞盒使;

缺點(diǎn):JS獲取Android方法的返回值復(fù)雜。?

如果JS想要得到Android方法的返回值七嫌,只能通過(guò) WebView 的?loadUrl ()去執(zhí)行 JS 方法把返回值傳遞回去少办,相關(guān)的代碼如下:

// Android:MainActivity.javamWebView.loadUrl("javascript:returnResult("+ result +")");// JS:javascript.htmlfunctionreturnResult(result){alert("result is"+ result);}

1

2

3

4

5

6

7

方式3:通過(guò)?WebChromeClient?的onJsAlert()、onJsConfirm()诵原、onJsPrompt()方法回調(diào)攔截JS對(duì)話框alert()英妓、confirm()、prompt()?消息

在JS中绍赛,有三個(gè)常用的對(duì)話框方法:

方式3的原理:Android通過(guò)?WebChromeClient?的onJsAlert()蔓纠、onJsConfirm()、onJsPrompt()方法回調(diào)分別攔截JS對(duì)話框?

(即上述三個(gè)方法)吗蚌,得到他們的消息內(nèi)容腿倚,然后解析即可。

下面的例子將用攔截 JS的輸入框(即prompt()方法)說(shuō)明 :

常用的攔截是:攔截 JS的輸入框(即prompt()方法)

因?yàn)橹挥衟rompt()可以返回任意類型的值蚯妇,操作最全面方便敷燎、更加靈活;而alert()對(duì)話框沒(méi)有返回值箩言;confirm()對(duì)話框只能返回兩種狀態(tài)(確定 / 取消)兩個(gè)值

步驟1:加載JS代碼硬贯,如下:?

javascript.html

以.html格式放到src/main/assets文件夾里

Carson_Hofunctionclickprompt(){// 調(diào)用prompt()varresult=prompt("js://demo?arg1=111&arg2=222");? ? alert("demo "+ result);}點(diǎn)擊調(diào)用Android代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

當(dāng)使用mWebView.loadUrl("file:///android_asset/javascript.html")加載了上述JS代碼后,就會(huì)觸發(fā)回調(diào)onJsPrompt()陨收,具體如下:

如果是攔截警告框(即alert())饭豹,則觸發(fā)回調(diào)onJsAlert();

如果是攔截確認(rèn)框(即confirm()),則觸發(fā)回調(diào)onJsConfirm()拄衰;

步驟2:在Android通過(guò)WebChromeClient復(fù)寫(xiě)onJsPrompt()

publicclassMainActivityextendsAppCompatActivity{WebView mWebView;//? ? Button button;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.activity_main);? ? ? ? mWebView = (WebView) findViewById(R.id.webview);? ? ? ? WebSettings webSettings = mWebView.getSettings();// 設(shè)置與Js交互的權(quán)限webSettings.setJavaScriptEnabled(true);// 設(shè)置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先加載JS代碼// 格式規(guī)定為:file:///android_asset/文件名.htmlmWebView.loadUrl("file:///android_asset/javascript.html");? ? ? ? mWebView.setWebChromeClient(newWebChromeClient() {// 攔截輸入框(原理同方式2)// 參數(shù)message:代表promt()的內(nèi)容(不是url)// 參數(shù)result:代表輸入框的返回值@OverridepublicbooleanonJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {// 根據(jù)協(xié)議的參數(shù)它褪,判斷是否是所需要的url(原理同方式2)// 一般根據(jù)scheme(協(xié)議格式) & authority(協(xié)議名)判斷(前兩個(gè)參數(shù))//假定傳入進(jìn)來(lái)的 url = "js://webview?arg1=111&arg2=222"(同時(shí)也是約定好的需要攔截的)Uri uri = Uri.parse(message);// 如果url的協(xié)議 = 預(yù)先約定的 js 協(xié)議// 就解析往下解析參數(shù)if( uri.getScheme().equals("js")) {// 如果 authority? = 預(yù)先約定協(xié)議里的 webview,即代表都符合約定的協(xié)議// 所以攔截url,下面JS開(kāi)始調(diào)用Android需要的方法if(uri.getAuthority().equals("webview")) {//// 執(zhí)行JS所需要調(diào)用的邏輯System.out.println("js調(diào)用了Android的方法");// 可以在協(xié)議上帶有參數(shù)并傳遞到Android上HashMap params =newHashMap<>();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Set collection = uri.getQueryParameterNames();//參數(shù)result:代表消息框的返回值(輸入值)result.confirm("js調(diào)用了Android的方法成功啦");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }returntrue;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }returnsuper.onJsPrompt(view, url, message, defaultValue, result);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }// 通過(guò)alert()和confirm()攔截的原理相同肾砂,此處不作過(guò)多講述// 攔截JS的警告框@OverridepublicbooleanonJsAlert(WebView view, String url, String message, JsResult result) {returnsuper.onJsAlert(view, url, message, result);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }// 攔截JS的確認(rèn)框@OverridepublicbooleanonJsConfirm(WebView view, String url, String message, JsResult result) {returnsuper.onJsConfirm(view, url, message, result);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? );? ? ? ? ? ? }? ? ? ? }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

Demo地址?

上述所有代碼均存放在:Carson_Ho的Github地址 : WebView Demo

2.2.2 三種方式的對(duì)比 & 使用場(chǎng)景

3. 總結(jié)

本文主要對(duì)Android通過(guò)WebView與JS的交互方式進(jìn)行了全面介紹

關(guān)于WebView的系列文章對(duì)你有所幫助?

Android開(kāi)發(fā):最全面列赎、最易懂的Webview詳解?

Android:你不知道的 WebView 使用漏洞?

手把手教你構(gòu)建 Android WebView 的緩存機(jī)制 & 資源預(yù)加載方案

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宏悦,一起剝皮案震驚了整個(gè)濱河市镐确,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饼煞,老刑警劉巖源葫,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砖瞧,居然都是意外死亡息堂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)块促,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荣堰,“玉大人,你說(shuō)我怎么就攤上這事竭翠≌窦幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵斋扰,是天一觀的道長(zhǎng)渡八。 經(jīng)常有香客問(wèn)我,道長(zhǎng)传货,這世上最難降的妖魔是什么屎鳍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮问裕,結(jié)果婚禮上逮壁,老公的妹妹穿的比我還像新娘。我一直安慰自己粮宛,他們只是感情好窥淆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窟勃,像睡著了一般祖乳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秉氧,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天眷昆,我揣著相機(jī)與錄音,去河邊找鬼。 笑死亚斋,一個(gè)胖子當(dāng)著我的面吹牛作媚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帅刊,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纸泡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赖瞒?” 一聲冷哼從身側(cè)響起女揭,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栏饮,沒(méi)想到半個(gè)月后吧兔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袍嬉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年境蔼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伺通。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箍土,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罐监,到底是詐尸還是另有隱情吴藻,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布笑诅,位于F島的核電站调缨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吆你。R本人自食惡果不足惜弦叶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妇多。 院中可真熱鬧伤哺,春花似錦、人聲如沸者祖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)七问。三九已至蜓耻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間械巡,已是汗流浹背刹淌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工饶氏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人有勾。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓疹启,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蔼卡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喊崖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一闕: 簡(jiǎn)漾三歲的那一年荤懂,姥姥心臟病發(fā),她跟隨媽媽回姥姥家鄉(xiāng)喝峦。坐在汽車上势誊,媽媽叮囑她要乖乖的聽(tīng)話,姥姥生病需要靜養(yǎng)...
    MortimerJ閱讀 359評(píng)論 0 0
  • 美國(guó)東部時(shí)間2016年5月26日是哈佛的第365個(gè)畢業(yè)日,在這次的畢業(yè)典禮上霜威,來(lái)自中國(guó)湖南的生物系博士畢業(yè)生何江谈喳,...
    藝齡媽媽閱讀 291評(píng)論 0 0
  • 喬治·薩拜因 George·Sabine(1880-1961) 著名政治學(xué)家,美國(guó)哲學(xué)協(xié)會(huì)戈泼、政治學(xué)協(xié)會(huì)會(huì)員婿禽,“歷史...
    須彌僧閱讀 579評(píng)論 0 0
  • 01 似乎很久沒(méi)有走過(guò)新街口-護(hù)國(guó)寺-西四的那條街了。從去年6月那場(chǎng)分手開(kāi)始大猛,每次走這條街扭倾,我都會(huì)帶著些許傷感⊥旒ǎ可...
    Alison_劉閱讀 502評(píng)論 0 2
  • ————寫(xiě)給寶貝的第一封信 親愛(ài)的周小夏寶貝: 我第一次做你的麻麻膛壹,你第一次...
    時(shí)光素語(yǔ)閱讀 412評(píng)論 4 7