getElementsByName() undefinded?

Alt 02.11.2010, 01:11   # 1
thorr
 
Benutzerbild von thorr
 
Registriert seit: 22.11.2008
Beiträge: 40
Hi,

jaa, ich weiß - dieses Thema wird es wohl schon zig Mal (nicht nur) hier gegeben haben. Aber ich finde mein Phänomen nirgendwo wieder - meistens geht es ja darum, dass vergessen wurde, dass getElementsByName() ein Array erzeugt. Das ist allerdings nicht mein Problem.

Ich habe die HTML-Seite (im Original aus mehreren Stücken zusammengesetzt und aus Templatevorlage generiert) Schülersache CMS und das Skript http://thorr.bplaced.net/forendaten/script.js.

Das Problem ist nun, dass das Skript document.getElementsByName('objtype')[0] als undefined ansieht (Zeile 35), obwohl zuvor alle Aufrufe dieser Art funktioniert haben. Nur dieses eine Element macht anscheinend Ärger, denn für mich ist eindeutig, dass es im HTML-Dokument in Zeile 54 vorliegt. Andererseits habe ich versucht, an gleicher Stelle pageform zu erreichen, was ebenfalls nicht möglich war.

Ich hoffe, ihr könnt mir helfen, die Augen zu öffnen, da ich einfach mit meine Latein am Ende bin.

LG

PS: Für die, die den Fehler eventuell schon am Code erkennen können/wollen, hier der Quelltext:

HTML-Code:
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
	<meta name="author" content="Torben Fritsche" />

	<title>Sch&uuml;lersache CMS</title>
	
	<link href="design/style.css" rel="stylesheet" type="text/css" />
	
	<script type="text/javascript" src="language.js"></script>
	<script type="text/javascript" src="script.js"></script>
</head>

<body onload="reserveObj();">

<div class="overall">

<div class="header">


	<div class="user-box">
		Eingeloggt als:
		<span class="text-username">Administrator</span>

		<img src="design/arrow_nav.gif" alt="&raquo;" />&nbsp;<a href="?sel=logout">Ausloggen</a>
	</div>


</div>
<div class="navigation">
	<h2>Navigation</h2>
	<ul class="navigation-list">
		<li><a href="?sel=home">Startseite</a></li>

		<li><a href="?sel=pages">Seiten</a></li>
		<li><a href="?sel=categories_overview">Kategorien</a></li>
		<li><a href="?sel=mails_overview">Massen-E-Mails</a></li>
	</ul>
</div>

<div class="content">
<h2>{HEADLINE}</h2>

<noscript><p class="error-msg" style="display: block;">Ihr Browser unterst&uuml;tzt die Ausführung von JavaScript nicht oder sie ist momentan deaktiviert. Zur Bearbeitung von Inhalten ist aktiviertes JavaScript jedoch erforderlich.</p></noscript>

<p class="error-msg" id="error-msg">{ERR_MSG}</p>
<form action="?sel=alter_page&id=52" method="post" enctype="multipart/form-data" id="pageform">

<div id="msgbox"></div>

<input type="hidden" value="page" name="objtype" />
<input type="hidden" value="52" name="id" />

<table class="page-form-table">
<tr>
	<td class="description">Titel</td>

	<td colspan="2"><input type="text" value="Testseiten" maxlength="255" id="formfield-title" name="title" disabled="disabled" onchange="createpage();" /></td>
</tr><tr id="trow-pcontent">
	<td class="description">Inhalt</td>
	<td><textarea id="formfield-content" name="content" rows="10" disabled="disabled">Bla.</textarea></td>
	<td class="settings-column">
		<input type="checkbox" value="public" name="public" id="formfield-public1" disabled="disabled" />&nbsp;<label for="formfield-public1" class="disabled" id="label-public">Ver&ouml;ffentlicht</label><br />
		<select size="1" name="suppage" disabled="disabled">

			<option value="0" class="italic" style="border-left: 0px solid #eeeeee;"><i>(Erste Ebene)</i></option>
			<option value="48" style="border-left: px solid transparent; font-weight: normal;">Startseite</option>
			<option value="50" style="border-left: px solid transparent; font-weight: bold;">Testseiten</option>
			<option value="1" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="2" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.1</option>
			<option value="3" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>

			<option value="4" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="5" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="6" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="7" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="8" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="9" style="border-left: 14px solid transparent; font-weight: normal;">Testseite mit Umlauten</option>

			<option value="10" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="11" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="12" style="border-left: 14px solid transparent; font-weight: normal;">Testseite Nr.10</option>
			<option value="13" style="border-left: 14px solid transparent; font-weight: normal;">Neuer Titel</option>
			<option value="14" style="border-left: 14px solid transparent; font-weight: normal;">Testseite des Erstellens</option>
			<option value="16" style="border-left: 14px solid transparent; font-weight: normal;">Artikelseite</option>

			<option value="17" style="border-left: 14px solid transparent; font-weight: normal;">Testseite für Artikel</option>
			<option value="24" style="border-left: 14px solid transparent; font-weight: normal;">test</option>
			<option value="25" style="border-left: 14px solid transparent; font-weight: normal;">test2</option>
			<option value="26" style="border-left: 14px solid transparent; font-weight: normal;">Test3</option>
			<option value="27" style="border-left: 14px solid transparent; font-weight: normal;">Test3</option>
			<option value="28" style="border-left: 14px solid transparent; font-weight: bold;">Test4</option>

			<option value="33" style="border-left: 28px solid transparent; font-weight: normal;">TEst</option>
			<option value="29" style="border-left: 14px solid transparent; font-weight: normal;">Test</option>
			<option value="30" style="border-left: 14px solid transparent; font-weight: normal;">Test</option>
			<option value="31" style="border-left: 14px solid transparent; font-weight: normal;">Test</option>
			<option value="32" style="border-left: 14px solid transparent; font-weight: normal;">Test</option>
			<option value="34" style="border-left: 14px solid transparent; font-weight: normal;">Test5</option>

			<option value="35" style="border-left: 14px solid transparent; font-weight: normal;">Test</option>
			<option value="37" style="border-left: 14px solid transparent; font-weight: normal;">Test123</option>
			<option value="38" style="border-left: 14px solid transparent; font-weight: normal;">Test1234</option>
			<option value="39" style="border-left: 14px solid transparent; font-weight: normal;">Test12345</option>
			<option value="40" style="border-left: 14px solid transparent; font-weight: normal;">Test123456</option>
			<option value="41" style="border-left: 14px solid transparent; font-weight: normal;">Notizen</option>

			<option value="42" style="border-left: 14px solid transparent; font-weight: normal;">Test Test Test</option>
			<option value="43" style="border-left: 14px solid transparent; font-weight: normal;">Test Test Test Test</option>
			<option value="44" style="border-left: 14px solid transparent; font-weight: normal;">Test Test Test Test Test</option>
			<option value="45" style="border-left: 14px solid transparent; font-weight: normal;">Test Test Test Test Test Test</option>
			<option value="46" style="border-left: 14px solid transparent; font-weight: normal;">Test für das Speichern von Seiten ohne direktes AJAX</option>
			<option value="47" style="border-left: 14px solid transparent; font-weight: bold;">Nochmal der Test - Test zur Titeländerung</option>

			<option value="36" style="border-left: 28px solid transparent; font-weight: normal;">test5</option>
			<option value="49" style="border-left: 14px solid transparent; font-weight: normal;">Test Test 1234567</option>
			<option value="51" style="border-left: px solid transparent; font-weight: normal;">Testseiten</option>
			<option value="52" style="border-left: px solid transparent; font-weight: normal;">Testseiten</option>
		</select>
	</td>
</tr><!--<tr id="trow-particles">
	<td class="description">Artikelkategorie</td>
	<td colspan="2">
		Artikelkategorie:<br />
		<select size="1" name="category" disabled="disabled">
			<!-- BEGIN select-cat-option<option value="{select-cat-option.ID}"<!-- IF select-cat-option.IS_P_A_CAT selected="selected"<!-- ENDIF{select-cat-option.NAME}</option>

			<!-- END select-cat-option >
		</select><br /><br />
		
		Artikel pro Seite:<br />
		<input type="text" value="{P_A_NUMPERPAGE}" size="2" maxlength="2" name="articlesperpage" disabled="disabled" />
	</td>
</tr>--><tr>
	<td colspan="3"><input type="submit" value="Speichern" name="submit" disabled="disabled" /></td>
</tr>
</table>
</form>

<p id="box"></p></div>

<div class="clear"></div>

<div class="footer">
(Fu&szlig;zeile)
</div>

</div>

</body>
</html>
Code:
function ajaxRequest(url, options)
{
	this.url = url;
	this.method = (options.method) ? options.method : 'GET';
	this.query = (options.query) ? options.query : null;
	this.func = (options.onComplete) ? options.onComplete : null;
	this.req = (window.XMLHttpRequest)
		? new XMLHttpRequest()
		: ((window.ActiveXObject)
			? new ActiveXObject('Microsoft.XMLHTTP')
			: false);
}

ajaxRequest.prototype.dorequest = function() {
	this.req.open(this.method, this.url, true);
	if (this.method == 'POST')
	{
		this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	}
	
	var this_obj = this;
	var func = this.func;
	
	this.req.onreadystatechange = function() {
		if (this_obj.req.readyState == 4 && this_obj.func != null)
		{
			this_obj.func(this_obj.req.responseText, this_obj.req.responseXML);
		}
	}
	this.req.send(this.query);
}
		//var http = new ajax_request('handle.php?do=createpage')

//var formfields = new Array(title, getElementsByName('public')[0], content, submit);
var objtype = document.getElementsByName('objtype')[0].objtype.value;
document.write(objtype);

function toggleForm(mode) {
	var value = (mode) ? 'disabled' : '';
	
	document.getElementById(objtype + 'form').title.disabled = value;
	document.getElementsByName('public')[0].disabled = value;
	document.getElementById(objtype + 'form').suppage.disabled = value;
	document.getElementById(objtype + 'form').content.disabled = value;
	document.getElementById(objtype + 'form').submit.disabled = value;
	document.getElementById('label-public').setAttribute('class', value);
}

function reserveObj(takeobj)
{
	var id = document.getElementById(objtype + 'form').id.value;
	
	if (id)
	{
		var url = 'handle.php?do=reserve' + objtype + ((takeobj) ? '&options=take' + objtype : '') + '&id=' + id;
		
		var http = new ajaxRequest(url, {
				method:'GET',
				onComplete:reserveObj_handle});
		http.dorequest();
	}
	else
	{
		toggleform(false);
		document.getElementById('error-msg').style.display = 'none';
		document.getElementById('error-msg').innerHTML = '';
	}
}

function reserveobj_handle(text, xml) {
	var status_information = text.split(',');
	
	if (status_information[0] == '1')
	{
		toggleForm(false);
		document.getElementById('error-msg').style.display = 'none';
		document.getElementById('error-msg').innerHTML = '';
		
		window.setTimeout('reserveObj()', 3000);
	}
	else
	{
		document.getElementById('error-msg').style.display = 'block';
		toggleForm(true);
		document.getElementById('error-msg').innerHTML = (status_information[1] == 1)
			? lang['msg_reserved'][0] + status_information[2] + lang['msg_reserved'][1]
				+ ((status_information[3] == '1') ?
				lang['msg_takepage']
				: '')
			: (status_information[1] == 2)
				? lang['msg_nopermissions'] + 'nopermissions'
				: (status_information[1] == 3)
	 				? lang['msg_error']
			 		: lang['msg_error'];
 		
 		if (status_information[1] == 1 || status_information[3] == 1)
 		{
 			window.setInterval('checkavAilability()', 3000);
 		}
	}
}

function keepreservation() {
	
}

function createObj() {
	var id = document.getElementById(objtype + 'form').id.value;
	var title = document.getElementById(objtype + 'form').title.value;
		//document.getElementById('error-msg').innerHTML = 'test123';
	
	if (title.length > 3)
	{
		if (!id)
		{
			var http = new ajaxRequest('handle.php?do=create' + objtype + '&title=' + title, {
					method:'GET',
					query:'do=create' + objtype,
					onComplete:createObj_handle
				});
			http.dorequest();
		}
		else
		{
			var http = new ajaxRequest('handle.php?do=update' + objtype + '&id=' + id + '&title=' + title, {
					method:'GET',
					query:'do=update' + objtype
				});
			http.dorequest();
		}
	}
}

function createObj_handle(text, xml) {
	if (text)
	{
		document.getElementById(objtype + 'form').id.value = text;
		reservepage();
	}
	else
	{
		document.getElementById('error-msg').innerHTML = lang['msg_createp_error'];
	}
}

function checkavAilability() {
	var id = document.getElementById(objtype + 'form').id.value;
	
	var http = new ajax_request('handle.php?do=getstatus&id=' + id, {
			method:'GET',
			query:'do=getstatus',
			onComplete:checkAvailability_handle
		});
	http.dorequest();
}

function checkavAilability_handle(text, xml) {
	if (text == '1')
	{
		document.getElementById('error-msg').innerHTML = lang['msg_isreadonly'];
		window.clearInterval();
	}
}
Edit: JavaScript-Highlighting gibt es nicht?
  Mit Zitat antworten
Alt 02.11.2010, 06:27   # 2
FreewareGuide
Moderator
 
Benutzerbild von FreewareGuide
 
Registriert seit: 31.10.2002
Ort: Oldenburg
Beiträge: 5.432
Ähm, warum versuchst Du document.getElementsByName('objtype')[0].objtype.value zu lesen?

Mal davon ab, dass es sicherer wäre, beide getElementsByName()[] auf getElementById() umzubauen, auch Checkbox hast Du ja nur eine, getElementsByName()[] macht eher Sinn bei einer Menge von Checkboxen/Radiobuttons gleichen Namens.

Grüße,
Thorsten
__________________
Wieder da: FreewareGuide.de
...bin letztens durch die Aufnahmeprüfung zur Hellseherschule gekracht! smiley crystal ball
  Mit Zitat antworten
Alt 02.11.2010, 07:12   # 3
thorr
Threadstarter
 
Benutzerbild von thorr
 
Registriert seit: 22.11.2008
Beiträge: 40
Hi,

danke fuer deine Antwort.

Nunja, da der Name des Elements ja schon gegeben ist, habe ich versucht, das Element auch gleich darueber aufzurufen - die ID muesste erst noch zusaetzlich hinzugefuegt werden.

Aber ich wuerde mich durchaus auch zu getElementById() bereit erklaeren, wenn das funktionieren wuerde. Allerdings habe ich hier exakt dasselbe Problem. Ich kann das Script nachher zur Demonstration mal anpassen.

LG
  Mit Zitat antworten
Alt 02.11.2010, 08:21   # 4
FreewareGuide
Moderator
 
Benutzerbild von FreewareGuide
 
Registriert seit: 31.10.2002
Ort: Oldenburg
Beiträge: 5.432
Das mit getElementById() war nur eine Zusatzanmerkung, dann hantiert man halt mit einmaligen Objekten, denn eine ID muss in einem Dokument einmalig sein. Ich finde den Umweg über ein Array von Elementen eines Namens macht es schwerer lesbar, geht mir eigentlich eher um die Lesbarkeit des Codes.

Wichtig aber zuerst meine erste Frage: Was soll das .objtype (auch oben rot markiert) bedeuten? Wenn das document.getElementsByName('objtype')[0] Dir das Element zurückgibt, wieso hat dieses Element eine Eigenschaft namens "objtype"? Es hat den Namen, aber doch keine Eigenschaft. Oder ist mir da in JavaScript was entgangen? Und diese Eigenschaft hat dann wiederum die Eigenschaft value? Hat nicht das Element selbst den value?
  Mit Zitat antworten
Alt 02.11.2010, 08:34   # 5
thorr
Threadstarter
 
Benutzerbild von thorr
 
Registriert seit: 22.11.2008
Beiträge: 40
Oh, das stimmt noch vom Versuch, das Feld ueber das Formular anzusprechen. Ich hatte getElementsByName('objtype")[0] durch getElementsByName('pageform')[0].objtype ersetzt, was aber ebenso nicht wirklich funktionierte. Beim Rueckaendern in
getElementsByName('objtype')[0] muss ich das wohl uebersehen haben.

---------- Doppelpost zusammengeführt am 02.11.2010 um 08:59 ----------

Arrrg... Ich glaube, das Brett vor meinem Kopf hat sich soeben gelöst - dass es dazu aber erst einen Debugger gebraucht hat, finde ich beunruhigend. Schließlich war ich schon selbst auf der Spur, dass Elemente evtl. aufgerufen werden, bevor sie deklariert sind.

Naja, die Variable wird in der Funktion gesetzt, die erst aufgerufen wird, wenn die HTML-Seite geladen ist, und es müsste gehen. Dennoch vielen Dank für deine Hilfe bis hierhin! Es war echt eine blöde Frage...

Allerdings habe ich dennoch noch eine Frage, wo ich schon diesen Thread hier habe: Wie kann ich eine Variable globalisieren, dass sie auch in anderen Funktionen verfügbar ist?
  Mit Zitat antworten

Antwort
Themen-Optionen



Alle Zeitangaben in WEZ +2. Es ist jetzt 21:07 Uhr.