我一直在研究用于事件处理的JavaScript库。以下是一些代码:
01| (function(){
02| var int,
03| Jist = function(s){
04| return new Jist.fn.init(s);
05| };
06| Jist.fn = Jist.prototype ={
07| init : function(s){
08| if(!s){
09| return this;
10| }
11| else{
12| this.length = 1;
13| if (typeof s === "object"){
14| this[0] = s;
15| }
16| else if(typeof s === "string"){
17| var obj;
18| obj = document.querySelectorAll(s);
19| this[0] = obj;
20| this.elem = this[0];
21| }
22| return this;
23| }
24| },
25| };
26| Jist.fx ={
27| event : function(event,callback,state){
28| var dummy = (state) ? false : state;
29| for(var i=0; i<this.elem.length; i++) {
30| this.elem[i].addEventListener(event,callback,dummy);
31| }
32| return this;
33| },
34| }
35| Jist.fn.init.prototype = Jist.fn;
36| Jist.fn.init.prototype = {
37| print : function(txt){
38| for(var i=0; i<this.elem.length; i++) {
39| this.elem[i].innerHTML = txt;
40| }
41| return this;
42| },
43| click : function(callback){
44| Jist.fx.event("click",callback);
45| return this;
46| },
47| };
48| window.Jist = window._ = Jist;
49| })();
然后在我的网页上,这是我必须测试的内容:
01| <div id="enter">Begin!</div>
02| <script>
03| _("#enter").click(function(){
04| _("#enter").print("It worked!");
05| })
06| </script>
看起来这应该可行,但我得到的错误是:'undefined' is not an object (evaluating this.elem.length)[line 29 in the library]
有谁知道如何解决这个问题?
非常感谢帮助。
谢谢。
答案 0 :(得分:0)
当您致电Jist.fx.event("click",callback);
并开始执行时,event
方法this
将为Jist.fx
,并且没有名为elem
的属性{{1} }}方法在引用event
时尝试使用。这会导致您看到的错误。
答案 1 :(得分:0)
this.elem
超出了函数范围,因此返回了未定义的错误,因此使用this.elem.length
而不是jist.elem.lengh
并检查
答案 2 :(得分:0)
问题在于event
方法this
没有引用您想要的对象集,您可以使用Function.call()
您需要更改对事件注册方法的调用,如
Jist.fx.event.call(this, "click", callback);
此外,您需要确保在使用目标元素加载dom后调用事件注册代码
演示:Fiddle