ECSHOP中transport.js和jquery冲突的解决方法

在html文件的最后面添加下面的代码即可:

<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function() {
window.__Object_toJSONString = Object.prototype.toJSONString;
delete Object.prototype.toJSONString;
});
</script>

代码在文件中的顺序:

先导入transport.js文件

{insert_scripts files="../js/transport.js,../js/region.js"}

然后导入jquery文件

<script type="text/javascript" src="jquery-1.7.2.min.js"></script>

再加上这段代码

<script type="text/javascript">
$(function() {
window.__Object_toJSONString = Object.prototype.toJSONString;
delete Object.prototype.toJSONString;
});
</script>

最后引入自己用jquery书写的js文件:

<script type="text/javascript" src="main.js"></script>

Sea.js出现Uncaught TypeError: object is not a function的解决方法

最近我有一个项目需要用到seajs+jquery+underscore来开发前端页面,是第一次使用seajs做项目。一开始使用就遇到了:Uncaught TypeError: object is not a function的问题,这个问题到谷歌上搜索之后是一大片的,github上玉伯也有给出耐心的解答。后来我发现遇到这个问题就是两个原因:
1、引用的第三方类库的路径不对。
2、没有将第三方非CMD规范的类库定义成CMD的模块

假设我们现在jQuery无法引入,首先我们要检查第一点路径是否正确,打开浏览器的控制台,在控制台输入

seajs.resolve('jquery’)

参数中的jQuery是你在配置中alias里面写的别名,敲回车之后你会发现控制台会输出jQuery的路径,你需要访问一下这条路径,假设这条路径有jQuery的代码,说明你的路径正确,否者你得修改你的路径,理论上路径是相对于sea.js的。

如果你的路径正确,那么你需要将第三方非CMD规范的类库定义成CMD的模块:
jQuery的定义方法:

define(function() {//def CMD
    /*jquery 自身的代码*/
    return $.noConflict();
});//end CMD

jQuery插件的定义方法:

define(function() { //def CMD
    return function($) {
        /*jQuery插件的自身代码*/
    }
});//end CMD 

// 调用的时候使用require要将jquery的传入
var $ = require('jquery');
require('jquery.XXX.js')($);

underscore.js的定义方法:

define(function() {//def CMD
    /*underscore自己的代码*/
    return _.noConflict();
});//end CMD 

对于自己的代码:

define(function() {//def CMD
    /*自身的代码*/
    return XXX;
});//end CMD

JavaScript获取昨天、今天、明天的时间

本文的标题是比较实例化的,我们抽象点说就是如何获取基于今天的一个日期,像PHP里面有如下的方式:

echo "明天:",date("Y-m-d",strtotime("+1 day")), "<br>";

JavaScript里面该怎么做一个类似的实现呢?下面是简单的实现:

function getDateStr(count)
{
    var date = new Date();
    date.setDate(dd.getDate() + count);
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    return year + "-" + month + "-" + day;
}

昨天就是getDateStr(-1)

今天就是getDateStr(0)

明天就是getDateStr(1)

那么前天、后天都可以以此类推。

JavaScript中substr()和substring()的区别

名为substr的函数在很多语言中都有,我们在使用JavaScript做截取字符串的时候一定会使用,但是你会发现有两个函数:substr()和substring(),从名字上看几乎是一样的,但是他们的用法还是有区别的:
var foo = "hello world!";
foo.substr(0, 10); //返回 "hello worl"
foo.substring(0, 10); //返回 "hello worl"
上面的代码看起来substr()和substring()的结果相同,但是原理是不同的,substr()是从第0个位置开始向后取10个字符,而substring()是取从第0个位置到第10个位置的字符。下面这段代码就可以看出这个区别:
foo.substr(3, 10); //返回 "lo world!"
foo.substring(3, 10); //返回 "lo worl"
除了原理上的区别还有就是substring()支持第二个参数为负数-n表示向前取n个字符,而substr没有这个功能:
foo.substr(13, -13); //返回 ""
foo.substring(13, -13); //返回 "hello world!"
综上所述,substr()方法用于截取固定长度的字符串的场景上,而substring()方法用于取字符串指定的位置,我现在区分它们俩的偏方是substring比substr名字上多了ing,ing中包含了i,i表示index,就是字符串指定位置的意思。

JavaScript根据函数名字符串调用函数的方法

最近遇到一个问题,JavaScript如何通过函数名的字符串来调用这个函数,到stackoverflow上逛了圈,收获良多,这里总结下:

如果你是要直接调用全局的函数,可以用如下方式:

//定义一个名为foo的函数
function foo() 
{
    alert(1);
}
//第一种调用方式
window['foo']();
//第二种调用方式
eval('foo()');

如果你想要在一个对象里面调用对象自己的属性函数,可以用如下方式:

var test = {
	foo : function(a) {
		alert(a);
	},
	bar : function() {
		var property = 'foo';
		var parameter = ['this is a test!'];
		var fn = this[property];
		if(typeof fn === 'function') {
			fn.apply(this, parameter);
		}
	}
};
test.bar();

上面这段代码是我写的一个小例子,其中的

fn.apply(this, parameter);

有几个好处,第一点就是可以让你调用的foo这个属性函数能够使用到当前的this,如果不用apply是无法调用到当前的this的。第二点就是传递参数变得很自由,如果属性函数需要传入多个参数可以用数组传入。

上面这段小代码就是我在“基于Requirejs和Backbonejs,将Zend Framework 2官方Demo改为RESTful架构的应用”里面做到自动路由分发的核心代码。