2

我正在开发自己的 javascript 库。该库有一个getAttr()这样操作的函数:tex(selector).getAttr(name);这​​是该库的代码:

(function(){
        var tex = function(s){
            return new tex.fn.init(s);
        };
        tex.fn = tex.prototype ={
            init : function(s){
                if(!s){
                    return this;
                }
                else{
                    this.length = 1;
                    if (typeof s === "object"){
                        this[0] = s;
                    }
                    else if(typeof s === "string"){
                        var obj;
                        obj = document.querySelector(s);
                        this[0] = obj;
                    }
                    return this;
                }
            }
        }
        tex.fn.init.prototype = tex.fn;
        tex.fn.init.prototype = {
            attr : function(name, value){
            /*if(name && !value){
                return this[0].getAttribute(name);
            }else if(name && value){
                this[0].setAttribute(name,value);
            };*/
            this[0].setAttribute(name,value);
        },
        getAttr : function(name){
            return this[0].getAttribute(name);  
        },
        removeAttr : function(name){
            this[0].removeAttribute(name);
        },
        print : function(txt){
             this[0].innerHTML = txt;
        }
        };
        window.TechX = tex;
})();

这是正文部分的代码:

<nav>
<ul>
<li><a id="MainDropper">Pick your method:</a>
    <ul>
        <li><a>book</a>
            <ul>
                <li><a data-val="Book" href="javascript:setType(this)">Book</a></li>
                   </ul>
                   </li>
            </ul>
    </li>
    </ul>
</nav>

这是我在头部的代码:

function setType(obj){
    tex("#MainDropper").print(tex(obj).getAttr("data-val"));
}

因此,当我单击图书链接时,邮件投递器应该有文本“图书”。但相反,我在库中收到一个错误,上面写着“[object global] has no method getAttrribute”。有谁知道我该如何解决这个问题?

太感谢了。

4

1 回答 1

0

功劳真的应该归功于 Bergi,但为了提供答案,这里是。

当您使用以下侦听器时:

<a onclick="code" ... >

然后 onclick 属性的内容被有效地包装在一个函数中,该函数以this元素调用,例如:

function listener(){code}

listener.call(element);

但是,当使用 href 属性和 javascript 伪协议(又名“ javascript: URL 方案”)时,代码将作为全局代码执行,因此或多或少只是:

code;

HTML5 表示其行为就像插入了一个新的脚本元素,并将代码作为内容。所以在侦听器函数(执行上下文)中,将引用全局(窗口)对象。

请注意,浏览器的行为在此处可能有所不同(例如,在 javascript URL 中声明的变量),因为在 HTML5 之前没有关于如何处理此类代码的规范,它实际上只是试图指定浏览器已经执行的一个版本。以前,它作为DOM 0 * 的一部分留下,这是浏览器在 W3C 规范之前所做的所有 DOM 东西,没有成为新规范的一部分。

* DOM 0 是“……由 Netscape Navigator 3.0 版和 Microsoft Internet Explorer 3.0 版提供的 HTML 文档功能的混合(未正式指定)。” W3C DOM 级别 1 1998 年 10 月 1 日

于 2013-10-15T22:45:28.967 回答