小左闲谈

网页前端js判断移动端还是PC端跳转代码

当前位置:首页 » 笔记
In 笔记  @2016-03-22

项目上客户有PC端网页,也有专门开发的手机端网址,同一个入口网址可以减少客户的学习成本,也是一种很好的手段,根据客户使用的客户端来自动跳转就可以了,每个浏览器在发送请求的头部里面都会有识别设备类型的User Agent可以设置,手机,pad等就跳转到移动端网页,PC电脑端就跳转到PC端页面,提供良好的用户体验。
上代码:

<script type="text/javascript">
    var commonURL = 'http://www.m1910.com';
    function mobile_device_detect(url){
      var thisOS=navigator.platform;
      var os=new Array("iPhone","iPod","iPad","android","Nokia","SymbianOS","Symbian","Windows Phone","Phone","Linux armv71","MAUI","UNTRUSTED/1.0","Windows CE","BlackBerry","IEMobile");
      for(var i=0;i<os.length;i++){
        if(thisOS.match(os[i])){   
             window.location=url;
             }
      }
      if(navigator.platform.indexOf('iPad') != -1){
          window.location=url;
      }
      var check = navigator.appVersion;
          if( check.match(/linux/i) ){
              if(check.match(/mobile/i) || check.match(/X11/i)) {
             window.location=url;
            }  
          }
      Array.prototype.in_array = function(e){
        for(i=0;i<this.length;i++){
          if(this[i] == e)
          return true;
          }
          return false;
        }
      } 
    mobile_device_detect("http://www.m1910.com/Mobile/");/*指定跳转地址*/
</script>
标签: , , , ,   评论: 3枚  被围观 3,207 次

Ecshop安装过程中(PHP5.5.12)出现的几个错误

当前位置:首页 » 笔记
In 笔记  @2016-02-16

以下是ECshop安装在PHP5.5.12环境下出现的报错,记录一下。
1.检查安装环境配置的时候报错:

Strict Standards: Non-static method cls_image::gd_version() should not be called statically in D:\X\www\ecshop\install\includes\lib_installer.php on line 31

原因:找到install/includes/lib_installer.php中的第31行 return cls_image::gd_version();然后在找到includes/cls_image.php中的678行,发现gd_version()方法未声明静态static。
解决:在includes/cls_image.php中的678行function gd_version()改成static function gd_version()。

2.检测环境的时候提示:是否支持JPEG是不支持的。
解决:将install/includes/lib_installer.php中第98行JPG修改成JPEG。

$jpeg_enabled = ($gd_info['JPEG Support']        === true) ? $_LANG['support'] : $_LANG['not_support'];

3.1安装完登录后台报错:

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in E:\phpDemo\ecshop\includes\cls_template.php on line 300

原因:在PHP5.5以上版本中preg_replace() 函数中用到的修饰符 /e 在 PHP5.5.x 中已经被弃用了。
解决:打开文件includes/cls_template.php将300行

return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
 
修改为:
return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) { return $this->select($r[1]); }, $source);

类似preg_replace() 函数中用到的修饰符 /e 提示替换 preg_replace_callback()的还有几处:
3.2文件includes/cls_template.php的493行:

$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";
 
修改为:
$out = "<?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($r) {return stripslashes(trim($r[1],'\''));}, var_export($t, true)) . ";\n";

3.3文件includes/cls_template.php的553行:

$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);
 
修改为:
$val = preg_replace_callback("/\[([^\[\]]*)\]/", function($r) {return '.'.str_replace('$','$',$r[1]);}, $val);

3.4文件includes/cls_template.php的1069行:

$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/se';
$replacement = "'{include file='.strtolower('\\1'). '}'";
$source = preg_replace($pattern, $replacement, $source);
 
修改为:
$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s';
$source = preg_replace_callback($pattern, function($r){return '{include file='.strtolower($r[1]). '}';}, $source);

4:错误信息:

Strict Standards: Only variables should be passed by reference in E:\web\shopex\includes\cls_template.php on line 422

原因:PHP5.3以上默认只能传递具体的变量,而不能通过函数返回值传递,所以这段代码中的explode就得移出来重新赋值。
解决:将includes\cls_template.php文件422行

$tag_sel = array_shift(explode(' ', $tag));
 
修改为:
$tag_arr = explode(' ', $tag);
$tag_sel = array_shift($tag_arr);

5.后台错误信息:

Strict standards: mktime(): You should be using the time() function instead in E:\phpDemo\ecshop\admin\sms_url.php on line 31

打开admin\sms_url.php文件第31行:
打开admin\shop_config.php第332行:

$auth = mktime();
 
修改为:
$auth = time();
标签: ,   评论: 5枚  被围观 3,058 次

错误:java.lang.IllegalArgumentException: Service not registered

当前位置:首页 » 笔记
In 学习, 笔记  @2015-08-20

在做Service的绑定和解绑小项目测试的时候,绑定成功,解绑也成功,但是如果解除绑定后再点击给解除绑定的指令(项目中就是点击按钮解除绑定),会报这个错误:

AndroidRuntime(7090): java.lang.IllegalArgumentException: Service not registered: 
com.m1910.servicetest.MainActivity$1@41ddfcc0

错误提示Service没有注册,事实上我在Manifest.xml中已经注册过这个Service了。
修改前代码:

  1. 	@Override
  2. 	public void onClick(View v) {
  3. 		switch (v.getId()) {
  4. 		case R.id.start_service:
  5. 			Intent startIntent = new Intent(this, MyService.class);
  6. 			startService(startIntent);// 启动服务
  7. 			break;
  8. 		case R.id.stop_service:
  9. 			Intent stopIntent = new Intent(this, MyService.class);
  10. 			stopService(stopIntent);// 停止服务
  11. 			break;
  12. 		case R.id.bind_service:
  13. 			Intent bindIntent = new Intent(this, MyService.class);
  14.                         // 绑定服务
  15. 			bindService(bindIntent, connection, BIND_AUTO_CREATE);
  16. 			break;
  17. 		case R.id.unbind_service:
  18. 			unbindService(connection);// 解绑服务	
  19. 			break;
  20. 		default:
  21. 			break;
  22. 		}
  23. 	}

查询官方文档中关于unbindService()这个方法的介绍:

public abstract void unbindService (ServiceConnection conn)
 
Added in API level 1
Disconnect from an application service. You will no longer receive calls as the service is restarted, and the service is now allowed to stop at any time.
 
Parameters
conn	The connection interface previously supplied to bindService(). This parameter must not be null.

最后一句看到这个传入的conn参数不能为null,也就是必须有绑定存在,才能解绑,小项目中绑定成功后第一次点击解绑不会报错,解绑后这个参数就是null了,再次点击解绑就会报错,那么我们为解绑加一个判断就可以了。
修改后代码如下:

  1. private boolean isBound = false;
  2.  
  3. 	@Override
  4. 	public void onClick(View v) {
  5. 		switch (v.getId()) {
  6. 		case R.id.start_service:
  7. 			Intent startIntent = new Intent(this, MyService.class);
  8. 			startService(startIntent);// 启动服务
  9. 			break;
  10. 		case R.id.stop_service:
  11. 			Intent stopIntent = new Intent(this, MyService.class);
  12. 			stopService(stopIntent);// 停止服务
  13. 			break;
  14. 		case R.id.bind_service:
  15. 			Intent bindIntent = new Intent(this, MyService.class);
  16.                         // 绑定服务
  17. 			isBound = bindService(bindIntent, connection, BIND_AUTO_CREATE);
  18. 			break;
  19. 		case R.id.unbind_service:
  20. 			if (isBound) {
  21. 				unbindService(connection);// 解绑服务
  22. 				isBound = false;
  23. 			}
  24. 			break;
  25. 		default:
  26. 			break;
  27. 		}
  28. 	}

网上也有人用getApplicationContext().unbindService(mConnection);这样来做,什么意思我也不太懂,不过最终效果一样也是要加一个是否为空的判断。

标签: , , , , ,   评论: 17枚  被围观 10,118 次