2013-08-29 67 views
0

我設置一些事件偵聽器在這樣的傳統方式:如何讓事件監聽器更改JavaScript代碼中的變量?

<script>  
window.onload = setup; 
function(setup) { 
    var myButton = document.getElementById("myButton"); 
    myButton.onclick = someFunction; 
} 

我想要什麼someFunction做的是改變某個變量我的代碼裏面(當按鈕被按下當然)。比方說,我的代碼中包含變量x,並且事件偵聽器處於活動狀態,因此我的代碼中有一個函數something()

function something() { 
var x; 
for (;;) { 
    if (x === value set by someFunction) { 
     break; 
     } 
    } 
} 

我該怎麼做?

回答

0

當一個事件被觸發,你可以做的東西,所以:

CODE CODE CODE 
    .... 
    var x = INITIAL_VALUE; 
    function someFunc(){ 
     x = what ever you wish; 
    } 
0

最簡單的方法就是讓x一個全局變量。

如果你不想污染全局命名空間,您使用的立即執行功能:

(function() { 
    var x; 
    function someFunc() { 
     // May assign x 
    } 
    function setup() { 
     var myButton = document.getElementById("myButton"); 
     myButton.onclick = someFunction; 
    } 
    window.onload = setup; 
    function something() { 
     // Use x 
    } 
})(); 

這個函數創建了x變量的本地命名空間。

0

如果我理解你的問題,最簡單的方法是定義一個全局變量var value,這樣它可以被someFunction()something()訪問。

另一種方法,沒有任何監聽器,可以是:

function something() { 
var x; 
for (;;) { 
    if (x === someFunction()) { 
     break; 
     } 
    } 
} 

function someFunction() { 
    ... 
    return value; 
} 
0
// 
// try a 'notifier' decorator 
// 
function notifier(handler_fn, callback_fn) { 


    // #helpers 
    function slc(args, i1, i2) { 
     return Array.prototype.slice.call(args, i1, i2); 
    } 
    function prepend(targetArr, arr) { 
     Array.prototype.unshift.apply(targetArr, arr); 
     return targetArr; 
    } 
    function thepush(targetArr, arr) { 
     Array.prototype.push.apply(targetArr, arr); 
     return targetArr; 
    } 



    return (function(cb, args1) { 

     var origfn = this; 

     return function() { 

      var 
       args = prepend(slc(arguments), args1), 
       out = origfn.apply(this, args); 

      cb.apply(this, thepush(args, [out])); 

      return out; 

     }; 

    }).call(handler_fn, callback_fn, slc(arguments, 2)); 

} 



var 
    handlerfn = function (e) { 
        var 
         T = e.type.toUpperCase(); 
        (this instanceof Node) && (this.innerHTML = T); 
        return T; 
       }, 
    F = notifier(
        handlerfn, 
        function (f1_in, f1_out) { 

         var 
          v1 = f1_in; 

         v1.target.innerHTML += ', coords:[' + v1.clientX + ', ' + v1.clientY +']'; 

         console.log(f1_in, ', ', f1_out); 
        } 
       ); 

document.getElementById('btn_01').onclick = F; 
// 
//