我注意到在几个浏览器中,dom元素只能通过它们的id访问:
HTML
<div id="chocolat"></div>
Run Code Online (Sandbox Code Playgroud)
JS
alert(chocolat.id); //alerts "chocolat
chocolat; //points to the node
window.chocolat; //idem
chocolat === document.getElementById('chocolat'); // true
Run Code Online (Sandbox Code Playgroud)
(在这里测试:http://jsfiddle.net/GUUPT/)这适用于Chrome上的某些版本的IE,但它不适用于Firefox(5).
我好奇这是从哪里来的?这是标准吗?
可能重复:
JavaScript函数别名似乎不起作用
为什么这不起作用?
function foo() {
var g = document.getElementById;
g('sampleID');
}
Run Code Online (Sandbox Code Playgroud)
在Chrome:Uncaught TypeError: Illegal invocation
...和Firefox中引发此错误:Error: uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object"
它适用于IE9测试版!!
我知道关于这个话题还有其他一些帖子,但它们仍让我感到困惑.
我已经包含了jQuery和所有内容,我有一个像这个例子的简单的javascript类:
function CarConstructor(){
this.speed=19; // in mph
this.make="Ford";
this.fillKph=fillKph;
}
function fillKph(){
$("#kphdiv").html(this.speed*1.61);
}
car1 = new CarConstructor();
car1.fillKph();
Run Code Online (Sandbox Code Playgroud)
现在我知道该代码段不起作用,并且没有正确构建.
"this"关键字引用了我的dom元素,其id为"kphdiv".
我的问题是处理这个问题的最佳方法是什么.
我见过一种方法,你设置一些等于此的变量(绑定它),然后使用该变量来引用你的对象.例如:
function CarConstructor(){
this.speed=19; // in mph
this.make="Ford";
this.fillKph=fillKph;
}
function fillKph(){
var me=this;
$("#kphdiv").html(me.speed*1.61);
}
car1 = new CarConstructor();
car1.fillKph();
Run Code Online (Sandbox Code Playgroud)
我也可以让我成为一个全球变量...我不知道.
如果有另一种/更好的方式,我只是好奇.
如果可能的话,代码会更有效:
var min = document.getElementById;
Run Code Online (Sandbox Code Playgroud)
然后document.getElementById()使用min().
不试图编写缩小的代码,但在这种特殊情况下,可以减少范围查找并缩短某些行.
这是语法问题还是对语言的限制?
我在Angular应用程序中这样做了:
var cl = console.log;
cl(123);
Run Code Online (Sandbox Code Playgroud)
但是,我有以下错误消息:
Uncaught TypeError: Illegal invocation
Run Code Online (Sandbox Code Playgroud)
这发生在Chrome中.它适用于Nodejs.
我糊涂了.这是非法代码吗?
我试图在JavaScript中执行以下操作:
var gete = document.getElementById;
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误(来自FireBug的控制台):
uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: http://localhost:8080/im_ass1/ :: anonymous :: line 15" data: no]
现在显然我可以将函数包装如下:
var gete = function (id) {
return document.getElementById(id);
};
Run Code Online (Sandbox Code Playgroud)
但是,在将函数分配给另一个名称时,我得到上述异常的原因是什么?
在创建大量DOM元素时,document.createElement和朋友可以添加大量的字节和丑陋.我知道我可以创建自己的子程序,或使用innerHTML或其他什么,但为什么我不能这样做:
var $c = document.createElement;
var newP = $c('p');
Run Code Online (Sandbox Code Playgroud)
Firebug抱怨这条消息:
"Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"
Run Code Online (Sandbox Code Playgroud)
显然,我做了一些不允许的事情.为什么不呢?它允许其他东西,例如Array.splice或Math.min.
我最近尝试在javascript中使用map的实现来创建一堆项目,然后将它们应用于对象添加方法.
首先是沼泽标准的地图实现.
var map = function (fn, a)
{
for (i = 0; i < a.length; i++)
{
a[i] = fn(a[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
建立.
var translateMenu = new Menu;
var languages = [ ['Chinese' , 'zh-CN']
, ['German' , 'de']
, ['French' , 'fr']
, ['Portugese' , 'pt']
, ['Hindi' , 'hi']
];
Run Code Online (Sandbox Code Playgroud)
我的功能......(不是匿名的,因为它在将translateMenu添加到mainMenu时会被使用.)
var langItem = function (language, subMenu)
{
return new MenuItem(language[0], 'http://translate.google.com/translate?u=www.example.com&hl=en&ie=UTF-8&tl=en&sl=' + language[1] , "" , subMenu);
}
map ( langItem , languages );
Run Code Online (Sandbox Code Playgroud)
这一切都运行良好,我现在有一个MenuItems阵列扔掉.
尝试调用 …