当前位置:  开发笔记 > 编程语言 > 正文

微信公众平台开发教程②微信端分享功能图文详解

这篇文章主要介绍了微信公众平台开发微信端分享功能,结合图文形式详细分析了微信分享功能的原理、操作步骤及相关实现技巧,需要的朋友可以参考下

本文实例讲述了微信公众平台微信端分享功能。分享给大家供大家参考,具体如下:

背景

    初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的小白一点帮助。

    今天想添加微信分享的功能,如果不进行自定义设计,那么当我们点击分享朋友圈、好友或者QQ好友、空间时,默认的标题就是标签中的信息,而显示的描述信息就是链接,图片多是默认为页面中显示的第一张图片,显然这样的处理是不合理的,所以需要查询开发文档进行编码设计。<br /> </p> <h3 style="line-height: 26px; font-size: 14px">操作步骤:</h3> <h4>一.参考微信公众号开发文档</h4> <h5>【1】.登录微信公众号</h5> <p>      打开 “开发者工具->开发者文档->微信网页开发->微信JS-SDK说明文档”,找到对应的位置,首先要了解官方的需求说明才能进行下一步的开发。 <br />         <img alt="" width="500" height="400" style="font-family: 'KaiTi_GB2312'; font-size: 18px" src="https://img.devbox.cn/3cccf/24afe/978/d090324c403f9ce5.png" /></p> <h5>【2】.建议详细参考文档后再考虑代码的编写</h5> <p>      提示:下拉上图中的网页最下端,下载官方提供的参考demo。本文的最后我会提供一份稍作修改的仅针对于php的实现代码,可作参考。 <br />         <img alt="" width="500" height="100" style="font-family: 'KaiTi_GB2312'; font-size: 18px" src="https://img.devbox.cn/3cccf/24afe/978/13e52a06a1ba0c0e.png" /></p> <h4>二.代码实现(PHP)及部分问题引导</h4> <h5>【1】.我提供的代码就是下图中的几个简单文件</h5> <p>      主要来源于微信公众号的开发文档,上面提到过一次。其中,我们操作的分享页面代码只需参考 sharePage.php就好,对于官方的实现可以去阅读其他文件,毕竟我们实现功能只需导入文件,调用所提供类及方法就好。 <br />         <img alt="" width="500" height="100" style="font-family: 'KaiTi_GB2312'; font-size: 18px" src="https://img.devbox.cn/3cccf/24afe/978/27b2e09175df048a.png" /></p> <h5>【2】.在此提供 sharePage.php 简单代码,以便参考讲解。</h5> <p>      其中提出几点需要注意的是: </p> <p>(1).需要提供 $appid, $secret </p> <p>(2).代码中需要引用微信端提供的js文件<script src="https://img.devbox.cn/3cccf/16086/243/6db233c03a276edb.png', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: ' 微信分享给朋友', // 分享标题 desc: '描述一下,可是知道该咋描述你呢?', // 分享描述 link: 'http://www.baidu.com', // 分享链接 imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 }); wx.onMenuShareQQ({ title: 'QQ我要跳转到百度页面了啊!', // 分享标题 desc: '描述一下,可是知道该咋描述你呢?', // 分享描述 link: 'http://www.baidu.com', // 分享链接 imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享图标 }); wx.onMenuShareQZone({ title: 'QZone我要跳转到百度页面了啊!', // 分享标题 desc: '描述一下,可是知道该咋描述你呢?', // 分享描述 link: 'http://www.baidu.com', // 分享链接 imgUrl: 'http://img1.3lian.com/img013/v2/4/d/101.jpg', // 分享图标 }); }); </script> </html></pre> </div> <h5>【3】.正常操作中,可能会有 “errMsg config:invalid signature" 签名错误</h5> <p>      可以参考博文  《微信js sdk invalid signature签名错误》,网上多数的建议是检查签名证书是否正确,用作者的话就是“确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验”。 <br />        <img alt="" width="500" height="350" style="text-align: center; font-family: 'KaiTi_GB2312'; color: rgb(51,51,51); font-size: 18px" src="https://img.devbox.cn/3cccf/24afe/978/2febd94e3b4be160.png" />       对于需要填入的信息,可以从上文中打印出需要的信息,我做注释的那一部分信息,请参考。不过,普遍情况,这样的签名是没有问题的,可作为参考。</p> <h5>【4】.新发现一种情况</h5> <p>     原先一切正常的分享功能,突然变得无法显示分享时的链接、图片等,我将 wx.config 中的debug 设定为true继续报错“errMsg config:invalid signature",并非签名证书的问题,我猜测应该是文档中一直提及的token或ticket缓存问题,个人打开之前导入的两个文件发现已经重新写入了值,但是我将其重新改为当初下载下来的文件放入服务器中覆盖,意外的发现可以重新获得正确的分享能力,不知哪一天又会出现问题,也希望好心的大牛告知一下。</p> <h6>【2016-7-14 补充】</h6> <p>      经测试发现,上文提及分享功能的失败,与token ,ticket 存储文件没有多大关系,因为如今无法重现 Bug,无语的是,发现当初开发者中心使用的测试号是被赋予了分享权限的,然而自己申请的订阅号,通过查看“接口权限”发现“未获得”分享权限。</p> <p><br /> </p> <p>        <img alt="" width="500" height="200" style="text-align: center; font-family: 'KaiTi_GB2312'; color: rgb(51,51,51); font-size: 18px" src="https://img.devbox.cn/3cccf/24afe/978/f021a3f8da329411.png" /></p> <p><br /> </p> <p>      一般的服务号都是拥有分享权限的,获取需要开通什么来着,具体的可百度,我的问题是没有进入“公众号平台->公众号设置->功能设置”中填写“JS接口安全域名”,其中要求是备案过的域名,个人实验证明填写去掉“http://www”后的形如“beidou.com”的域名即可,便于限制诱导关注的情况出现。</p> <p>      设置完成后可以查看上图中的“分享接口”,保证里面显现的是获得权限,然后再进行菜单栏的分享测试即可发现,正常进行。</p> <h5>【5】.我遇到过提示此处代码报错的问题</h5> <p>      参考网上资源介绍的多是与签名安全相关的信息,可自行百度,鉴于能力有限,暂时发现注释此处的代码可避免该问题的影响,等有时间再做深入解决。 <br />      <img alt="" width="500" height="200" src="https://img.devbox.cn/3cccf/24afe/978/b43a16b19560cf00.png" /> <br /> </p> <h5>【6】.最后的报错信息显示该处对于文件操作的权限不足的问题</h5> <p>      类似 “<span style="color: #ff0000">Warning: fopen(access_token.json) [function.fopen]: failed to open stream: Permission denied in jssdk.php </span>"问题,可以参考此文的部分介绍。 <br />      <img alt="" width="500" height="100" src="https://img.devbox.cn/3cccf/24afe/978/c5edfe6fc86b4eb9.png" />       值得一提的是该问题大多牵扯操作系统的权限分配,之前我用的是新浪SAE进行测试,后面得知SAE是无法由我们用户进行权限设定的,最后我选择了公司服务器,使用类似 “<span style="color: #0000ff">chmod -R 777 /home/mypackage </span>” 的命令进行对应文件的操作权限分配。</p> <h4>三.补充</h4> <p>1.出现问题,多参考别人的解决方法,可见有一个可以带你的前辈是多么重要 </p> <p>2.自己探索问题的解决方法,然后做好笔记作为自己的经历回顾,虽然解决时间拉长,但成就感绝对比从别人口中听来分量重的多。 </p> <p>3.在此我粘贴稍作修改后的代码,其实就是其中的大概几行的改动,为了配合上面签名的测试,所以需要参考,其中另外的两个文件没做改动,无需上传,公众号开发文档的最后就有 demo 文件,具体的请参照开发文档。      </p> <div class="jb51code"> <pre class="brush:php;"> <?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appSecret) { $this->appId = $appId; $this->appSecret = $appSecret; } public function getSignPackage() { $jsapiTicket = $this->getJsApiTicket(); // 注意 URL 一定要动态获取,不能 hardcode. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $timestamp = time(); $nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string); $signPackage = array( "appId" => $this->appId, "jsapiTicket" => $jsapiTicket, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; } private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode($this->get_php_file("jsapi_ticket.php")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); // 如果是企业号用以下 URL 获取 ticket // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken"; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $res = json_decode($this->httpGet($url)); $ticket = $res->ticket; if ($ticket) { $data->expire_time = time() + 7000; $data->jsapi_ticket = $ticket; $this->set_php_file("jsapi_ticket.php", json_encode($data)); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode($this->get_php_file("access_token.php")); if ($data->expire_time < time()) { // 如果是企业号用以下URL获取access_token // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret"; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $res = json_decode($this->httpGet($url)); $access_token = $res->access_token; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $this->set_php_file("access_token.php", json_encode($data)); } } else { $access_token = $data->access_token; } return $access_token; } private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。 // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; } private function get_php_file($filename) { return trim(substr(file_get_contents($filename), 15)); } private function set_php_file($filename, $content) { $fp = fopen($filename, "w"); fwrite($fp, "<?php exit();?>" . $content); fclose($fp); } }</pre> </div> <p><br /> </p> <h4>四、附录</h4> <p>    1.在此推荐参考一篇比较详细的 微信分享博文,向前辈致敬。   <br />     2.源代码之前存于360云盘共享<br /> 如今已经过期找不到了。其实参考文中的代码同时下载官方demo就能完全重现源代码。<br />     3.此处 <span style="color: #339966">推荐参考新篇</span>: 微信公众平台开发教程微信开发集成类的使用 (包含微信分享功能)</p> <p>更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP微信开发技巧汇总》、《php curl用法总结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结》</p> <p>希望本文所述对大家PHP程序设计有所帮助。</p> </div> <div class="article_ab" style="width: 720px;height: 100px;margin: 0 auto;margin-top: 15px;"> </div> <div class="article_recommend"> <div class="list_top">推荐阅读</div> <div class="ListItems"> <ul class="NewsList"> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/QueShao_Type-Get_2be4b761.html" target="_blank" title="缺少Type.GetMember和MemberInfo.GetCustomAttributes(C#PCL .NET 4.6)">缺少Type.GetMember和MemberInfo.GetCustomAttributes(C#PCL .NET 4.6)</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《缺少Type.GetMember和MemberInfo.GetCustomAttributes(C#PCL.NET4.6)》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/QueShao_Type-Get_2be4b761.html" target="_blank" title="缺少Type.GetMember和MemberInfo.GetCustomAttributes(C#PCL .NET 4.6)">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/ZhuanChu_Postgre_669d95cc.html" target="_blank" title="转储Postgres DB,时间和.sql文件的权重">转储Postgres DB,时间和.sql文件的权重</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《转储PostgresDB,时间和.sql文件的权重》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/ZhuanChu_Postgre_669d95cc.html" target="_blank" title="转储Postgres DB,时间和.sql文件的权重">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/RuHeZhiJieXieRuM_0c1e171c.html" target="_blank" title="如何直接写入模仿scalar_summary的摘要?">如何直接写入模仿scalar_summary的摘要?</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《如何直接写入模仿scalar_summary的摘要?》经验,为你挑选了2个好方法。 ... <a href="https://devbox.cn/p/RuHeZhiJieXieRuM_0c1e171c.html" target="_blank" title="如何直接写入模仿scalar_summary的摘要?">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/GengGaiZuoCeDe_T_399024b3.html" target="_blank" title="更改左侧的ToolBar默认图标">更改左侧的ToolBar默认图标</a></h2> </div> <div class="NewsInfo"> <div class="NewsImg"> <a href="https://devbox.cn/p/GengGaiZuoCeDe_T_399024b3.html" target="_blank" title="更改左侧的ToolBar默认图标"><img src="https://img.devbox.cn/3cccf/16086/243/2fcde13858a61eac.png" width="120" height="70" alt="更改左侧的ToolBar默认图标"/></a> </div> <div class="NewsDesc" style="width:500px;margin-left:15px;"> 如何解决《更改左侧的ToolBar默认图标》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/GengGaiZuoCeDe_T_399024b3.html" target="_blank" title="更改左侧的ToolBar默认图标">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/BufferedWriter_L_3a19d16a.html" target="_blank" title="BufferedWriter类的writeLine方法">BufferedWriter类的writeLine方法</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《BufferedWriter类的writeLine方法》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/BufferedWriter_L_3a19d16a.html" target="_blank" title="BufferedWriter类的writeLine方法">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/BuFenSuoYinDeJuX_acf3a625.html" target="_blank" title="部分索引的局限性是什么?">部分索引的局限性是什么?</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《部分索引的局限性是什么?》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/BuFenSuoYinDeJuX_acf3a625.html" target="_blank" title="部分索引的局限性是什么?">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/WoZenYangCaiNeng_16e7d31f.html" target="_blank" title="我怎样才能简单地添加一个Spring Data REST实体的链接">我怎样才能简单地添加一个Spring Data REST实体的链接</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《我怎样才能简单地添加一个SpringDataREST实体的链接》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/WoZenYangCaiNeng_16e7d31f.html" target="_blank" title="我怎样才能简单地添加一个Spring Data REST实体的链接">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/WeiShiMeZheGeHan_a194d4ba.html" target="_blank" title="为什么这个函数返回NaN?">为什么这个函数返回NaN?</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《为什么这个函数返回NaN?》经验,为你挑选了0个好方法。 ... <a href="https://devbox.cn/p/WeiShiMeZheGeHan_a194d4ba.html" target="_blank" title="为什么这个函数返回NaN?">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/YouYuYueShuCuoWu_05e5afa2.html" target="_blank" title="由于约束错误,无法在C#中实现VB接口">由于约束错误,无法在C#中实现VB接口</a></h2> </div> <div class="NewsInfo"> <div class="NewsImg"> <a href="https://devbox.cn/p/YouYuYueShuCuoWu_05e5afa2.html" target="_blank" title="由于约束错误,无法在C#中实现VB接口"><img src="https://img.devbox.cn/3cccf/16086/243/6db233c03a276edb.png" width="120" height="70" alt="由于约束错误,无法在C#中实现VB接口"/></a> </div> <div class="NewsDesc" style="width:500px;margin-left:15px;"> 如何解决《由于约束错误,无法在C#中实现VB接口》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/YouYuYueShuCuoWu_05e5afa2.html" target="_blank" title="由于约束错误,无法在C#中实现VB接口">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/Cong_SPARK_Zhong_4edee365.html" target="_blank" title="从SPARK中的另一个RDD返回最大N值的RDD">从SPARK中的另一个RDD返回最大N值的RDD</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《从SPARK中的另一个RDD返回最大N值的RDD》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/Cong_SPARK_Zhong_4edee365.html" target="_blank" title="从SPARK中的另一个RDD返回最大N值的RDD">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/Try-catch_Chuang_43cc3da5.html" target="_blank" title="Try-catch创建无限循环">Try-catch创建无限循环</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《Try-catch创建无限循环》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/Try-catch_Chuang_43cc3da5.html" target="_blank" title="Try-catch创建无限循环">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/E_UNEXPECTEDUWP__a6c181dd.html" target="_blank" title="E_UNEXPECTED UWP灾难性失败">E_UNEXPECTED UWP灾难性失败</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《E_UNEXPECTEDUWP灾难性失败》经验,为你挑选了0个好方法。 ... <a href="https://devbox.cn/p/E_UNEXPECTEDUWP__a6c181dd.html" target="_blank" title="E_UNEXPECTED UWP灾难性失败">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/RuHeShiBieXiangL_975bf3a4.html" target="_blank" title="如何识别向量中一系列NA的索引">如何识别向量中一系列NA的索引</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《如何识别向量中一系列NA的索引》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/RuHeShiBieXiangL_975bf3a4.html" target="_blank" title="如何识别向量中一系列NA的索引">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/You_2_GeFenZhiGo_878f8662.html" target="_blank" title="由2个分支共享的Git rebase 2提交">由2个分支共享的Git rebase 2提交</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《由2个分支共享的Gitrebase2提交》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/You_2_GeFenZhiGo_878f8662.html" target="_blank" title="由2个分支共享的Git rebase 2提交">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/YiZhongFangFaZai_8ba4f054.html" target="_blank" title="一种方法在几种方法中调用">一种方法在几种方法中调用</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《一种方法在几种方法中调用》经验,为你挑选了3个好方法。 ... <a href="https://devbox.cn/p/YiZhongFangFaZai_8ba4f054.html" target="_blank" title="一种方法在几种方法中调用">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/RuHeZai_flask-mi_b8244cef.html" target="_blank" title="如何在flask-migrate迁移中自动导入模块">如何在flask-migrate迁移中自动导入模块</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《如何在flask-migrate迁移中自动导入模块》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/RuHeZai_flask-mi_b8244cef.html" target="_blank" title="如何在flask-migrate迁移中自动导入模块">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/ZongXiangHeHengX_14b289db.html" target="_blank" title="纵向和横向模式下的不同布局">纵向和横向模式下的不同布局</a></h2> </div> <div class="NewsInfo"> <div class="NewsImg"> <a href="https://devbox.cn/p/ZongXiangHeHengX_14b289db.html" target="_blank" title="纵向和横向模式下的不同布局"><img src="https://img.devbox.cn/3cccf/16086/243/c1c0b4e02fdd405a.png" width="120" height="70" alt="纵向和横向模式下的不同布局"/></a> </div> <div class="NewsDesc" style="width:500px;margin-left:15px;"> 如何解决《纵向和横向模式下的不同布局》经验,为你挑选了2个好方法。 ... <a href="https://devbox.cn/p/ZongXiangHeHengX_14b289db.html" target="_blank" title="纵向和横向模式下的不同布局">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/RuHeJiangBianLia_1ff40c51.html" target="_blank" title="如何将变量从BeforeTest传递给Test annotation">如何将变量从BeforeTest传递给Test annotation</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《如何将变量从BeforeTest传递给Testannotation》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/RuHeJiangBianLia_1ff40c51.html" target="_blank" title="如何将变量从BeforeTest传递给Test annotation">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/TongGuo_Javascri_452b4701.html" target="_blank" title="通过Javascript函数打开和关闭对话框元素">通过Javascript函数打开和关闭对话框元素</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《通过Javascript函数打开和关闭对话框元素》经验,为你挑选了1个好方法。 ... <a href="https://devbox.cn/p/TongGuo_Javascri_452b4701.html" target="_blank" title="通过Javascript函数打开和关闭对话框元素">[详细]</a> </div> <div style="clear:both"></div> </li> <li> <div class="NewTitle"> <a class="cat" href="/tag/程序员" title="程序员" target="_blank">程序员<i></i></a> <h2><a href="https://devbox.cn/p/Jiang_TextWatche_d29dca7f.html" target="_blank" title="将TextWatcher与自定义适配器连接以通过EditText过滤文本">将TextWatcher与自定义适配器连接以通过EditText过滤文本</a></h2> </div> <div class="NewsInfo"> <div class="NewsDesc" > 如何解决《将TextWatcher与自定义适配器连接以通过EditText过滤文本》经验,为你挑选了0个好方法。 ... <a href="https://devbox.cn/p/Jiang_TextWatche_d29dca7f.html" target="_blank" title="将TextWatcher与自定义适配器连接以通过EditText过滤文本">[详细]</a> </div> <div style="clear:both"></div> </li> </ul> </div> </div> <div class="article_cmnt" style="display: none;"> <div class="cmnt_title">吐了个 "CAO" !</div> <form action="" method="post"> <div class="cmnt_text"> <textarea class="ping-txt" onfocus="ck_txt(this);" onblur="ck_txt2(this);" id="ping-txt" name="ping-txt" >吐个槽吧,看都看了</textarea> </div> <div class="cmnt_cmt"> <div class="cmnt_login_box"> <a href="https://www.php1.cn/?s=user/login/index&from=">会员登录</a> | <a href="http://www.php1.cn/?s=user/reg/index">用户注册</a> </div> <div class="post_cmnt"><input type="button" value="吐  槽" onclick="post_ping();" /></div> </div> </form> </div> </div> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushBash.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushCpp.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushCSharp.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushCss.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushDelphi.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushDiff.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushGroovy.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushJava.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushJScript.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushPhp.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushPlain.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushPython.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushRuby.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushScala.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushSql.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushVb.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushXml.js"></script> <link type="text/css" rel="stylesheet" href="/style/SyntaxHighlighter/styles/shCore.css"/> <link type="text/css" rel="stylesheet" href="/style/SyntaxHighlighter/styles/shThemeLiuQing.css"/> <style> .syntaxhighlighter{ width: 740px; padding-top:40px;padding-bottom:20px; border: 1px solid #333; background: url("/style/SyntaxHighlighter/top_bg.svg"); background-size: 43px; background-repeat: no-repeat; margin-bottom: -7px; border-radius: 15px; background-position: 16px 12px; padding-left: 10px; } .gutter{ display: none; } </style> <script type="text/javascript"> SyntaxHighlighter.all(); </script> <div class="article_right"> <div class="profile"> <div class="author"> <!-- 未登录 --> <div class="author-avatar"> <a href="/u/shoujiyonghu_2502851955"> <img src="https://img.devbox.cn/3cdc5/64c2/cd5/f53c066002fa970f.png" class="lazy-img" data-url="" alt="devbox"> </a> </div> <div class="author-name"> 手机用户2502851955 </div> <div class="author-intro"> 这个屌丝很懒,什么也没留下! </div> <div class="author-bt"> <a href="javascript:;" id="follow_bt" onclick="follow();" class="skins-btn" title="关注作者"> <svg class="icon" style="width: 15px;height: 15px;margin-top:-3px;margin-right:5px;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1428"><path d="M1024 409.6H614.4V0H409.6v409.6H0v204.8h409.6v409.6h204.8V614.4h409.6z" fill="#ffffff" p-id="1429"></path></svg> 关注作者</a> </div> </div> </div> <div class="tools"> <div class="tools_top">Tags | 热门标签</div> <div class="tools_box"> <ul> <li> <a href="/tag/actionscrip" target="_blank" title="actionscrip">actionscrip</a> </li> <li> <a href="/tag/bash" target="_blank" title="bash">bash</a> </li> <li> <a href="/tag/c#" target="_blank" title="c#">c#</a> </li> <li> <a href="/tag/c++" target="_blank" title="c++">c++</a> </li> <li> <a href="/tag/c语言" target="_blank" title="c语言">c语言</a> </li> <li> <a href="/tag/erlang" target="_blank" title="erlang">erlang</a> </li> <li> <a href="/tag/flutter" target="_blank" title="flutter">flutter</a> </li> <li> <a href="/tag/go" target="_blank" title="go">go</a> </li> <li> <a href="/tag/golang" target="_blank" title="golang">golang</a> </li> <li> <a href="/tag/java" target="_blank" title="java">java</a> </li> <li> <a href="/tag/javascript" target="_blank" title="javascript">javascript</a> </li> <li> <a href="/tag/lua" target="_blank" title="lua">lua</a> </li> <li> <a href="/tag/node.js" target="_blank" title="node.js">node.js</a> </li> <li> <a href="/tag/perl" target="_blank" title="perl">perl</a> </li> <li> <a href="/tag/php" target="_blank" title="php">php</a> </li> <li> <a href="/tag/python" target="_blank" title="python">python</a> </li> <li> <a href="/tag/scala" target="_blank" title="scala">scala</a> </li> <li> <a href="/tag/typescript" target="_blank" title="typescript">typescript</a> </li> <div style="clear: both"></div> </ul> </div> </div> <div class="rank"> <div class="rank_top">RankList | 热门文章</div> <div class="rank_box"> <ul> <li> <b >1</b><a href="https://devbox.cn/p/BaoHanBuJuDeGenS_514094eb.html" title="包含布局的根视图上的NullPointerException" target="_blank">包含布局的根视图上的NullPointerException</a> </li> <li> <b >2</b><a href="https://devbox.cn/p/WuFaJiangXinHaoL_c1509a7a.html" title="无法将信号连接到main()内的函数" target="_blank">无法将信号连接到main()内的函数</a> </li> <li> <b >3</b><a href="https://devbox.cn/p/WoYingGaiCongNaL_1ca75619.html" title="我应该从哪里开始学习Highcharts JS?" target="_blank">我应该从哪里开始学习Highcharts JS?</a> </li> <li> <b >4</b><a href="https://devbox.cn/p/ZiDingYi_UIPicke_0e767ed7.html" title="自定义UIPickerView,带有三个组件,每个组件在选择指示器上显示标签" target="_blank">自定义UIPickerView,带有三个组件,每个组件在选择指示器上显示标签</a> </li> <li> <b >5</b><a href="https://devbox.cn/p/RuHeZai_Liferay6_e4db1ff4.html" title="如何在Liferay 6中创建默认文档类型和元数据集?" target="_blank">如何在Liferay 6中创建默认文档类型和元数据集?</a> </li> <li> <b class="black">6</b><a href="https://devbox.cn/p/RuHeHuoQuLieBiao_695a18c7.html" title="如何获取列表列表中的每个元素?" target="_blank">如何获取列表列表中的每个元素?</a> </li> <li> <b class="black">7</b><a href="https://devbox.cn/p/SuiJiXingZouXion_fec45c1e.html" title="随机行走熊猫" target="_blank">随机行走熊猫</a> </li> <li> <b class="black">8</b><a href="https://devbox.cn/p/AndroidNumberPic_7657269c.html" title="Android NumberPicker在显示值更改时包装值" target="_blank">Android NumberPicker在显示值更改时包装值</a> </li> <li> <b class="black">9</b><a href="https://devbox.cn/p/WPFDatagrid-_Qia_00ad1a3d.html" title="WPF Datagrid - 强制单行行" target="_blank">WPF Datagrid - 强制单行行</a> </li> <li> <b class="black">10</b><a href="https://devbox.cn/p/JSF2_XiaZaiDaiYo_f840d285.html" title="JSF 2下载带有西里尔文名称的文件" target="_blank">JSF 2下载带有西里尔文名称的文件</a> </li> <li> <b class="black">11</b><a href="https://devbox.cn/p/RuHeShiYong_jque_3fe6eebb.html" title="如何使用jquery从json数组中分离值." target="_blank">如何使用jquery从json数组中分离值.</a> </li> <li> <b class="black">12</b><a href="https://devbox.cn/p/WeiShiMeZheGe_JS_9a9c0fe4.html" title="为什么这个JS代码无效?" target="_blank">为什么这个JS代码无效?</a> </li> <li> <b class="black">13</b><a href="https://devbox.cn/p/ChangShiKaiShiSh_7a2fc6c3.html" title="尝试开始使用doParallel和foreach但没有改进" target="_blank">尝试开始使用doParallel和foreach但没有改进</a> </li> <li> <b class="black">14</b><a href="https://devbox.cn/p/ChuMo_starlingsp_8166d817.html" title="触摸starling sprite中空白空间的事件" target="_blank">触摸starling sprite中空白空间的事件</a> </li> <li> <b class="black">15</b><a href="https://devbox.cn/p/RuHeCongShiJianC_1c6ad481.html" title="如何从事件处理程序中删除自己?" target="_blank">如何从事件处理程序中删除自己?</a> </li> <li> <b class="black">16</b><a href="https://devbox.cn/p/YongYuZhuanHuanW_81b62ca2.html" title="用于转换为并行集合的通用类型参数" target="_blank">用于转换为并行集合的通用类型参数</a> </li> <li> <b class="black">17</b><a href="https://devbox.cn/p/Zai_gdb_Zhong_-__38108aa4.html" title="在gdb中,我可以调用一些类函数,但其​​他函数"无法解析".为什么?" target="_blank">在gdb中,我可以调用一些类函数,但其​​他函数"无法解析".为什么?</a> </li> <li> <b class="black">18</b><a href="https://devbox.cn/p/ShuangLunKuoHeEr_43baea2d.html" title="双轮廓和二次误差函数" target="_blank">双轮廓和二次误差函数</a> </li> <li> <b class="black">19</b><a href="https://devbox.cn/p/for_XunHuanChaZh_7583fd2a.html" title="for循环查找unix中是否存在目录" target="_blank">for循环查找unix中是否存在目录</a> </li> <li> <b class="black">20</b><a href="https://devbox.cn/p/sbtclearscreen_M_d47d27aa.html" title="sbt clear screen命令" target="_blank">sbt clear screen命令</a> </li> </ul> </div> </div> </div> <div style="clear: both;"></div> </div> <script type="application/javascript"> function follow(uid) { var myDate = new Date(); $.get("/user/follow/post?uid="+uid+"&stime="+myDate.getMilliseconds(),null,function(response){ if(response=="1"){ tips('关注成功!') $("#follow_bt").html('<svg class="icon" style="width: 15px;height: 15px;margin-top:-3px;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1912"><path d="M984.554971 729.818319L757.2752 1001.934666c-23.431608 29.784785-63.349596 27.462118-91.084969 0l-148.309102-117.727323a34.156864 34.156864 0 0 1 34.156863-59.159688L711.732715 956.392181l224.524451-274.871667a34.156864 34.156864 0 1 1 48.297805 48.297805zM506.791534 592.052303c-6.284863 6.968-12.569726 0-22.771243 0-171.103115 0-386.928951 164.066802-386.928951 358.396584 0 18.740733-15.347817 33.951922-34.316262 33.951922a34.156864 34.156864 0 0 1-34.361805-33.951922c0-160.582801 134.122618-342.616113 323.283329-400.181814C261.271998 499.783228 210.765382 406.011252 210.765382 296.026151 210.765382 133.530566 342.428706 0 506.791534 0s296.026151 133.530566 296.026151 296.026151c0 161.630279-132.892971 294.614334-296.026151 296.026152z m0-523.738576c-126.243768 0-227.712424 102.903244-227.712424 227.712424s101.468656 227.712424 227.712424 227.712424 227.712424-102.903244 227.712424-227.712424S633.035302 68.313727 506.791534 68.313727z" p-id="1913"></path></svg>\n' +"已关注") }else if(response=="0"){ tips('已取消关注!') $("#follow_bt").html('<svg class="icon" style="width: 15px;height: 15px;margin-top:-3px;margin-right:5px;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1428"><path d="M1024 409.6H614.4V0H409.6v409.6H0v204.8h409.6v409.6h204.8V614.4h409.6z" fill="#ffffff" p-id="1429"></path></svg>\n' + "关注作者") }else if(response=="-2"){ tips("请先登录!") }else{ tips("关注失败!") } }); } function like(sid) { var myDate = new Date(); $.get("/blog/article/like?sid="+sid+"&stime="+myDate.getMilliseconds(),null,function(response){ if(response!="-1"){ $("#like_num").html(response+"赞") }else{ tips("关注失败!") } }); } </script> <div class="bottom-bar"> DevBox开发工具箱 | 专业的在线开发工具网站    <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802040832" style="color:#444;"><img src="https://img.json1.cn/3cd4a/21981/c5a/4df0b47476da9030.png"/>京公网安备 11010802040832号</a>  |  <a href="https://beian.miit.gov.cn/" target="_blank" >京ICP备19059560号-6</a> <BR /> Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有 <BR /> </div></body> </html>