热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发WebView/WebViewClient/WebChromeClient简介API详述【一】

老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APPÿ

老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview;或者一些非电商APP中的像广告页面,注册协议页面都会用到;最后因为一些事情拖到现在才做,感觉事情真不能拖,越往后推越做不了,罪过罪过。

怎么总结Webview呢

1.简单介绍

2.WebView/WebViewClient/WebChromeClient api介绍

3.简单使用

4.JS调用Android本地

5.Android调用JS方法

6.缓存处理及性能优化

7.webview使用注意点

 

webview系列文章

Android之WebView/WebViewClient/WebChromeClient简介 API详述 【一】

Android之WebView/WebViewClient/WebChromeClient 使用样例 【二】

Android之WebView Android调用JS方法 JS调用Android方法 【三】

Android之WebView 缓存处理 性能优化【四】

Android之WebView 使用注意点 JS注入漏洞问题 内存优化【五】

 

1.WebView

这个类位于android.webkit包下面,继承android.widget.absolutelayout,首先说明这是一个控件;再看看官网怎么介绍它的

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

Note that, in order for your Activity to access the Internet and load web pages in a WebView, you must add the INTERNET permissions to your Android Manifest file.

还有好多介绍,大家可以去官网链接查看,很详细。

大概翻译下:

就是一个显示网页的视图,可以把这个类当作一个浏览器,或者在activity里简单的显示一些网页内容,Webview使用Webkit渲染引擎来显示网页,并支持前后历史导航,放大缩小,文本搜索等方法。

记住,在avtivity访问网络和使用webview加载网页一定要在Manifest里添加网络权限

 

2.api

    2.1 Webview内部方法

    2.2 Webview子类:WebSetting,WebViewClient,WebChromeClient

        2.1.1 方法

        addJavascriptInterface(Object object, String name)

        将Java对象映射到JS对象,第一个参数是java对象,第二个参数是对象名

        removeJavascriptInterface(String name)

        移除添加的js对象,下次加载或刷新时生效

        canGoBack() 

        webview是否能回退到上一页

        canGoBackOrForward(int steps)

        webview是否可以回退或者前进给定数量的步骤,大于0表示前进,小于0表示后退

        canGoForward()

        webview是否可以前进

        clearCache(boolean includeDiskFiles)

        清除网页缓存

        clearClientCertPreferences(Runnable onCleared)

        清除客户端证书偏好

        clearFormData()

        从当前获取焦点的表单域中移除自动填充弹出框

        clearHistory()

        清除webview访问记录

        clearSslPreferences()

        清除ssl偏好

        computeScroll()

        由父类调用,以请求子view在必要时更新mScrollX和mScrollY的值

        copyBackForwardList()

        获取webview的前进后退页面List

        documentHasImages(Message response)

        查询文档中是否有图片 response.arg为1表示包含,反之不包含

        evaluateJavascript(String script, ValueCallback<String> resultCallback)

        从JS中获取值&#xff0c;通过第二个参数返回&#xff0c;必须在UI线程调用&#xff0c;也必须在UI线程回调

        getProgress()

        获取页面加载进度

        getSettings()

        获取WebSettings类

        getTitle()

        获取当前页面title

        getUrl()

        获取当前页面URL

        getOriginalUrl()

        获取当前页面原始URL&#xff0c;可能重定向后URL不同

        goBack()

        回退

        goForward()

        前进

        goBackOrForward(int steps)

        大于0 前进指定步骤页数&#xff0c;小于0 后退指定步骤页数

        loadData(String data, String mimeType, String encoding)

        加载内容 &#xff0c;第一个参数是要加载的内容&#xff0c;比如一段html内容&#xff1b;第二个参数是数据类型&#xff0c;比如&#39;text/html&#39;

        第三个参数是内容的编码格式

        loadUrl(String url)

        加载url指定的网页

        loadUrl(String url, Map<StringString> additionalHttpHeaders)

        加载携带http headers的url指定的网页

        reload()

        重新加载网页

        postUrl(String url, byte[] postData)

        使用post方法加载指定网页

        pageDown(boolean bottom)

        将此Webview的内容向下滚动页面大小的一半

        pageUp(boolean top)

        将此Webview的内容向上滚动页面大小的一半

         setBackgroundColor(int color)

         设置背景色

         setDownloadListener(DownloadListener listener)

         当渲染引擎无法处理内容时&#xff0c;应当注册这个接口来处理

         setFindListener(WebView.FindListener listener)

         设置网页查找结果的回调

          findAllAsync(String find)

         移步执行查找网页内包含的字符串并高亮显示&#xff0c;查找结果会回调

        findNext(boolean forward)

        查找下一个字符串

        clearMatches()

         清除网页查找的高亮匹配字符串

         setInitialScale(int scaleInPercent)

         设置webview的缩放进度

         setOverScrollMode(int mode)

         设置视图的滑动模式

         OVER_SCROLL_ALWAYS (default) 

        OVER_SCROLL_IF_CONTENT_SCROLLS 只允许在视图内容大于屏幕时进行滚动

        OVER_SCROLL_NEVER 仅当视图能够滚动时才能设置视图滚动模式

        stopLoading()

         停止加载

        zoomIn()

        放大Webview

        zoomOut()

        缩小webview

        zoomBy(float zoomFactor)

        按给定值进行缩放

        setWebChromeClient(WebChromeClient client)

        设置chrome处理程序&#xff0c;用于处理JS对话框&#xff0c;网站图标&#xff0c;标题和进度

         setWebViewClient(WebViewClient client)

        设置处理各种通知和请求的类

        2.2.1 子类

            2.2.1.1 WebSettings

            这个类跟webview处于同一个包下&#xff0c;是一个抽象类&#xff0c;看看官网介绍

           Manages settings state for a WebView. When a WebView is first created, it obtains a set of  

           default settings. These default settings will be returned from any getter call. A WebSettings 

           object obtained from  WebView.getSettings() is tied to the life of the WebView. If a 

           WebView has been destroyed,any method call on WebSettings will throw an IllegalStateException.

            大概意思是

            管理webview的设置状态&#xff0c;当首次创建Webview时&#xff0c;会获取一个默认的设置&#xff0c;这个默认的设置可以通过

            任何getter调用返回&#xff0c;从Webview.getSettings()方法返回的WebSettings与Webview的生命周期一致

            &#xff0c;如果webview销毁了&#xff0c;任何通过webSettings调用的方法将会抛出异常。

            既然是管理设置的&#xff0c;那看看有哪些设置方法吧

            setAllowContentAccess(boolean allow)

            在webview中启用或禁用内容URL访问&#xff0c;默认启用&#xff0c;可以通过Content provider去访问资源

            setAllowFileAccess(boolean allow)

            在webview中禁用或启用文件访问&#xff0c;默认启用&#xff0c;这里针对的是手机内存的文件&#xff0c;assets和res目录下的不

            受影响

            setAllowFileAccessFromFileURLs(boolean flag)

            设置是否允许加载的js去访问本地文件&#xff0c;默认false

            setAllowUniversalAccessFromFileURLs(boolean flag)

            设置是否允许加载的js去访问其它的源&#xff08;包括http&#xff0c;https等&#xff09;&#xff0c;默认false

            setAppCacheEnabled(boolean flag)

            设置是否启用缓存&#xff0c;不过需要先设置好缓存路径&#xff0c;默认false

            setAppCachePath(String appCachePath)

            设置缓存路径

             setBlockNetworkImage(boolean flag)

            设置是否阻止加载网络图片&#xff0c;默认false

            setBlockNetworkLoads(boolean flag)

            设置是否阻止加载所有网络资源&#xff0c;默认false&#xff0c;当设置是的时候&#xff0c;也会让上面方法也是是

            setBuiltInZoomControls(boolean enabled)

            设置webview是否应使用其内置的缩放机制

            setCacheMode(int mode)

            设置缓存模式 

            LOAD_DEFAULT                          默认行为 根据cache-control决定是否从网路获取数据

            LOAD_CACHE_ELSE_NETWORK, 优先使用缓存&#xff0c;无论是否过期或者no-cache&#xff0c;都使用缓存

            LOAD_NO_CACHE                       不使用缓存&#xff0c;只加载网络

            LOAD_CACHE_ONLY                   不使用网络&#xff0c;只使用缓存

            setCursiveFontFamily(String font)

            设置Webview字体库草书字体&#xff0c;默认值 cursive

            setDefaultFontSize(int size)

            设置文字大小&#xff0c;默认16 范围是1-72

            setDefaultFixedFontSize(int size)

            设置默认等宽字体大小 默认16

            setDefaultTextEncodingName(String encoding)

            设置文本编码格式&#xff0c;默认"UTF-8"

            setDisplayZoomControls(boolean enabled)

            设置webview在使用内置缩放控件的时候是否显示屏幕缩放控件&#xff0c;默认显示

            setDomStorageEnabled(boolean flag)

            设置是否启用DOM存储 默认false

            setFantasyFontFamily(String font)

            设置webview字体库幻想体 默认fanstasy

            setFixedFontFamily(String font)

            设置webview字体库等宽字体 默认monspace

            setGeolocationEnabled(boolean flag)

            设置是否启用定位 默认true&#xff0c;

            请注意&#xff0c;为了WebView中的页面可以使用Geolocation API&#xff0c;必须满足以下要求&#xff1a;

             1.应用程序必须具有访问设备位置的权限&#xff0c;请参阅ACCESS_COARSE_LOCATION

             和ACCESS_FINE_LOCATION 

             2.应用程序必须提供

             onGeolocationPermissionsShowPrompt&#xff08;String&#xff0c;GeolocationPermissions.Callback&#xff09;

             回调的实现&#xff0c;以接收页面通过Javascript Geolocation API请求访问位置的通知。

            setJavascriptCanOpenWindowsAutomatically(boolean flag)

            设置js是否可以通过window.open方法打开窗口&#xff0c;默认false

            setJavascriptEnabled(boolean flag)

            设置是否支持JS&#xff0c;默认false

            setLoadWithOverviewMode(boolean overview)

            设置webview是否能以概貌模式加载页面&#xff0c;即当页面内容宽度大于webview控件的宽度时&#xff0c;默认false

            setLoadsImagesAutomatically(boolean flag)

            设置是否自动加载图片 默认true

            setMediaPlaybackRequiresUserGesture(boolean require)

            设置webview是否需要用户手势才能播放媒体&#xff0c;默认true

            setMinimumFontSize(int size)

            设置最小文字尺寸 默认8

            setMinimumLogicalFontSize(int size)

            设置文字最小逻辑尺寸 默认8

            setMixedContentMode(int mode)

            配置WebView在安全来源尝试从不安全来源加载资源时的行为。 默认情况下&#xff0c;

            定位到KITKAT或更低版本的应用默认为MIXED_CONTENT_ALWAYS_ALLOW。 

            定位LOLLIPOP的应用默认为MIXED_CONTENT_NEVER_ALLOW。 

            WebView的首选和最安全的操作模式是MIXED_CONTENT_NEVER_ALLOW&#xff0c;

            强烈建议不要使用MIXED_CONTENT_ALWAYS_ALLOW。

            setOffscreenPreRaster(boolean enabled)

            打开此功能可避免在屏幕上对屏幕外的webview进行动画操作时出现阴影&#xff0c;因为这种屏幕外webview

            会使用更多内存&#xff0c;默认false&#xff0c;平时开发中尽量注意webview大小不要大于屏幕大小。

            setSansSerifFontFamily(String font)

            设置webview字体库无衬线体&#xff0c;默认 sans-serif

            setSaveFormData(boolean save)

            设置webview是否保存表单数据 默认true

            setSerifFontFamily(String font)

            设置webview字体库无衬线体&#xff0c;默认 sans-serif

            setStandardFontFamily(String font)

            设置webview字体库标准字体&#xff0c;默认 sans-serif

            setSupportMultipleWindows(boolean support)

            设置是否支持多窗口 默认false

            setSupportZoom(boolean support)

            设置webview是否支持使用屏幕缩放控件和手势进行缩放&#xff0c;默认true&#xff0c;此设置不影响zoomin和zoomout

            方法的使用

            setTextZoom(int textZoom)

            设置页面的文本缩放百分比&#xff0c;默认100

            setUseWideViewPort(boolean use)

            WebView是否支持HTML的“viewport”标签或者使用wide viewport。设置值为true时&#xff0c;布局的宽度总是

            与WebView控件上的设备无关像素&#xff08;device-dependent pixels&#xff09;宽度一致。当值为true且页面包含

            viewport标记&#xff0c;将使用标签指定的宽度。如果页面不包含标签或者标签没有提供宽度&#xff0c;那就使用wide viewport

            setUserAgentString(String ua)

            设置WebView的用户代理字符串。如果字符串为null或者empty&#xff0c;将使用系统默认值。

            注意从KITKAT版本开始&#xff0c;加载网页时改变用户代理会让WebView再次初始化加载。

            supportMultipleWindows()

            获取webview是否支持多窗口

            supportZoom()

            获取webview是否支持缩放

            2.2.1.2 WebviewClient

            这个类也是跟webview属于同一个包下&#xff0c;主要用来处理各种通知和请求的&#xff0c;再看看它的api

            doUpdateVisitedHistory(WebView view, String url, boolean isReload)

            通知应用程序更新其 存储访问的url的数据库&#xff0c;该方法在网页加载过程中只会被调用一次

            网页前进后退不会回调这个方法

            onFormResubmission(WebView view, Message dontResend, Message resend)

            是否重新提交表单&#xff0c;默认不重发

            onLoadResource(WebView view, String url)

            通知webview将加载由给定的url指定的资源

            onPageCommitVisible(WebView view, String url)

            这个回调在23版本添加&#xff0c;仅用于主框架的导航

            通知应用程序导航到之前页面时&#xff0c;其遗留的webview内容不再被绘制

            这个回调可以用来决定哪些web视图可见内容能被安全地回收&#xff0c;以确保不显示陈旧的内容它最早被调用

            以此保证WebView.onDraw不会绘制任何之前页面的内容&#xff0c;随后绘制背景色或需要加载的新内容。

            onPageFinished(WebView view, String url)

            通知应用程序页面已完成加载&#xff0c;这种方法仅适用与主框架。

            调用该方法时&#xff0c;渲染图片可能尚未更新&#xff0c;要获取新图片的通知

            请使用onNewPicture方法

            onPageStarted(WebView view, String url, Bitmap favicon)

            通知应用程序页面开始绘制 &#xff0c;可以加loading动画

            onReceivedClientCertRequest(WebView view, ClientCertRequest request)

            此方法添加于API21&#xff0c;在UI线程被调用

            处理SSL客户端证书请求&#xff0c;必要的话可以显示一个UI来提供KEY。

            有三种响应方式&#xff1a;proceed&#xff08;&#xff09;/ cancel&#xff08;&#xff09;/ ignore&#xff08;&#xff09;&#xff0c;默认行为是取消请求

            如果调用proceed&#xff08;&#xff09;或cancel&#xff08;&#xff09;&#xff0c;Webview将在内存中保存响应结果并对相应的“host&#xff1a;port”

            不会再次调用onReceivedClientCertRequest

            多数情况下&#xff0c;可通过KeyChain.choosePrivateKeyAlias启动一个活动供用户选择合适的私钥

            onReceivedError(WebView view, int errorCode, String description, String failingUrl)

            通知应用程序加载资源报错&#xff0c;通常是无法链接到服务器

            onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, 

        String realm)

            通知应用程序webview接收到了一个HTTP认证请求&#xff0c;默认是取消请求

            onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse 

        errorResponse)

            通知应用程序在加载资源时从服务器收到HTTP错误&#xff0c;错误的状态码大于等于400&#xff0c;任何资源的错误

            都会回调这个方法。

            onReceivedLoginRequest(WebView view, String realm, String account, String args)

            通知应用程序已处理用户自动登陆的请求

            onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

            通知应用程序加载资源时发生SSL错误&#xff0c;必须调用handler.cancle或者handler.proceed方法

            来取消请求或者继续请求&#xff1b;该决定会用于以后来响应SSL错误&#xff0c;默认是取消请求

            onScaleChanged(WebView view, float oldScale, float newScale)

            通知应用程序页面缩放比例已更改

            onUnhandledKeyEvent(WebView view, KeyEvent event)

            处理未被webview消费的按键事件&#xff0c;除非是系统按键或者shouldoverridekeyevent返回true

            此方法在按键事件分发时被异步调用

            shouldOverrideKeyEvent(WebView view, KeyEvent event)

            给应用一个机会处理按键事件&#xff0c;如果返回true&#xff0c;webview不处理该事件&#xff0c;否则webview

            会一直处理&#xff0c;默认返回false

            shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

            拦截页面加载&#xff0c;返回true表示app拦截并处理了该url&#xff0c;否则返回false由webview处理

            不处理post请求&#xff0c;在api24以后被添加&#xff0c;可拦截处理子frame的非http请求

            shouldOverrideUrlLoading(WebView view, String url)

             同上&#xff0c;不过api24以后被废弃

            2.2.1.3 WebChromeClient 

            它与webview处于同一个包下&#xff0c;辅助webview用于处理JS对话框&#xff0c; 网站图标&#xff0c;标题和进度

            getDefaultVideoPoster()

           

            如果没有指定poster属性&#xff0c;可以通过这个方法提供一个默认的海报图

            getVideoLoadingProgressView()

            当全屏的视频正在缓冲时&#xff0c;此方法返回一个占位图

            getVisitedHistory(ValueCallback<String[]> callback)

            获取所有访问过的历史项目的列表&#xff0c;用于链接着色

            onCloseWindow(WebView window)

            通知应用关闭窗口

            onConsoleMessage(ConsoleMessage consoleMessage)

            接收js控制台消息

            onCreateWindow(WebView view, boolean isDialog, 

        boolean isUserGesture, Message resultMsg)

            请求应用程序创建新窗口

            onGeolocationPermissionsHidePrompt()

            通知应用程序&#xff0c;用先前对onGeolocationPermissionsShowPrompt&#xff08;&#xff09;的调用进行的地理位置权限

            请求已被取消。

            onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback 

        callback)

            通知应用程序指定来源的web内容正在尝试使用Geolocation api&#xff0c;请求定位&#xff0c;

            但目前没有为该来源设置权限状态&#xff0c;非安全的http请求会被默认拒绝

            onHideCustomView()

            通知应用程序当前页面已退出全屏模式&#xff0c;但应用程序必须隐藏自定义view

            onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)

            通知应用程序当前页面进入了全屏模式&#xff0c;此时应用必须显示一个包含网页内容的自定义view

            onJsAlert(WebView view, String url, String message, JsResult result)

            告诉客户端显示一个JS警告对话框

            onJsBeforeUnload(WebView view, String url, String message, JsResult result)

            显示一个对话框让用户选择是否离开当前页面

            onJsConfirm(WebView view, String url, String message, JsResult result)

            告诉客户端显示一个确认对话框

            onJsPrompt(WebView view, String url, String message, String defaultValue, 

        JsPromptResult result)

            显示一个prompt对话框

            onPermissionRequest(PermissionRequest request)

            通知应用程序web内容正在请求访问指定资源的权限&#xff0c;该权限未被授权或取消

            onPermissionRequestCanceled(PermissionRequest request)

            通知应用程序权限申请被取消&#xff0c;隐藏相关UI

            onProgressChanged(WebView view, int newProgress)

            接受当前页面的加载进度

            onReceivedIcon(WebView view, Bitmap icon)

            通知应用程序接受当前页面新图标

            onReceivedTitle(WebView view, String title)

            获取当前文档标题

           onShowFileChooser(WebView,ValueCallback<Uri[]> , WebChromeClient.FileChooserParams)

            为 显示文件选择器&#xff0c;返回false使用默认处理

 

 

静待更新

后续篇章请前往Android之WebView/WebViewClient/WebChromeClient使用解析及Android与JS相互调用 【二】

 


推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 近期,微信公众平台上的HTML5游戏引起了广泛讨论,预示着HTML5游戏将迎来新的发展机遇。磊友科技的赵霏,作为一名HTML5技术的倡导者,分享了他在微信平台上开发HTML5游戏的经验和见解。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • jQuery插件验证与屏幕键盘功能的集成解决方案
    本文介绍了一种集成了验证功能和屏幕键盘的jQuery插件解决方案。该插件不仅提供了强大的表单验证功能,还引入了一个高度可定制的屏幕键盘,以增强用户体验。通过这一集成方案,开发者可以轻松实现复杂的表单验证逻辑,并为用户提供便捷的输入方式,特别适用于移动设备或特殊输入场景。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 如何撰写PHP电商项目的实战经验? ... [详细]
author-avatar
baby小明君
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有