日常開發中,為了方便數據的輸入和輸出,JavaScript提供了一些常用的輸入輸出語句,具體如表1-3所示。
表1常用的輸入輸出語句
類型 | 語句 | 說明 |
輸入 | prompt() | 用于在瀏覽器中彈出輸入框,用戶可以輸入內容 |
輸出 | alert() | 用于在瀏覽器中彈出警告框 |
document.write() | 用于在網頁中輸出內容 | |
console.log() | 用于在控制臺中輸出信息 |
接下來將分別演示document.write0、console.log0和promptO的使用。
1. document.write()
document.write0的輸出內容中如果含有HTML標簽,會被瀏覽器解析。下面利用documenL.write0在頁面中輸出“我是document.write0語句!”,示例代碼如下。
document.write('我是document.write()語句!');
2. console.log()
利用console.log0語句在控制臺輸出“我是console.log0語句!”,示例代碼如下。
console.log('我是console.log()語句!');
console:.log0的輸出結果需要在瀏覽器的控制臺中查看。在Chrome 瀏覽器中按“F12”鍵(或在網頁空白區域右擊,在彈出的菜單中選擇“檢查”)啟動開發者工具,然后切換到“Console”(控制臺)面板,即可看到console.log0的輸出結果。
3.prompt()
利用prompt0語句實現在頁面中彈出一個帶有提示信息的輸入框,示例代碼如下。
prompt(請輸入姓名:');
上述示例代碼運行后,將在頁面中彈出一個輸人框并提示用戶“請輸人姓名:”提示框。
求出現的原因是這樣的:
我們有一個 h5 頁面既需要嵌套到 App 內部進行用戶的信息填寫及提交,同時這個 h5 頁面也能夠單獨使用。 而這些用戶信息中就包括 `input`框選擇圖片。 <input type="file" name="avatar" id="avatar" />
出現了什么問題呢?
那么問題就出在 input 框這里,點擊這個 input 框,調起 android 手機自帶的拍照和選擇文件的對話框。
小米手機系統調起
只要選擇「圖片」或者「拍照」都沒有問題
問題就出現在選擇「取消」的時候
出現了問題,需要先解決點擊「取消」程序卡死的問題
這個問題,這篇文章已經介紹過了
H5 通過 input 標簽,調起 Android 手機相冊,點擊取消時手機卡住
如果之前沒有配置過,可以參考配置一下。
下面說今天的正題,就是點擊取消之后,如果之前頭像內有圖片,那么取消后會把之前的圖片干掉,展示出一個加載錯誤的樣子
原因找到了:當取消的時候,為了避免卡頓,返回了一個圖片的路徑,但是這個圖片路徑上對應的圖片是不存在的,從而導致了 H5 img 位置 顯示加載失敗
加載失敗
那么現在問題就來了:
如果不返回,就會卡頓;
如果返回了,就把 img 之前的展示圖片給干掉了
怎么辦呢?
我這邊的思路是:
將原來的 img 標簽內的 src 的內容存儲到本地,然后判斷:如果用戶點擊了取消,那么就將這個原來的 src 內容返回回去
那么這樣操作的話,就需要知道,如何拿到 img 標簽中的 src 的內容。
那么實際需要做這么幾部
1、這個需要和 H5 或者后臺溝通一下,將 H5 中的 這個頭像的 id 唯一,以保證能唯一找到這個頭像。
2、根據 id 找到這個 img 標簽后,再拿 src 中的內容存儲到本地
3、判斷用戶點擊取消時,將本地存儲的圖片 src 內容,返回給 H5。
第三點已經在
H5 通過 input 標簽,調起 Android 手機相冊,點擊取消時手機卡住
這個文章中提到過了,找到合適的位置直接返回即可。
所以本篇文章中的重點就是第一步:根據 id 找到 src 的內容。
1、創建 addJavascriptInterface 需要的「操作對象」,這個操作對象就是一個類,名字隨便起,不過內部的方法必須添加@JavascriptInterface注解
//內部類 final class InJavaScriptLocalObj { private static final String TAG = "MainActivity"; /** * @JavascriptInterface 必須要有的哦 * @param html * * 一旦檢測到 html 匹配到了要找的元素或者屬性,這里就會調用,否則不會調用這個方法 */ @JavascriptInterface public void showAvatar(String html) { Log.e(TAG, "showAvatar: " + html); } }
2、配置 webview
private void initWebView() { /** * 三項均需配置 */ webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj"); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); /** * ambassador_avatar 是和后臺(h5)商議的唯一的 id */ view.loadUrl("javascript:window.local_obj.showAvatar(document.getElementById('ambassador_avatar').getAttribute('src'));"); } }); }
那么找元素關鍵的一句,就是
view.loadUrl("javascript:window.local_obj.showAvatar(document.getElementById('ambassador_avatar').getAttribute('src'));");
備注
找元素的方法很相似,就是跟 html 中的找 dom 節點一樣
可以移步到 w3school 逛網看一看
dom 元素查找方法
這里小總結一下
通過 id 查找 HTML 元素 通過標簽名查找 HTML 元素 通過類名查找 HTML 元素 通過 CSS 選擇器查找 HTML 元素 通過 HTML 對象集合查找 HTML 元素 var myElement = document.getElementById("intro");//返回單個元素 var x = document.getElementsByTagName("p");//返回元素列表 var x = document.getElementsByClassName("intro");//返回元素列表 var x = document.querySelectorAll("p.intro");//返回元素列表 var x = document.forms["frm1"];//返回元素列表
返回元素列表的方法在使用是 需要像數組那樣去取得對應的元素,如x[0]
拿到元素之后,通過 DOM 的文檔,拿到想要的屬性、值等等信息。
這樣就能通過存儲原來的圖片信息,在點擊取消的時候把信息返回,解決了本次需求的問題。
謝謝大家的收藏、關注、轉發,持續更新!
首先映入眼簾的是slf4j,全稱是Simple Logging Facade for Java。從名字可以看出來這是一個日志框架,采用了Facade的設計模式,說白了,這是一個日志框架接口,應用程序里使用slf4j的接口來打印日志,具體的日志框架可以自由選擇,這樣做是為了方便適配不同的日志框架,比如logback,log4j2等。
官方網站是 http://www.slf4j.org/index.html
log4j是apache的開源項目,現在已經到2.0版本,所以也叫log4j2,官方網站是
http://logging.apache.org/log4j/2.x/index.html
所以本文的日志打印就是通過應用程序里使用slf4j的接口,然后具體的日志框架是log4j2。
實驗代碼都在上傳在 https://gitee.com/kunpengku/learn-log4j
首先需要增加對日志框架包的依賴,如下
<dependencies>
<!-- 這個依賴是slf4j的api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<!--下面這兩個依賴是log4j2的實現-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.3</version>
</dependency>
<!-- 下面這個依賴是 log4j 橋接slf4j用的-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.3</version>
</dependency>
</dependencies>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogMain {
static Logger logger = LoggerFactory.getLogger(LogMain.class);
public static void main(String[] args) {
logger.error("Hello World");
}
}
這就log4j的helloworld,這是還沒有任何的配置文件,這時,log4j會提供一個默認的配置文件,只能輸出到console上,這里要注意,默認配置的Log Level是ERROR的,所以只有ERROR級別及其以上的打印才能輸出看到,如果這里打印一個info的日志,是不會輸出到屏幕的,因為級別太低,過濾掉了。
輸出
08:17:18.767 [main] ERROR com.kpk.LogMain - Hello World
未完待續
*請認真填寫需求信息,我們會在24小時內與您取得聯系。