1

为什么这两个阶段没有在小提琴中发生变化:http: //jsfiddle.net/WH7Kf/43/

function phase_switch(){
    var phase;
    clicker = document.getElementById("click");
    phase=1
    switch (phase) {
        case 1:
            clicker.onclick = do_this;
            break;
        case 2:
            clicker.onclick = do_that;
            break;
    }

    function do_this (){
        alert("this");
        phase==2;
    }
    function do_that (){
        alert("that");
        phase==1;
    }
}

window.addEventListener("load", phase_switch());

正如您可能会说的那样,第一阶段是唯一启动的阶段。为什么第二阶段没有触发?

4

3 回答 3

2

你可以做的更简单:

var clicker = document.getElementById("click");
clicker.onclick = do_this;
function do_this (){
    alert("this");
    clicker.onclick = do_that;
}
function do_that (){
    alert("that");
    clicker.onclick = do_this;
}

http://jsfiddle.net/Ncz7w/

于 2014-05-06T04:40:02.137 回答
2

从一开始就有一些语法问题:

1)小提琴已经设置为执行JavaScript代码onLoad;检查侧边栏以获取不同的选项。

2)您缺少变量声明。当您省略var变量时,该变量将变为全局变量,并且可以在函数外部访问;你不想要这个。

3)=是赋值,==是相等,===是严格相等。查找 MDN 以获取更多信息

4)我认为你把事情复杂化了。尝试分离关注点。创建一个需要元素和消息的函数,并在事件处理程序中执行逻辑。您可以跟踪一个标志以在存储在数组中的两条不同消息之间切换。例如:

var clicker = document.getElementById("click");

/**
 * @param el DOM element
 * @param msgs Array containing 2 messages
 */
function phaseSwitch(el, msgs) {
    var flag = false;
    el.addEventListener('click', function() {
        alert(msgs[+flag]); // casts flag to index (0|1)
        flag = !flag; // invert flag
    });
}

phaseSwitch(clicker, ['hello', 'bye']);

演示:http: //jsfiddle.net/WH7Kf/48/

于 2014-05-06T04:43:08.490 回答
0

窗口加载事件在页面生命周期中发生一次,您在窗口加载事件中绑定单击处理程序,该事件将执行一次。所以phase第一次的值为 1 因此当您单击按钮do_this时将始终执行

于 2014-05-06T04:34:05.673 回答