2011-11-25 47 views
4

我有類似我的源代碼下面的許多實例:通過標記調用全局函數可能嗎?

  <input id="a" type="text" name="a" maxlength="40" 
      onfocus="ThisOnFocus(this)" onkeydown="ThisOnKeyDown(this)" onkeyup="ThisOnKeyUp(this)" onblur="ThisOnBlur(this)"/> 

每個輸入標籤與聚焦狀態結束的onkeydown,的onkeyup,和的onblur函數調用。

我想要做的是全局性地指定所有輸入標籤在這些事件上調用這些函數。這是可以在JavaScript中做的事嗎?謝謝!

編輯:我曾嘗試在腳本部分放置這一點,並沒有在我的職務被稱爲:

document.onload = function() { var inputs = document.getElementsByTagName('input'); 
    for (i = 0; i < inputs.length; i++) { 
    inputs[i].onfocus = ThisOnFocus; 
    inputs[i].onblur = ThisOnBlur; 
    inputs[i].onkeyup = ThisOnKeyUp; 
    inputs[i].onkeydown = ThisOnKeyDown; 
    } 
    } 

編輯:另外,也可以不輸入複選框和文本框來區分是很重要的,但這些函數都屬於文本域。

回答

0

你有幾個問題:

  1. onload是一個事件處理程序,它適用於window對象。
  2. 您的事件處理函數正在等待您未傳遞的參數。例如,在你的標記中,你有ThisOnBlur(this),但是在代碼中你只是使用ThisOnBlur而不傳遞參數。

下面我將如何改變你的代碼:

function createEventHandler(fn, input) { 
    return function() { 
     fn(input); 
    }; 
} 

window.onload = function() { 
    var inputs = document.getElementsByTagName('input'); 
    for (i = 0; i < inputs.length; i++) { 
     inputs[i].onfocus = createEventHandler(
      ThisOnFocus, inputs[i]); 

     inputs[i].onblur = createEventHandler(
      ThisOnBlur, inputs[i]); 

     inputs[i].onkeydown = createEventHandler(
      ThisOnKeyDown, inputs[i]); 

     inputs[i].onkeyup = createEventHandler(
      ThisOnKeyUp, inputs[i]); 
    } 
}; 

createEventHandler功能可以讓你去,利用正確的參數來調用現有的事件處理函數的引用。

下面是一個例子:http://jsfiddle.net/YPNmd/

+0

只是爲了警告其他人,點擊這些文本框的一個導致無限循環。 – Mike

+0

我最終得到這個使用body onload的工作。否則它不會起作用。但這個答案讓我在那裏。謝謝! – Mike

+0

@Mike:很高興幫助,雖然它應該在''你的HTML文檔的標籤太... –

0

這確實是一個字global scope的問題。如果你的JS分散在多個文件中,你必須將上述答案的代碼寫入一個文件中,該文件在調用每個其他JS函數的主文件之前調用。

如果您有一個文件,請將這些行放在每個函數外部的頂部。這使得它在JS中是全球性的。但在這種情況下使用jQuery方法是可以建議的,因爲全局變量是崩潰的基本點。儘量避免使用它們

1

您可以使用捕獲和冒泡。請注意,對於焦點和模糊事件,需要捕獲。或者,您可以使用focusin和focusout事件。

現場演示:http://jsfiddle.net/t2KdS/

相關問題