兼容Android的html5移动端视频播放video全屏处理/自动播放/播放控制/隐藏播放控件

前段时间客户希望网站中的视频是自动播放,全屏播放、循环播放的,恰好也是一个类似视频全屏的,下面分享下这个方法。

ios端问题其实没什么,基本都在android端,基本每一个带有视频的项目都会遇到的,当然有特殊需求的产生的情况另说了就,问题主要有几个方面:

  1. 全屏处理;
  2. 自动播放;
  3. 播放控制;
  4. 隐藏播放控件;

video全屏的处理

这个其实不难,只需在video标签加个webkit-playsinline属性即可,这个属性基本上在基于webkit内核的移动端都是没问题的,此全屏非彼全屏,它是在浏览器视窗内的全屏,并不是占居整个手机的全屏,当然我们做web端需要的就是在document的body内的视窗范围的全屏。

<video id="myvideo" src="test.mp4" webkit-playsinline="true"></video>

在ios下,视频被嵌入后,媒体的元数据加载完成后,会以全屏的形式显示出来,或者加个poster,可以看到画面。但在android下,多数机子是不显示视频画面的,要不就是显示一个黑色的还不是全屏的播放控件,即使及加个poster封面也不济于是。因为poster在android兼容的并不好,不如在视频上层加个div铺张图片,这个比较好的处理方式应该是:视频上加一层div做封面,由于android不允许视频上层有东西,所以首先将视频设为的width:1px,当播放后,上层的封面remove掉,同时width:100%或者你想要的宽度。

video的自动播放

这个的话就不多说了,相信大家跟我一样,试图寻找android下,页面加载完毕就可以自动播放,但现实是残酷的,android下是不允许自动播放的,即使你用了video.play(),也是不行的。必须有用户的主动触发,比如触摸了屏幕,有click或touch事件产生。不知以后android会不会改进,但至少目前来看是不行的。比较的好的办法是,引导用户触发,滑屏或touch的行为,然后调用video.play()播放,给用户一个自动播放的错觉。

video播放的控制

对于video或者audio等媒体元素,有一些方法,常用的有play(),pause();也有一些事件,如’loadstart’,’canplay’,’canplaythrough’,’ended’,’timeupdate’…..等等。

在移动端有一些坑需要注意,不要轻易使用媒体元素的除’ended’,’timeupdate’以外event事件,在不同的机子上可能有不同的情况产生,例如:
ios下监听’canplay’和’canplaythrough’(是否已缓冲了足够的数据可以流畅播放),当加载时是不会触发的,即使preload=”auto”也没用,但在pc的chrome调试器下和android下,是会在加载阶段就触发。ios需要播放后才会触发。
总之就是现在的视频标准还不尽完善,有很多坑要注意,要使用前最好自己亲测一遍。

关于控制的问题还想说一点就是android在播放视频时会有个控件初始化的过程,在全屏视频想伪装成非视频时,是我们很不想看到的,我的解决思路是这样:在我们需要播放时提前初始化它,即需要播放的时间前先设width:1px;然后play()一下,使视频已经播放初始化。然后再需要播放的时候再次play()时就不会产生,控件拉伸的情况了。

“去除”android下的播放控件条

重头戏来了,相信这个这个问题已困扰无数的前端开发人员,再搜寻这个问题的解决方法时,几乎所有的文章都是告诉你android下,播放器的控件是去不了的。其实似乎确实是这样的,但你看了故宫穿越H5,和吴一凡那个H5后,会发现,在android下,也是没有控制条的。最初看到那些H5视频我首先并没有去看他们的内容多么新颖,传播量多么广,我是第一时间测试了android下的兼容问题,发现并没有出现控制条。在我研究半天未果时,在一篇技术帖中看到说:因是腾讯自己的项目,微信是腾讯自己的,他们在浏览器里做了一些配置,对旗下出品的H5有所“优待”,才能确保视频的顺利“乔装”。

上面的说法我并没有真正核实过,但好像是这么回事,非常有幸我做的那个视频项目也是腾讯的,其实是有机会可以向他们证实一下以上说法的,但即使是这样的,也只有腾讯的项目有这样的解决办法,对于广大的开发者来说似乎并太不公平,我试图找到一种解决去除播放控件的解决方案,下面是我花了很多心思找到的一种解决办法,看似很简单也不那么高大尚,但确实解决了问题,跟大家分享:

我这里只看android的情况,ios基本没什么问题,就忽略啦。
测试机android版本:5.1
首先我们将那个H5视频地址嵌入自己的页面,你会发现确实播放器出现了。如下

H5视频地址嵌入页面播放器出现

怎么办呢,不是腾讯自己的项目就没办法了嘛?再我搜了N多资料未果后,发现了一个细节,控制条始终是最下方的,可不可以让视频的尺寸放大些,将控制条顶到浏览窗口外面,就看不到了嘛,于是我将视频宽高放大到120%—–控件条神奇的‘消失’了(其实是顶到视窗外面了),惊喜万分啊。

具体思路和实现如下:html中将video标签外包一层,

    <div class="videobox">
        <video id="mainvideo" webkit-playsinline="true" src="http://7xvl2z.com1.z0.glb.clouddn.com/nigg2.mp4"></video>
    </div>

初始样式表如下:

html,body {
  padding: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  -webkit-user-select: none; 
  user-select: none;
  overflow: hidden;
}

.videobox {
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  overflow: hidden;
}

video {width: 1px;display: blcok;}

/*
注:html,body里的overflow:hidden,非常重要,不能省。
因为微信android的播放器是脱离DOM结构的,也不会响应click、touch等事件。
如果视频尺寸大了,会产生滚动条,必须在html和body加overflow:hidden,
在videobox加没用的。
*/

当视频要播放时改变video的宽度(高度会等比缩放,即使自定义高度也是没用的,会被忽略)

  var video = document.querySelector('#mainvideo');
  var videobox = document.querySelector('.videobox');

  //播放时改变外层包裹的宽度,使video宽度增加,
  //相应高度也增加了,播放器控件被挤下去,配合overflow:hidden
  //控件看不见也触摸不到了
  var setVideoStyle = function (){
    videobox.style.width = '120%';
    videobox.style.left = '-10%';
    video.style.width = '100%';
  }

当然上面这样写参杂了一些需求逻辑,也可以直接样式表就width:120%,或者更大;这个根据自己的需要来,但基本思路就是将播放器控件顶出视窗之外,达到一种‘去除’、‘消失’的效果。连‘小窗’字样也被顶出去了,用过android或测试过的同学都知道点了小窗后会怎样….(原版的即使去掉了播放器,但小窗字样还在,不能算完全的隐藏播放控件吧)

相应产生的一些问题的解决办法:

1,视频被放大了,画面会被截掉一部分怎么办?

这个可以在视频输出的时候两边和下边留一些留白,即留白可以没用画面黑色底,但又属于视频尺寸的一部分,放视频放大后,将主体画面置满视窗,被挤到外面都是留白的即可。

2,视频播放完毕后会中间自动出现播放控件按钮

如果确实不想在播放完是出现一个按钮,哪怕只有零点几秒,就把视频remove掉,可以使用timeupdate监听视频播放,用video.duration-video.currentTime的差值判断是否快要结束了,在结束前零点几秒提前remove掉。

3,要是不是全屏视频怎么搞?

可以,思路是一样的,将视频控件顶出外层的包裹层,利用overflow:hidden。只是全屏的外层包裹是body而已。

[转]Ubuntu16.04 apache2.4 修改默认根目录

Ubuntu16.04 默认 apt-get install apache2 安装的apache2.4
apache2.4配置根目录文件在
/etc/apache2/sites-available/000-default.conf
默认是 var/www/html
可以改成想要的目录,比如/home/judge/etc/web
默认主页的配置在
/etc/apache2/mods-available/dir.conf
可以为如下格式:index.html  index.cgi  index.pl  index.php index.xhtml index.htm
可以修改为 ***.html等。
修改默认根目录之后会报两个错误
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 172.19.158.209. Set the ‘ServerName’ directive globally to suppress this message
以及
访问localhost:80 报 404 You don’t have permission to access / on this server.
解决办法:
第一个问题: 其实提示中已经说了让set ServeerName,所以
在/etc/apache2目录下,打开apache2.conf文件,加一句:ServerName localhost:80
第二个问题:
网页上显示404说没有权限访问这个服务器
还是apache2.conf文件,找到
<Directory />
 Options FollowSymLinks
 AllowOverride None
 Order deny,allow
 allow from all
 #Require all denied
</Directory>
把Require all denied这一句注释掉,加上 allow from all
最后重启apache,发现已经正常了。
参考原文:http://httpd.apache.org/docs/2.4/

wordpress网站的联系表单取消由XXX代发的问题

废话少说,直接上方案:

本来enfold主题采用的是contact form表单,但是由于是国外服务器,当网站用户发送询盘的时候,网站管理员会收到类似如下的东西:

客户想取消这个由xxx代发的问题,这个一时让我不知道如何解决,我开始着手从服务器方面解决,直到看到了这么一篇文章:

原文地址:sendmail发送邮件显示代发解决方案

说的如下:

在网站上很多地方都需要发送邮件,如用户的激活,找回密码等,因此发送邮件是站点的基本需要。之前使用虚拟主机构建站点的时候用phpmailer通过smtp协议来发送邮件。现在有了自己的服务器,就可以考虑自己搭建服务器来发送邮件,好处一是发送人可以设置为诸如‘admin@example.com’之类增加可信度,另外一个则是能够提高发送邮件的速度。

sendmail是linux系统下著名的邮件收发软件。服务器系统是ubuntu 10.04LTS,下面说一下安装和配置的过程,以备后用。

配置sendmail:

添加本地域名:

在文件里面输入域名, 例如:

修改submit.cf文件:

找到行 #Dj$w.Foo.COM,修改为:

注意域名前加Dj是其格式(具体没查是什么意思)

添加域名MX(Mail eXchanger)记录, 这部分应该在域名提供商的控制面板里面更改。

重启服务:

 

[转]利用Session判断限制登录页面次数,防止暴力破解

我的想法是这样的,判断wp的登陆页面的访问次数,正常访问,一般不会闲的无聊一直刷登陆页面,那么直接判断登录页面的访问次数,如果次数达到一定值,则直接exit程序,阻止程序继续运行。

如果你开启xmlrpc.php,暴力破解可能会利用这个接口破解,没有必要的话,这个接口可以关闭掉

关于xmlrpc的相关可以看以前的这篇文章

关于WordPress密码暴力破解、XML-RPC协议的一些事

代码基本写好,直接放进wp-login.php顶部即可正常运行,测试了下,在预定时间内访问超过次数后,页面直接返回空白,程序ok~

/*

name:判断页面访问次数最大次数阻止

*/

define('count_num','4');//访问最大次数

define('count_time','3600');//访问最大时间

session_start();//开启session

$now_time = time();

//判断session存在,赋值

if ($_SESSION){

    $last_time = $_SESSION['last_time'];

    $times = $_SESSION['times'] + 1;

    $_SESSION['times'] = $times;

}else{

    $last_time = $now_time;

    $times = 1;

    $_SESSION['times'] = $times;

    $_SESSION['last_time'] = $last_time;

}

//开始时间判断,如果超过时间次数,则退出程序

if(($now_time - $last_time) < count_time){ if ($times>=count_num){

        exit;

    }

}else{

    $times = 0;

    $_SESSION['last_time'] = $now_time;

    $_SESSION['times'] = $times;

}

各个步骤的相关注释已经写好在上面了,赋值之类的就不多加说明了~

限制方法很多种 Session 也只算一种而已.

本文只作一个转载,这篇文章原文来自:https://ihuan.me/3372.html,请大家支持原创。

[转]WooCommerce 结算页面自定义(删除/添加)表单元素

最近在接触WooCommerce 开发,突然发现国内有关WooCommerce 的中文资料少的可怜,但还好有谷歌。这篇文章意在记录一个问题,在默认的WooCommerce 的结算(checkout)页面上自定义(删除/添加)表单元素。

默认的话,WooCommerce 的结算(checkout)页面上的表单元素(fields)比较繁多,如国家、地址(精确到了省、市、镇)、姓名、邮编、电话、email等等。但在实际项目需求中,可能不想显示那么多的fields;而且从用户体验的角度上,fields应该精简到只需要最重要的——如果是卖虚拟商品的话尤为如此。WooCommerce 中定义这些表单元素(fields)的函数是woocommerce_checkout_fields,那么我们要自定义,就从这个函数下手,hook 之。

以下根据不同需求写了三个场景。基本上是从官方文档中的《Customizing checkout fields using actions and filters》获取而来。

需求一:删除结算页面上多余的表单元素(fields)

这个多余的表单元素指删除后,只剩下最需要的三个:姓、名、邮箱。这个需求如果单单是做虚拟商品的话就非常有需要。

代码如下:

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
  //unset($fields['order']['order_comments']);
  unset( $fields['billing']['billing_country'] );
  //unset( $fields['billing']['billing_first_name'] );
  //unset( $fields['billing']['billing_last_name'] );
  unset( $fields['billing']['billing_company'] );
  unset( $fields['billing']['billing_address_1'] );
  unset( $fields['billing']['billing_address_2'] );
  unset( $fields['billing']['billing_city'] );
  unset( $fields['billing']['billing_state'] );
  unset( $fields['billing']['billing_postcode'] );
  //unset($fields['billing']['billing_email']);
  unset( $fields['billing']['billing_phone'] );
return $fields;
}

相信你也看懂了,billing_first_xxx 就是对应相应的表单元素,如billing_first_name 就是指姓。注意注释掉的代码,unset 这个动作一执行,那么相应的表单元素就不会加载到checkout 页面。

对比一下就是:

需求二:设置表单元素的一些显示样式

上面的小标题实在是太难表达Jeff 的意思了,下面直接上例子+代码。例如:默认的话,电子邮件(email)的表单是非常短的一个输入框,如果要变长一点,并不是说通过css来的(因为官方已经统一化这些控件,如果一改牵一发动全身)。好在官方对于text表单定义了不同的类(class),具体而言,你需要查看官方文档,然后捏代码应该是这样的:

// 将默认的邮箱输入框重置为最大
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
$fields['billing']['billing_email']['class'] = array('form-row-wide');
return $fields;
}

form-row-wide 指另外一种样式的text type(通俗来讲就是变长的text input),效果对比就是:

需求三:添加自定义的表单元素

比如说我想定义一个text的输入框,就可以用下面的代码:

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
$fields['billing']['billing_domain_one'] = array(
        'label'         => __('域名授权1', 'woocommerce'),//名称
        'placeholder'   => _x('区分有无www,不含http://', 'placeholder', 'woocommerce'),//占位文字
        'required'      => true,//是否必填项
        'class'         => array('form-row-wide'),//类
        'clear'         => true//是否清除浮动
     );
  $fields['billing']['billing_domain_two'] = array(
        'label'         => __('域名授权2', 'woocommerce'),
        'placeholder'   => _x('区分有无www,不含http://', 'placeholder', 'woocommerce'),
        'required'      => true,
        'class'         => array('form-row-wide'),
        'clear'         => true
     );
return $fields;
}

效果如下:

总结:

整体代码托管到Github Gists 上:https://gist.github.com/Jeff2Ma/95f433269637f5421f12