快捷方式的javascript对象引用

时间:2011-10-17 15:24:21

标签: javascript

我非常有价值,所以我试图制作这样的捷径:

LIVE示例:http://jsfiddle.net/nqeUN/

var d = "document" ,
    t = "getElementByTagName" ,
    d = "div" ,
    oc = "onclick";
d[t](d)[0].oc = function(){
    alert("1");
}

但它不起作用,原因是什么?我可以在Google plus api中看到所有对象都是这样定义的,作为字符串,它们如何使它工作?

7 个答案:

答案 0 :(得分:2)

您需要解决几个问题

  • 您有两个绑定到d的值:"document""div"
  • 它是getElement s ByTagName
  • getElementsByTagName函数需要DOM入口点而不是字符串。将第一个d切换为document
  • .oc使用点表示法时,它将绑定到属性oc,而不是变量oc的值。请改用[]符号

代码:

var d = document ,
    t = "getElementsByTagName" ,
    div = "div" ,
    oc = "onclick";

d[t](div)[0][oc] = function(){
    alert("1");
}

工作小提琴:http://jsfiddle.net/nqeUN/1/

答案 1 :(得分:1)

d是一个字符串,而不是document

您应该写var d = document来获取实际的document对象。


但是,你不应该自己这样做;它使完全不可读的代码。

相反,您应该开发正常,可读的Javascript,然后使用缩小器(例如Microsoft AjaxMinGoogle Closure Compiler)在生产中尽可能自动缩小代码。

答案 2 :(得分:1)

字符串适用于属性,但不适用于变量名称。您还定义了d两次,并且方法名称错误。你可以这样做:

var d = 'document', t = 'getElementsByTagName', div = 'div', oc = 'onclick';

window[d][t](div)[0][oc] = function() { ... }

但这确实降低了可读性,并不是必需的。您可以通过最小化器运行代码以自动获取此代码并仍然保持可读的开发代码。

答案 3 :(得分:1)

如果替换示例中的值,您会看到:

"document".getElementsByTagName("document").onclick = function() {};

1。)d应设置为全局文档引用,而不是字符串'document'

var d = window.document;

2。)getElementsByTagName返回与给定DOM节点中包含的给定标记名称匹配的节点,因此将“document”作为字符串传递将查找名为“document”的HTML元素。你需要找到div,例如:

d.getElementsByTagName("div"); // All the 'div' elements in the document

3.。)对于要用作字符串的方法名称,它们必须在括号中

document[ t ]; // document.t won't work, t is not a member

4。)一旦你访问了你关心的节点,你需要遍历它们以向每个元素添加事件处理程序

var d = document.getElementsByTagName("div"),
    i = 0,
    len = d.length;

for ( ; i < len; i++ ) {
    (function() {
        // do something with d[i], the current element in the loop
    })(i)
}
希望有所帮助!欢呼声。

答案 4 :(得分:0)

因为变量d是一个字符串;并且String对象没有getElementByTagName方法。

此外,您的d变量正在重新声明为字符串div;所以你需要将它分配给另一个名字:

var d = "document" ,
    t = "getElementByTagName" ,
    e = "div" ,
    oc = "onclick";

然后,您需要访问window对象,并检索它的document属性:

window[d]

检索Document元素,然后从中检索getElementsByTagName方法(读取 getElements 而非 getElement

window[d][t]

然后调用它并向其传递元素的名称,检索返回数组的第一个值,并为其onclick属性分配一个函数:

window[d][t](e)[0][oc] = function () {
    alert("1");
};

答案 5 :(得分:0)

var d = "document",
    t = "getElementsByTagName" ,
    div = "div" ,
    oc = "onclick";
window[d][t](div)[0][oc] = function(){
    alert("1");
}
  1. )文档不是字符串
  2. )document ['getElementByTagName']。call(this,'div')
  3. .访问者更改为括号,因为oc是字符串而不是属性
  4. )您曾经var d两次
  5. )它是getElementsByTagName,复数元素

答案 6 :(得分:0)

全字符串疯狂http://jsfiddle.net/nqeUN/8/

"document"["gg"]()["getElementsByTagName"]("div")["0"]["onclick"] = function(){alert(1);};