2014-10-09 72 views
0

我是Javascript新手,试图编写一个函数来改变某些文本的颜色,但是“this”会一直返回为undefine,并且不会更改文本颜色。 下面是代码,我非常感谢一些帮助。Javascript:带有“this”的函数undefined

<h1> 
    <ul><div class="info" id="info" onclick="this.style.color= '#9DC8BA'">INFO 
    </div></ul> 
    <ul><div class="menu" id="menu" onclick="test1()"<!--this is where the problem is-->MENU</div></ul> 

这里是JavaScript的

function test1() { 
this.style.color= '#9DC8BA'; 
} 
+0

您是否得到了解决方案? – Amy 2014-10-09 06:29:34

+0

将'= test1()'更改为'= test1(this)',并将'function test1()'更改为'function test1(div){div.style.color ='#CCC'}'。 – MrROY 2014-10-09 06:33:55

+0

您的标记无效,DIV不能成为UL的子项。在非严格模式下,* this *永远不会被定义。如果没有在调用中设置,或者通过* bind *,它将默认为全局(浏览器中的窗口)对象。控制台可能抱怨* window.style *未定义。 – RobG 2014-10-09 07:14:56

回答

3

你要的DOM元素的引用传递给函数

<div class="menu" id="menu" onclick="test1(this)">/div> 
在上面的html

,这是指当前的DOM元素,它ID菜单的DIV。

然后参照和修改DOM函数内部

function test1(obj) { 
    obj.style.color= '#9DC8BA'; 
} 

旁注:你似乎有对class和id的DIV,这是不是一个好的做法同一个名字。永远记得Class对应于一组元素,ID对应于唯一元素。

+0

非常感谢Prabhu,我很抱歉用这么简单的解决方案浪费你的时间,但是谢谢你。 – TJ5897 2014-10-09 06:29:19

+0

他不'必须'。还有另一种解决方案。 – Epsilon 2014-10-09 06:37:04

+0

@Epsilon:对不起,我错过了这里的东西。 – 2014-10-09 06:38:59

1

test1函数不是作为上下文在div元素上执行,而是在窗口上执行。

做到这一点:

onclick="test1(this)" 

在功能:

function test1(div) { 
    div.style.color = '#9DC8BA'; 
} 
+0

*此*不是“上下文”,它是[*执行上下文*](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-execution-contexts)的参数。 ;-) – RobG 2014-10-09 07:19:18

+0

我解释了当前的问题。作为解决方案,上下文将作为参数传递。 – 2014-10-09 08:13:13

0

HTML代码

<h1> 
    <ul><div class="info" id="info" onclick="this.style.color= '#9DC8BA'">INFO 
    </div></ul> 
    <ul><div class="menu" id="menu" onclick="test1(this)">MENU</div></ul> 
</h1> 

JavaScript代码:

function test1(obj) 
{ 
    obj.style.color= '#9DC8BA'; 
} 
0

当你在html中写入onclick时,它自己产生新的函数。 在你的情况下,它就像function(){test1()}this里面这个函数是你需要的,但this里面的test1是未定义的。

您可以使用this作为test1

... onclick="test1(this)" ... 

参数和JS

function test1(obj) { 

而且在test1

或者设置功能onclick属性使用obj而不是this从JavaScript这样的:

var menu = document.getElementById('menu'); 
menu.onclick = test1; 

在这种情况下this里面的test1将正是你所需要的。