В других ответах указана ошибка (при попытке доступа к узлам DOM до того, как они появятся в документе), я просто укажу на альтернативные решения.
Простой метод
Добавьте элемент script в HTML ниже закрывающего тега элемента, к которому вы хотите получить доступ. В самой простой форме поместите его непосредственно перед закрывающим тегом body. Эта стратегия также может ускорить отображение страницы, поскольку браузер не приостанавливает загрузку HTML для скрипта. Общее время загрузки такое же, однако скрипты все равно должны быть загружены как исполняемые, просто этот порядок делает кажущимся более мягким для пользователя.
Используйте window.onload или
Этот метод поддерживается каждым браузером, но он запускается после загрузки всего контента, поэтому страница может казаться неактивной в течение короткого времени (или, возможно, долгого времени, если загрузка прекращается). Хотя это очень надежно.
Использовать функцию готовности DOM
Другие предложили jQuery, но вам может не потребоваться 4000 строк и 90 КБ кода только для функции, готовой к DOM. jQuery довольно запутанный, поэтому его трудно удалить из библиотеки. MyLibrary Дэвида Марка, однако, очень модульный и довольно легко извлекает только те биты, которые вы хотите. Качество кода также превосходно, по крайней мере, равноценно любой другой библиотеке.
Вот пример функции готовности DOM, извлеченной из MyLibrary:
var API = API || {};
(function(global) {
var doc = (typeof global.document == 'object')? global.document : null;
var attachDocumentReadyListener, bReady, documentReady,
documentReadyListener, readyListeners = [];
var canAddDocumentReadyListener, canAddWindowLoadListener,
canAttachWindowLoadListener;
if (doc) {
canAddDocumentReadyListener = !!doc.addEventListener;
canAddWindowLoadListener = !!global.addEventListener;
canAttachWindowLoadListener = !!global.attachEvent;
bReady = false;
documentReady = function() { return bReady; };
documentReadyListener = function(e) {
if (!bReady) {
bReady = true;
var i = readyListeners.length;
var m = i - 1;
// NOTE: e may be undefined (not always called by event handler)
while (i--) { readyListeners[m - i](e); }
}
};
attachDocumentReadyListener = function(fn, docNode) {
docNode = docNode || global.document;
if (docNode == global.document) {
if (!readyListeners.length) {
if (canAddDocumentReadyListener) {
docNode.addEventListener('DOMContentLoaded',
documentReadyListener, false);
}
if (canAddWindowLoadListener) {
global.addEventListener('load', documentReadyListener, false);
}
else if (canAttachWindowLoadListener) {
global.attachEvent('onload', documentReadyListener);
} else {
var oldOnLoad = global.onload;
global.onload = function(e) {
if (oldOnLoad) {
oldOnLoad(e);
}
documentReadyListener();
};
}
}
readyListeners[readyListeners.length] = fn;
return true;
}
// NOTE: no special handling for other documents
// It might be useful to add additional queues for frames/objects
else {
if (canAddDocumentReadyListener) {
docNode.addEventListener('DOMContentLoaded', fn, false);
return true;
}
return false;
}
};
API.documentReady = documentReady;
API.documentReadyListener = documentReadyListener;
API.attachDocumentReadyListener = attachDocumentReadyListener;
}
}(this));
Использование в вашем случае:
function someFn() {
var el = document.getElementById('MainContent_txtBox');
el.onclick = function() { alert('test!!');
}
API.attachDocumentReadyListener(someFn);
или может быть предоставлена анонимная функция:
API.attachDocumentReadyListener(function(){
var el = document.getElementById('MainContent_txtBox');
el.onclick = function() { alert('test!!');
};
Очень простые функции, готовые к DOM, могут быть выполнены в 10 строках кода, если вы просто хотите одну для конкретного случая, но, конечно, они менее надежны и не так многоразовы.