您正在查看: yhbin 发布的文章

juqery之选择器

1、 层级选择器
1. $('div>p') 选择所有div元素里面的子元素p   $("div").chindren("p")
    >  直接子元素,隔层不成立
2.  $('div  p')选择所有div元素里面的p元素    $("div").find("p")
3.  $(".prev+div").prev后的第一个节点    $('.prev').next('div')
4.  $(".prev~div").prev后面的所有div兄弟(兄弟!)节点,隔层不算   $('.prev').nextAll('div')

2、基本筛选选择器
$(".div:first")    class属性为div的第一个元素
$(".div:last")     class属性为div的最后一个元素
$(".div:even")    class属性为div的下标为偶数元素
$(".div:odd")    class属性为div的下标为奇数元素
$(".aaron:eq(2)")    class属性为aaron的下标为2的元素
$(".aaron:gt(3)")    class属性为aaron的下标大于3的元素
$(".aaron:lt(2)")   class属性为aaron的下标小于2的元素

3、可见性筛选选择器
<p id="div1" style="display:none;">display</p> 隐藏
<p id="div2" style="width:0;height:0">width/height</p> 隐藏
<p id="div3" style="visibility:hidden;opacity:0">visibility</p> 显示
$('#div1:visible')
$('#div1:hidden')

4、属性筛选选择器
//查找所有div中,属性name=p1的div元素
$('div[name=p1]')
//查找所有div中,有属性p2的div元素
$('div[p2]')
//查找所有div中,有属性name中的值只包含一个连字符“-”的div元素
$('div[name|="-"]')
//查找所有div中,有属性name中的值包含一个连字符“空”和“a”的div元素
$('div[name~="a"]')
//查找所有div中,属性name的值是用imooc开头的
$('div[name^=imooc]')
//查找所有div中,属性name的值是用imooc结尾的
$('div[name$=imooc]')
//查找所有div中,有属性name中的值包含一个test字符串的div元素
$('div[name*="test"]')
//查找所有div中,有属性testattr中的值没有包含"true"的div
$('div[testattr!="true"]')

5、表单元素选择器
$(':password') == $('[type=password]')
$('input:text') == $('input[type="text"]') == $('input[type=text]')

6、表单对象属性筛选选择器
//查找所有input所有可用的(未被禁用的元素)input元素。
$('input:enabled')
//查找所有input所有不可用的(被禁用的元素)input元素。
$('input:disabled')
//查找所有input所有勾选的元素(单选框,复选框)
//移除input的checked属性
$('input:checked').removeAttr('checked')
//查找所有option元素中,有selected属性被选中的选项
//移除option的selected属性
$('option:selected').removeAttr('selected')

7、特殊选择器this
this,表示当前的上下文对象是一个html对象,可以调用html对象所拥有的属性和方法。
$(this),代表的上下文对象是一个jquery的上下文对象,可以调用jQuery的方法和属性值。

p.addEventListener('click',function(){
    //this === p
    //以下两者的修改都是等价的
    this.style.color = "red";
    p.style.color = "red";
},false);

$('p').click(function(){
    //把p元素转化成jQuery的对象
    var $this= $(this) 
    $this.css('color','red')
})

jquery AJAX学习

1. getJSON
var $this = $(this);
$.getJSON("http://www.imooc.com/data/sport.json",function(data){
    $this.attr("disabled", "true");
    $.each(data, function (index, sport) {
        if(index==3)
        $("ul").append("<li>" + sport["name"] + "</li>");
    });
});
2.get  $.get(url,[callback]) 
参数url为服务器请求地址,可选项callback参数为请求成功后执行的回调函数。
$.get('http://www.imooc.com/data/info_f.php', function(data) {
    $this.attr("disabled", "true");
    $("ul").append("<li>我的名字叫:" + data.name + "</li>");
    $("ul").append("<li>男朋友对我说:" + data.say + "</li>");
}, "json");
3.post  $.post(url,[data],[callback])
参数url为服务器请求地址,可选项data为向服务器请求时发送的数据,可选项callback参数为请求成功后执行的回调函数。
$.post("http://www.imooc.com/data/check_f.php",
    {num:$('#txtNumber').val()},
    function (data) {
        $("ul").append("<li>你输入的<b>  "
        + $("#txtNumber").val() + " </b>是<b> "
        + data + " </b></li>");
    });
4.serialize  $(selector).serialize()
其中selector参数是一个或多个表单中的元素或表单元素本身。
$('#litest').html( $('form').serialize() );
5.ajax  $.ajax([settings])
其中参数settings为发送ajax请求时的配置对象,在该对象中,url表示服务器请求的路径,data为请求时传递的数据,dataType为服务器返回的数据类型,success为请求成功的执行的回调函数,type为发送数据请求的方式,默认为get。
 $.ajax({
    url: 'http://www.imooc.com/data/check.php',
    method:'get',
    dataType:'json',
    data: { num: $("#txtNumber").val() },
    success: function (data) {
        $("ul").append("<li>你输入的<b>  "
        + $("#txtNumber").val() + " </b>是<b> "
        + data + " </b></li>");
    }
});
6.ajaxSetup  $.ajaxSetup([options])
先调用ajaxSetup()方法设置全局的Ajax选项值,再点击两个按钮,分别使用ajax()方法请求不同的服务器数据,并将数据内容显示在页面
<script type="text/javascript">
$(function () {
    $.ajaxSetup({
        type: 'POST',
        success:function(data){
            $("ul").append("<li>你输入的<b>  "
                + $("#txtNumber").val() + " </b>是<b> "
                + data + " </b></li>");
        }
    });
    $("#btnShow_1").bind("click", function () {
        $.ajax({
            data: { num: $("#txtNumber").val() },
            url: "http://www.imooc.com/data/check.php"
        });
    })
    $("#btnShow_2").bind("click", function () {
        $.ajax({
            data: { num: $("#txtNumber").val() },
            url: "http://www.imooc.com/data/check_f.php"
        });
    })
});
</script>

session设置及数组排序查找

今天修改信息页,要查许多人的排序,第一次登陆进去之后查询一遍,放入session中,以后就可以直接读取了。后来遇到一个问题,当换账号进来后还是之前的session,所有又把user_id加入session中,先判断user_id是否相同

if( $_SESSION['user_id'] == $member_id ){
   if( $_SESSION['integral_num'] ){
       $integral_num = $_SESSION['integral_num'];
   }
  if( $_SESSION['branch_order'] ){
      $branch_order = $_SESSION['branch_order'];
  }
  if( $_SESSION['jiedao_order'] ){
      $jiedao_order = $_SESSION['jiedao_order'];
  }
}

二维数组根据某一个字段排序

$person_all = $this -> my_sort( $integral_num_all, 'member_inter', SORT_DESC ); 
function my_sort($arrays,$sort_key,$sort_order=SORT_ASC,$sort_type=SORT_NUMERIC ){   
        if(is_array($arrays)){   
            foreach ($arrays as $array){   
                if(is_array($array)){   
                    $key_arrays[] = $array[$sort_key];   
                }else{   
                    return false;   
                }   
            }   
        }else{   
            return false;   
        }  
        array_multisort($key_arrays,$sort_order,$sort_type,$arrays);   
        return $arrays;   
    }

某一个字段在二维数组中的key值

$jiedao_order = $this->deep_in_array( $member_id, $person_all );
function deep_in_array($value, $array) {   
        foreach($array as $key => $item) {   
            if(!is_array($item)) {   
                if ($item == $value) {  
                    return $key;  
                } else {  
                    continue;   
                }  
            }     
            if(in_array($value, $item)) {  
                return $key;      
            } else if($this->deep_in_array($value, $item)) {  
                return $key;      
            }  
        }   
        return false;   
    }

jquery全选ajax删除

1、juqery全选
全选按钮

<input type="checkbox" id="check_box" onclick="selectall('lead_id[]');"/>

列表按钮

<input name="lead_id[]" type="checkbox" value="<?php echo $value['lead_id'];?>" />
function selectall(name) {
  if ($("#check_box").prop("checked")==false) {
    $("input[name='"+name+"']").each(function() {
      this.checked = false;
    });
  } else {
    $("input[name='"+name+"']").each(function() {
      this.checked = true;
    });
  }
}

2、post删除

  function del_many(){
    var ids='';
    $("input:checkbox[name='lead_id[]']:checked").each(function(i, n){
        ids += $(n).val() + ',';
    });
    if( ids ){
      if ( confirm( '确定删除吗?' ) )
      {
        location.href = '?m=party_admin&c=leader_admin&a=dele_leader&leader_id=' + ids;
      }
    }else{
      alert('请选择要删除的记录!');return false;
    }
  }

3、编辑信息

  function edit( id ){
   $.post("?m=party_admin&c=activity_admin&a=activity_info",{activity_id:id},function(msg){
     var data = eval('('+msg+')');
     $('#edit_activitytitle').val( data.activity_name );
     $('#edit_party_name').val( data.party_name );
     $("select[name ='edit_activity_type'] option[value='"+data.activity_type+"']").attr('selected','selected');
     $('#edit_activity_time').val( data.activity_time );
     $('#edit_activity_palce').val( data.activity_place );
     $('#edit_activity_partypeople').val( data.party_should_num );
     $('#edit_activity_vilpeople').val( data.villager_should_num );
     $('#edit_activity_leadpeople').val( data.leader_should_num );
     $('#edit_activity_content').val( data.activity_contents );
     $('#edit_activity_id').val( data.activity_id );
     $('#upload_pics').val( data.activity_pic );
     /* 照片显示 */
     if ( data.activity_pic != '' )
     {
         $( '#upload_pics' ).val( data.activity_pic );
     }
     /* 党员显示 未到 + 已到 */
     var party_people_arr = data['party_people'];
     var new_party_people = '';
     var sign_party_people = '';
     if ( party_people_arr != undefined )
     {
         $.each( party_people_arr, function( key, value ) {
             if ( value['is_sign'] == '0' )
             {
                 new_party_people += "<span id="+ 'not_party_id_'+ value['person_id'] +">";
                 new_party_people += value['person_name'];
                 new_party_people += "</span>";
             }
             else
             {
                 sign_party_people += "<span id="+ 'party_id_'+ value['person_id'] +">";
                 sign_party_people += value['person_name'];
                 sign_party_people += "</span>";
             }              
         });
         $( '#party_not_to' ).html( new_party_people );
         $( '#party_sign_name' ).html( sign_party_people );
     }      
     /* 手机端操作  1、启用  0、关闭  2、已完成 */
     var mobile_operate_msg = '';
     switch( data['mobile_operate'] )
     {
         case '0':
             mobile_operate_msg = '启动手机端操作';
             $( '#button_mobile_operate' ).attr( 'onclick', 'open_mobile_operate( '+ id +' );' );
         break;
         case '1':
             mobile_operate_msg = '手机端操作已开启';
         break;        
         case '2':
             mobile_operate_msg = '手机端操作已完成';
         break;
     }
     $( '#mobile_operate' ).html( mobile_operate_msg );

   });
   $( '#determine' ).attr( 'onclick', 'edit_submit();' );
   /* 开始签到的方法绑定 */
   $( '#start_sign' ).attr( 'onclick', "begin_start_sign( "+ id +" );" );
 }

form表单提交之前验证

今天做个弹框提交表单,信息不全时候跳转到后台检测,不符合要求返回到前台,虽然不能添加成功,但用户体验不好,所以改成提交前验证

<form class="am-form" action='' method="post" id="add_form" onsubmit="return check()" >
代码区
</form>
<script type="text/javascript">
  function check(){
    $meeting_name = $('#meeting_name').val();
    $join = $("input[type='checkbox']").is(':checked');
    if( $meeting_name == '' ){
      alert('请填写会议名称');return false;
    }
    if( $join === false ){
      alert('请选择参加人员');return false;
    }
    return true;
  }
</script>

注意:
1.form中添加 onsubmit="return check()"
2.check()中必须有return,onsubmit认为ture或者不写都为提交,只有false才不提交
3.checkbox判断是否选中 $("input[type='checkbox']").is(':checked') 选中为ture,没选中为false

destoon 添加手机端接口

今天修改手机端接口 ,有问题困扰了很久,最后终于修改好,记录一下用到的知识

这是问题数据
 parameter = "{\n  \\\"typeid\\\" : 1,\n  \\\"keyword\\\" : \\\"ffffgg,\U6cb9\U8102\U7c7b\U4ea7\U54c1,\U5927\U8c46\U6cb9,\U975e\U8f6c\U57fa\U56e0\U5927\U8c46\U6cb9\\\",\n  \\\"typename\\\" : \\\"\\\",\n  \\\"catid\\\" : \\\"82\\\",\n  \\\"is_recommend\\\" : \\\"\\\",\n  \\\"amount\\\" : \\\"\\\",\n  \\\"unit\\\" : \\\"\\\",\n  \\\"brand\\\" : \\\"\\\",\n  \\\"piclist\\\" : [\n    \\\"http:\\\\/\\\\/172.16.2.81:8094\\\\/file\\\\/upload\\\\/201702\\\\/18\\\\/112552420.png.thumb.png\\\"\n  ],\n  \\\"title\\\" : \\\"ffffgg\\\",\n  \\\"price\\\" : \\\"\\\",\n  \\\"totime\\\" : \\\"\\\",\n  \\\"minamount\\\" : \\\"\\\",\n  \\\"days\\\" : \\\"3\\\",\n  \\\"elite\\\" : \\\"\\\",\n  \\\"n\\\" : \\\"\\\",\n  \\\"v\\\" : \\\"\\\",\n  \\\"content\\\" : \\\"\\\"\n}";
 这是正常数据
 parameter = "{\n  \"typeid\" : 1,\n  \"keyword\" : \"ffffgg,\U6cb9\U8102\U7c7b\U4ea7\U54c1,\U5927\U8c46\U6cb9,\U975e\U8f6c\U57fa\U56e0\U5927\U8c46\U6cb9\",\n  \"typename\" : \"\",\n  \"catid\" : \"82\",\n  \"is_recommend\" : \"\",\n  \"amount\" : \"\",\n  \"unit\" : \"\",\n  \"brand\" : \"\",\n  \"piclist\" : [\n    \"http:\\/\\/172.16.2.81:8094\\/file\\/upload\\/201702\\/18\\/112552420.png.thumb.png\"\n  ],\n  \"title\" : \"ffffgg\",\n  \"price\" : \"\",\n  \"totime\" : \"\",\n  \"minamount\" : \"\",\n  \"days\" : \"3\",\n  \"elite\" : \"\",\n  \"n\" : \"\",\n  \"v\" : \"\",\n  \"content\" : \"\"\n}";

知识点:
1.$_POST,$_GET,$_COOKIE默认就被转义了,正常数据中的‘ "’就是转义后的结果,但是网站中又对转义后的数组用addslashes()再进行转义出现‘ "’,这就不对了
2.当magic_quotes_gpc = On时,系统会自动处理单引号等问题,用不用addslashes()和stripslashes()都没关系,但是如果添加数据时用了addslashes(),那么显示数据时必须要stripslashes()
3.当magic_quotes_gpc = Off时,系统不会处理单引号等问题,所以插入数据时必须要使用addslashes(),显示数据时则不需要使用stripslashes()。

代码 
//提交数据,或者变量准备:
$Content=addslashes(”这里面是数据,不管有没单引号或者还是变量”);
//插入数据到数据库,代码省略
//开始显示数据
$Content=”从数据库读取的数据”;
if(get_magic_quotes_gpc()){
  $Content=stripslashes($Content); 
}
echo $Content;

辅助:
1、PHPinfo();
2、

if(DT_DEBUG) {
    error_reporting( E_ALL ^ E_NOTICE );
    $mtime = explode(' ', microtime());
    $debug_starttime = $mtime[1] + $mtime[0];
} else {
    error_reporting(0);
}

3、file_put_contents( '1.txt' , var_export( $data, true ).PHP_EOL, FILE_APPEND);
4、$str = base64_decode(str_replace(" ","+",$_GET['str']));

php与ajax组合使页面下拉刷新

下拉刷新其实就是下拉一定高度,调用ajax去控制器获取数据,将返回来的json数据用js追加到页面相应位置

$(function(){ 
  var winH = $(window).height(); //页面可视区域高度 
  var i; //设置当前页数 
  i = $('#cur_pages').val();
  $(window).scroll(function () { 
    var pageH = $(document.body).height(); 
    var scrollT = $(window).scrollTop(); //滚动条top 
    var aa = (pageH-winH-scrollT)/winH; 
    if(aa<0.02){ 
      $.getJSON("{WEB_PATH}/index/cloud_goods/ajax_cloud_goods_l",{page:i},function(json){ 
        if(json){ 
          var str = ""; 
          $.each(json,function(index,array){ 
            $('#ulRecommend').append(
                '<li id="16973">'+
                '<div class="f_bor_tr">'+
                    '<div class="m-tj-pic">'+
                        '<a href="{WEB_PATH}/cgoods/'+array.id+'" class="u-lott-pic">'+
                            '<img src="{G_UPLOAD_PATH}/'+array.g_thumb+'" border=0 alt="'+array.g_title+'" />'+
                        '</a>'+
                        '<ins class="u-promo">价值:'+array.g_money+'购买币</ins>'+
                    '</div>'+
                    '<div class="Progress-bar">'+
                       '<p class="title_cut" style="padding-bottom:5px"><span>'+array.g_title+'</span></p>'+
                        '<p class="u-progress" title="已完成">'+
                        '<span class="pgbar" style="width:0%;">'+
                        '<span class="pging"></span>'+
                        '</span></p>'+
                        '<ul class="Pro-bar-li">'+
                            '<li class="P-bar01"><em>'+array.canyurenshu+'</em>已参与</li>'+
                            '<li class="P-bar02"><em>'+array.zongrenshu+'</em>总需人次</li>'+
                            '<li class="P-bar03"><em>'+(array.zongrenshu - array.canyurenshu) +'</em>剩余</li>'+
                        '</ul></div></div></li>'
                );
          }); 
        i++;
        $('#cur_pages').val( i );
        }else{ 
          $("#nodata").show().html("别滚动了,已经到底了。。。"); 
          return false; 
        } 
      }); 
    } 
  }); 
});

注意:
[1] 页面要有一个保存当前页数的input隐藏域
[2] 返回来的数组用$.each(json,function(index,array),其中json是返回来的json数组,index是key值,array是value,后面要用的字段直接用array.canyurenshu即可
[3] 追加写法要注意,一行中用单引号引起来,后面用‘+‘连接,变量写法为'+array.canyurenshu+'

修改项目中的信息,实时访问cdn刷新缓存

今天做一个访问阿里云api刷新缓存的功能,开始想找sdk的,但是没找到,只有一个个方法找,其实改好了发现也不是难的。
### 请求参数

function setParameter($specialParameter){
    $time            = date('Y-m-d H:i:s', time()-8*60*60);//北京时间转换为UTC时间
    $var             = strtr($time, ' ', 'T');
    $Timestamp       = $var . 'Z';
    $signature_nonce = '';
   for($i =0 ; $i < 14; $i++){
        $signature_nonce .= mt_rand(0,9);
       }

   $publicParameter = array(
        'Format'           => 'JSON',
        'Version'          => '2014-11-11',
        'SignatureMethod'  => 'HMAC-SHA1',
        'TimeStamp'        => $Timestamp,
        'SignatureVersion' => '1.0',
        'SignatureNonce'   => $signature_nonce,
        'ObjectType'       => 'File'
   );

   $parameter = array_merge($publicParameter, $specialParameter);
   return $parameter;
}

将参数排序并添加$signature

function getStringToSign($parameter,$access_key_secret){
       ksort($parameter);
       foreach($parameter as $key => $value){
          $str[] = rawurlencode($key). "=" .rawurlencode($value);
       }
       $ss = "";
       if(!empty($str)){
          for($i=0; $i<count($str); $i++){
             if(!isset($str[$i+1])){
                $ss .= $str[$i];
             }else{
                $ss .= $str[$i]."&";
            }
          }
       }
    $StringToSign = "GET" . "&" . rawurlencode("/") . "&" . rawurlencode($ss);
    $signature    = base64_encode(hash_hmac("sha1", $StringToSign, $access_key_secret."&", true));
    $url          = "https://cdn.aliyuncs.com/?" . $ss . "&Signature=" . $signature;
       return $url;
}

curl访问

function curl_get($url){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    // https请求 不验证证书和hosts
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    // 要求结果为字符串且输出到屏幕上
   curl_setopt($ch, CURLOPT_HEADER, 0); // 不要http header 加快效率
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
   curl_setopt($ch, CURLOPT_TIMEOUT, 15);
   $output = curl_exec($ch);
   curl_close($ch);
   return $output;
}

调用函数

function describeCdnService( $url_show, $action = 'RefreshObjectCaches' ){
    $access_key_id     = ACCESS_ID;
    $access_key_secret = ACCESS_SECRET;
       if(empty($access_key_id) || empty($access_key_secret)){
      $message = array(
         'status'   => 'failed',
         'reason'   => 'Access key Id or access key secret is invalid',
      );
      return json_encode($message);
       }
   $specialParameter = array(
        'AccessKeyId' => $access_key_id,
        'Action'      => $action,
        'ObjectPath'  => $url_show,
   );

    $parameter = setParameter( $specialParameter );
    $url       = getStringToSign( $parameter, $access_key_secret );
    $ret       = curl_get( $url );

   return $ret;
}

最后这个函数就是项目要调用的,此方法调用上面的三个方法

$url = DT_URL.'sell/show-'. $itemid .'.html';
describeCdnService( $url );

大功告成

centos 设置计划任务

今天做每分钟执行url访问的计划任务,忙了一下午终于在windows下做出来了,不过会每分钟弹出执行框,很难受,身边大神(http://yusure.cn)过来看了一眼说用centos吧,瞬间反应过来,是啊,反正就一个访问链接,于是开始指导我写crontab

centos下用curl访问链接

*/1 * * * * /usr/bin/curl http://域名/index.php?m=sunshine_village\&c=message_remind\&a=index\&pc_hash=

注意:
[1] 一共有5个星号,中间都是一个空格
[2] 链接后面带参数一定要用'\'分开

链接写完就要在crontab里添加进去

whereis curl -> /usr/bin/curl
find -name curl       相对位置
Find / -name curl     绝对位置

Nginx.conf位置
etc/nginx/nginx.conf
[root@iZ62vnbgzmiZ ~]# whereis curl
curl: /usr/bin/curl /usr/include/curl /usr/share/man/man1/curl.1.gz
[root@iZ62vnbgzmiZ ~]# crontab --h
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
usage:  crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)
        -s      (selinux context)

crontab -e 编辑crontab

a 插入模式

复制完后 esc退出插入模式

:wq 回车完成

$time = date( 'Y-m-d h-i-s', time() );
file_put_contents("log.txt", $time.PHP_EOL , FILE_APPEND);

QQ截图20161117172242.png
写文件追加分行

kindeditor编辑器上传图片只有远程,没有本地

今天项目中有个用kindeditor编辑器的功能,里面的上传图片只能显示远程连接,没有本地的
QQ截图20161106210523.png
开始没有思路,弹窗框的内容不知道在哪设置的,于是便一点点打断点,终于在image.js中找到了QQ截图20161106210824.png
这段代码判断编辑框显示什么,于是写console.log打印一下
QQ截图20161106211005.png
很显然,远程为true,本地为false,所以导致不能上传本地的图片,设置本地上传为true即可
QQ截图20161106211145.png
设置好看前台显示即可
QQ截图20161106211237.png
测试成功
QQ截图20161106211331.png