2011-10-17 246 views
0

的JavaScript对象的引用我有非常非常宝贵的,所以我试图让快捷方式是这样的:通过快捷键

活生生的例子:http://jsfiddle.net/nqeUN/

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

,但它不工作,是什么原因?我可以在谷歌,加上API看到,所有的对象都是这样定义,作为字符串,他们是如何使它发挥作用?

+1

IMO的少一些按键“方便”是不值得的代码的可读性的影响。如果您担心提供较小的'.js'文件,请阅读SLaks的答案。 – NullUserException

+0

请勿这样编码。它使你的代码完全不可读,并且会对许多错误和更长的开发负责。此外,如果其他人每个人都需要处理你的代码,他们将是完全没有生产力的。如果您想要更小的代码,请在部署之前编写普通的JavaScript并在最终结果上使用缩小器。即使'd [t](d)[0] .oc ='是正确的代码,它也是非常神秘且难以理解的。 – jfriend00

+0

@ jfriend00:我完全同意这段代码对其他人不清楚。但在同一时间'文件。getElementsByTagName'不能被缩小。我认为这种技术是可以的,因为它确实允许代码被缩小,但是当然需要更好的变量名称。 – user113716

回答

1

字符串将适用于属性,但不适用于变量名称。您还需要定义d两次,并使用错误的方法名称。你将能够做到这一点:

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

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

但是这确实降低了可读性,是没有必要的。您可以通过最小化程序运行您的代码以自动获取该代码,并仍然保持可读的开发代码。

+0

这就是我正在寻找,我不想贪心,但我可以得到任何“窗口”作为字符串不知何故? –

+2

@Mor:'window ['window']';) –

+0

是你的意思吗? http://jsfiddle.net/nqeUN/4/ –

0

因为变量d是一个字符串;和String对象不具有getElementByTagName方法。

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

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

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

window[d] 

检索Document元素,然后检索从它的getElementsByTagName方法(读的getElementsgetElement

window[d][t] 

然后,您可以调用它,并将它传递的元素的名称,检索返回数组的第一个值,并分配一个功能到其onclick属性:

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

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

您应该编写var d = document以获得实际的document对象。


但是,你不应该自己做这个;它使完全无法读取代码。

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

+0

在谷歌加上api他们设置文件为一个字符串,他们如何使它的工作? –

+0

@Mor:'window [“document”]'。 – SLaks

0
var d = "document", 
    t = "getElementsByTagName" , 
    div = "div" , 
    oc = "onclick"; 
window[d][t](div)[0][oc] = function(){ 
    alert("1"); 
} 
  1. )文件不是字符串
  2. )文档[ 'getElementByTagName']。呼叫(这一点, 'DIV')
  3. .存取变为托架因为OC是一个字符串不是物业
  4. )你曾经两次var d
  5. )这是getElementsByTagName,多元素
+0

在谷歌加上api他们设置文件为一个字符串,他们如何使它的工作? –

+0

添加窗口[“文档”] – Joe

2

有一对夫妇,你需要解决

  • 问题,你必须绑定到d两个值:"document""div"
  • 这是getElement 小号 ByTagName
  • getElementsByTagName功能需要一个DOM入口点不是一个字符串。切换第一ddocument
  • 当使用点符号为.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

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

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

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

var d = window.document; 

2)getElementsByTagName收益匹配包含给定的DOM节点中的给定标记名称的节点,所以通过“文件”作为一个字符串会寻找名为“文件”的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) 
} 

希望帮助!干杯。