如何使用javaScript进行相移?

时间:2014-05-06 04:27:47

标签: javascript phase

为什么这两个阶段不会在小提琴中移动: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());

你可能会说第一阶段是唯一一个被解雇的阶段。为什么不进行第二阶段的解雇?

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

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

1)小提琴已经设置为执行JavaScript代码onLoad;检查侧栏是否有不同的选项。

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

3)=是赋值,==是相等,===是严格相等。查找more info

的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/

答案 2 :(得分:0)

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