基本Javascript问题

基本Javascript问题,javascript,if-statement,Javascript,If Statement,我在胡闹头一本Javascript书。所以我的问题是为什么我的函数turnSad()中的if子句不触发更新我已经在Chrome和FF4中尝试过了。另外,如果我要注释掉if语句,该函数将工作 <script type="text/javascript"> function turnSad() { if (document.getElementById("rockImg").src == "rock_happy.png") documen

我在胡闹头一本Javascript书。所以我的问题是为什么我的函数
turnSad()
中的
if
子句不触发更新我已经在Chrome和FF4中尝试过了。另外,如果我要注释掉
if
语句,该函数将工作

<script type="text/javascript">

    function turnSad() {
        if (document.getElementById("rockImg").src == "rock_happy.png")
            document.getElementById("rockImg").src = "rock.png";
    }

    function touchRock() {
        var userName = prompt("What is your name?", "Enter your name here");

        if (userName) {
            alert("It is nice to meet you " + userName + ".");
            document.getElementById("rockImg").src = "rock_happy.png";
        }
        setTimeout("turnSad();", 1000);
    }

</script>
<img id="rockImg" src="rock.png" alt="iRock"  style="cursor:pointer" 
    onclick="touchRock();" />

函数turnSad(){
if(document.getElementById(“rockImg”).src==“rock\u happy.png”)
document.getElementById(“rockImg”).src=“rock.png”;
}
函数touchRock(){
var userName=prompt(“你叫什么名字?”,“在这里输入你的名字”);
如果(用户名){
提醒(“很高兴见到你”+用户名+”;
document.getElementById(“rockImg”).src=“rock_happy.png”;
}
setTimeout(“turnSad();”,1000);
}

您正在使用哪个浏览器?IE可能会将文件名转换为大写(“ROCK_HAPPY.PNG”)。使用开发者工具(按工具工具栏中的刷新按钮)确定真正的“src”属性是什么,或者只需执行
警报(document.getElementById().src)
当访问
src
属性(而非属性)时,浏览器可以自动解析相对路径并返回包含协议的绝对路径,域、端口等

要获取或更改属性值,请使用
getAttribute
setAttribute

image.getAttribute("src");

image.setAttribute("src", "someImage.png");

看看这个。

@Anurag的答案很好,这是你所能做的最好的了,
getAttribute()
受到周围每个浏览器的支持(IE 5.5-7中有缺陷,但对于获取
src
来说,它工作得很好)

我只想补充几点:

  • 不要使用
    setTimeout()
    的字符串语法,始终传入函数(可以传入闭包以运行多个函数),这被认为是最佳做法。字符串变体的工作原理类似于众所周知的邪恶混蛋
    eval()
    。因此,您的代码应该如下所示(同样适用于
    setInterval
    ):

  • 除了使用最好的方法
    getAttribute()
    ,还可以编写正则表达式方法。我只是为了好玩和开阔视野才添加这个,请使用@Anurag的解决方案

    if (document.getElementById("rockImg").src.match(/(^|\/)rock_happy\.png$/i)) {
        document.getElementById("rockImg").src = "rock.png";
    }
    
    这将尝试以不区分大小写的方式进行匹配,在字符串末尾查找
    rock_happy.png
    ,在其前面有字符串的开头或
    /


它正在返回
rock_happy.png
这是可行的,但我不完全理解您的陈述
当访问src属性(而不是属性)时,浏览器可能会自动解析相对路径并返回绝对路径,包括协议、域、端口、,等等。
你的意思是在属性
src
后面有它的内置属性吗?@Nai如果
src
属性被设置为
rock_happy.png
(这是一个相对URL),并且你使用
elem.src
获得值,一些浏览器会自动将其填充为绝对URL(例如
http://yourdomain.com/rock_happy.png
)。上存在表示
属性的
src
属性,另一方面表示HTML文档中存在的
src
属性的原始值。获取或设置属性值时,不会对该值应用任何逻辑,也不会以任何方式对其进行转换。
if (document.getElementById("rockImg").src.match(/(^|\/)rock_happy\.png$/i)) {
    document.getElementById("rockImg").src = "rock.png";
}