2008年10月31日
#
我在看sizzle和peppy的源代码,发现他们的速度还有提升的空间,
我准备使用jit技术实现一个世界最快的javascript css3 selector engine.
css3选择器也有一些不方便
比如说伪类选择器,只运行"且"选择,不运行"或"选择,要"或"的话,把前面的抄下来吧,效率低多了.
经过jit编译过后的selector成为一个函数,接受一个参数ct,表示容器.选择器将从这个容器开始选择.
该函数执行时,直接引用一些编译期间确定的变量,而且避免函数调用(相当于c++内联函数),合并相邻的伪类选择器.
query函数接受参数ql,ct,rs
ql:查询语句
ct:查询容器
rs:查询结果
query函数首先根据ql和ct查询缓存,如果以前用同样的语句和容器查询过并且文档未改变,则有缓存可以直接返回.
将结果合并到rs返回.
如果不存在缓存则查询是否存在ql编译好的selector的缓存,如果以前编译过一次,那么就不用再编译了,直接用缓存里编译好的.
2008年8月30日
#
代码是随手写的,只提供思路。
这个原理很简单,看代码就懂,不多说了。
(function (){
var h = 0;
handle = function (){return h++};
var f = function (){};
extend = function (a, b){
f.prototype = a;
var ret = new f;
if (typeof b == 'function') {
b.call(ret);
} else if (typeof b == 'object') {
for (var key in b) {
ret[key] = b[key];
}
}
return ret;
};
})();
(function (){
ClassA = function (){
this.hello = 'world';
};
ClassA.virtualmethod = handle();
ClassA.prototype = extend({}, function (){
this.virtualmethod = function (){
var impl = this[ClassA.virtualmethod];
if (impl) {
impl.apply(this, arguments);
} else {
alert('ClassA.virtualmethod not yet impl.');
}
};
});
})();
(function (){ // ClassB extend ClassA
ClassB = function (){
ClassA.apply(this, arguments);
};
// 继承性
ClassB.prototype = extend(ClassA.prototype, function (){
this[ClassA.virtualmethod] = function (){
alert('this is ClassA.virtualmethod, impl in ClassB.\nwill show this.hello.');
alert('this.hello = ' + this.hello);
}
// 封装性
this.test = this.virtualmethod;
this.virtualmethod = undefined;
});
})();
(function (){ // ClassC extend ClassB
ClassC = function (){
ClassB.apply(this, arguments);
};
ClassC.prototype = extend(ClassB.prototype, function (){
// 多态性
var impl = this[ClassA.virtualmethod];
this[ClassA.virtualmethod] = function (){
alert('this is ClassA.virtualmethod, impl in ClassC. \nwill run ClassB\'s impl.');
impl.apply(this, arguments);
};
});
})();
// test case
var a = new ClassA;
a.virtualmethod(); // not yet impl
var b = new ClassB;
b.test();
alert('b.virtualmethod is: '+b.virtualmethod);
var c = new ClassC;
c.test();
2008年8月15日
#
test.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<html>
<script>
var ds = [[1,2,3],[4,5,6],[7,8,9]];
</script>
<grid id="abc" datasource="ds"/>
<script>
alert(abc.id);
</script>
</html>
test.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="grid.xsl"/>
<xsl:template match="/">
<html>
<head>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="//script">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
grid.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//grid">
<h2>Grid</h2>
<script type="text/javascript">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
if (Grid === undefined){
var Grid = function (datasource){
var tbl = document.createElement('table');
tbl.border = 1;
for (var i=0; i<datasource.length; i++){
var tr = document.createElement('tr');
for (var k=0; k<datasource[i].length; k++){
var td = document.createElement('td');
var tt = document.createTextNode(datasource[i][k]);
td.appendChild(tt);
tr.appendChild(td);
}
tbl.appendChild(tr);
}
return tbl;
}
}
var <xsl:value-of select="@id"/> = function (){
var sc = document.getElementById('<xsl:value-of select="@id"/>');
var gd = new Grid(<xsl:value-of select="@datasource"/>);
gd.id = "<xsl:value-of select="@id"/>";
sc.parentNode.replaceChild(gd, sc);
return gd;
}();
</script>
</xsl:template>
</xsl:stylesheet>
2008年8月7日
#
(function (Package){
var _key = {};
var ClassA = function (key_){
if (_key !== key_) throw 'non-public constructor!';
}
Package.ClassA = ClassA;
})(window);
2008年8月4日
#
function t(){
var fns = Array.prototype.concat.apply([], arguments);
for (var i = 0; i < fns.length; i++) {
alert(fns[i]);
}
}
t([1,2,3],[1,2],1,1);
2008年8月1日
#
2008年7月31日
#
2008年7月28日
#
2008年7月27日
#
2008年7月24日
#