• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Switch will mit String nicht

m-obi

New member
Hallo,

ich habe ein seltsames Verhalten mit diesem Code.
Code:
function GetData(sVar, sValue)
{
    var actObject = GetCorrectElement(sVar);
    var Type;
    
    if (actObject) {
        Type = actObject.getAttribute("data-obfunc");
//        Type = window.prompt("Test", Type);
        switch (Type) {
            case "ButtonLight":
                if (sValue == '1') {
                    jQuery(actObject).addClass("ui-btn-active");
                }
                else {
                    jQuery(actObject).removeClass("ui-btn-active");
                }
                break;
        }
    }

    if (hSiteShowing && !xSettingValue)
        StartAutoUpdate();
}
Also von actObject.getAttribute("data-obfunc") bekomme ich den String "ButtonLight".
Aber die Switch-Anweisung spricht darauf nicht an. Wenn ich jetzt das window.prompt wieder reinnehme
und den String einfach damit nochmal bestätige klappt es mit der Switch-Anweisung.

Woran kann das liegen? Ich verzweifel schon.
 
Hast du vor dem switch mal mit alert(Type) kontrolliert, ob auch wirklich ButtonLight drin steht?
 
Ich hab jetzt den Verdacht, dass du in dem HTML-Attribut noch irgendwelche nicht druckbaren Zeichen drin hast.
Lass' dir doch auch nocht alert(Type.length) und alert(JSON.stringify(Type)) ausgeben und zeig' uns das Ergebnis.
 
Ich vermute dagegen, er hat in Type gar kein String (als Typ) vorliegen. prompt castet dann beim ok zum String. Fürs Verständnis zum Nachvollziehen:
Code:
Type = [ 'text'];
Type = window.prompt("Test", Type);
if( Type == 'text') alert('gleich');
else alert('ungleich');

Bestätige ich im prompt mit ok, gibt alert gleich aus. Wähle ich Abbrechen, gibt alert ungleich aus.
Muss zugeben, dieses Verhalten von prompt hat mich auch etwas überrascht.

LG jspit
 
Es wird "ButtonLight" zurückgegen. Nur diese 11 Buchstaben. Mit If funktioniert es auch. nur nicht mit Switch halt. Was ich ziemlich seltsam finde. Nur wenn ich es einmal durch Prompt durchgehen lasse, funktioniert es auch.

@jspit: Das liegt daran, weil bei Abbrechen wird ein Leerstring zurückgegeben. Somit kann man OK und Abbrechen abfragen.
 
Zuletzt bearbeitet:
Es wird "ButtonLight" zurückgegen. Nur diese 11 Buchstaben. Mit If funktioniert es auch. nur nicht mit Switch halt. Was ich ziemlich seltsam finde.
Ich auch, weil deine Schlußfolgerung so nicht stimmen kann:
Code:
var Type = "ButtonLight";
switch (Type) {
    case "ButtonLight":
        alert(Type);
        break;
}
Was ergibt denn alert(tyepof Type)?
 
Das gibt string aus. Wenn ich es konstants vorgebe klappt es auch. Nur nicht wenn es actObject.getAttribute("data-obfunc") zurückgibt. Obwohl es laut typeof ein String ist.
 
@m-obi: gib' uns doch mal einen Testlink, wo wir uns das direkt ansehen können.

@jspit: .getAttribute() gibt entweder NULL oder einen String zurück. Was anderes kann da nicht kommen.
 
So hier mal ne Testseite.

HTML:
HTML:
<!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">
    <head>
        <title>Test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
        <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
        <script src="GlobalFunctions.js"></script>
        <style>
                .NavFoo .ui-btn .ui-btn-inner { padding-top: 40px !important; }
                .NavFoo .ui-btn .ui-icon { width: 30px!important; height: 30px!important; margin-left: -15px !important; box-shadow: none!important; -moz-box-shadow: none!important; -webkit-box-shadow: none!important; -webkit-border-radius: 0 !important; border-radius: 0 !important; }
        </style>
    </head>
    <body>
        <div data-role="page" id="entry" data-theme="a">
                <div data-role="header" data-position="fixed" >
                </div><!-- /header -->

                <div data-role="content" >
                        <a data-role='button' id='Button1' href='#' data-PDDOut='Main.Light1' data-PDDIn='Main.Light1Switch' data-obfunc='ButtonLight' data-auto='Update'>Button1</a>
                        <a data-role='button' id='Button2' href='#' data-PDDOut='Main.Light2' data-PDDIn='Main.Light2Switch' data-obfunc='ButtonLight' data-auto='Update'>Button2</a>
                </div><!-- /content -->
        </div><!-- /page entry -->

        <script type="text/javascript">
            $('div[data-role="page"]').live('pagebeforeshow', function(event, ui){
                ldPage($.mobile.activePage.attr('id'));
            });
            $('a').click(function(event, ui) {
                GetData($(this).attr("data-PDDOut"), '1')
            });
        </script>
    </body>
</html>

JS:
Code:
var PagesArry = new Array();
var ActPageID;

function ldPage(PageID)
{
	var actPage;

	// get actual page div
	actPage = document.getElementById(PageID);
	ActPageID = PageID;

	if (!PagesArry[ActPageID])
	{
		var d;
		PagesArry[ActPageID] = new Array();
		PagesArry[ActPageID]['Single'] = new Array();
		PagesArry[ActPageID]['Auto'] = new Array();

		// get all links of actual page
		d = actPage.getElementsByTagName('a');
		for (var i = 0; i < d.length; i++)
		{
			if (d[i].getAttribute('data-PDDOut') != null)
				PagesArry[ActPageID]['Auto'].push( { Element: d[i], id:d[i].getAttribute('data-PDDOut') } );
		}

		// get all buttons of actual page
		d = actPage.getElementsByTagName('button');
		for (var i = 0; i < d.length; i++)
		{
			if (d[i].getAttribute('data-PDD') != null)
				PagesArry[ActPageID]['Auto'].push( { Element: d[i], id:d[i].getAttribute('data-PDD') } );
		}

		// get all select sliders of actual page
		d = actPage.getElementsByTagName('select');
		for (var i = 0; i < d.length; i++)
		{
			if (d[i].getAttribute('data-PDDOut') != null)
				PagesArry[ActPageID]['Auto'].push( { Element: d[i], id:d[i].getAttribute('data-PDDOut') } );
		}

		// get all checkboxs of actual page
		d = actPage.getElementsByTagName('input');
		for (var i = 0; i < d.length; i++)
		{
			if ( (d[i].getAttribute('data-PDD') != null) )
			{
				if ( (d[i].getAttribute('type') == 'range') || (d[i].getAttribute('type') == 'checkbox') || (d[i].getAttribute('type') == 'radio') )
					PagesArry[ActPageID]['Auto'].push( { Element: d[i], id:d[i].getAttribute('data-PDD') } );
				if ( (d[i].getAttribute('type') == 'text') )
					PagesArry[ActPageID]['Single'].push( { Element: d[i], id:d[i].getAttribute('data-PDD') } );
			}
		}

		// get all listview items of actual page
		d = actPage.getElementsByTagName('li');
		for (var i = 0; i < d.length; i++)
		{
			if (d[i].id != '')
			{
				if (!d[i].getAttribute('data-auto'))
					PagesArry[ActPageID]['Single'].push( { Element: d[i], id:d[i].id } );
				else
					PagesArry[ActPageID]['Auto'].push( { Element: d[i], id:d[i].id } );
			}
		}

		// get all span of actual page
		d = actPage.getElementsByTagName('span');
		for (var i = 0; i < d.length; i++)
		{

			if ( d[i].id  && (d[i].id != '') )
			{
				if (!d[i].getAttribute('data-auto'))
					PagesArry[ActPageID]['Single'].push( { Element: d[i], id:d[i].id } );
				else
					PagesArry[ActPageID]['Auto'].push( { Element: d[i], id:d[i].id } );
			}
		}
	}
}

function GetCorrectElement(ObjectName)
{
	var actObject = null;
	var i = 0;

	while ( (i < PagesArry[ActPageID]['Auto'].length) && !actObject )
	{
		if ( PagesArry[ActPageID]['Auto'][i].id == ObjectName )
			actObject = PagesArry[ActPageID]['Auto'][i].Element;
		i++;
	}

	i = 0;
	while ( (i < PagesArry[ActPageID]['Single'].length) && !actObject )
	{
		if ( PagesArry[ActPageID]['Single'][i].id == ObjectName )
			actObject = PagesArry[ActPageID]['Single'][i].Element;
		i++;
	}

	if (!actObject)
	{
		window.console && console.warn('Element for ' + ObjectName + ' not found!');
		return;
	}

	return(actObject);
}

function GetData(sVar, sValue)
{
    var actObject = GetCorrectElement(sVar);
    var Type;

    if (actObject) {
        Type = actObject.getAttribute("data-obfunc");
        switch (Type) {
            case 'ButtonLight':
                if (sValue == '1') {
                    jQuery(actObject).addClass("ui-btn-active");
                }
                else {
                    jQuery(actObject).removeClass("ui-btn-active");
                }
                break;
        }
    }
}

Bei einem Klick auf den jeweiligen Button muss er aktiv werden.
 
Hab gerade gemerkt, wenn ich die Seite normal in einem Browser öffne, funktioniert es. Es klappt nur nicht wenn ich es per Qt Creator öffne in einer Anwendung.
 
Qt Creator ist eine Entwicklungsumgebung für C++. Ich schreib im Moment ein Programm wo ich als Oberfläche eine HTML-Seite habe mit jQuery-Design. Im Hintergund läuft dann die C++-Anwendung.
 
Ursache nicht, nur wo der Fehler auftritt. Hmm, dann liegt es am eingebauten Browser.
navigator.userAgent gibt mir
Code:
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.21 (KHTML, like Gecko) HTML5Test2 Safari/537.21
aus. HTML5Test2 heißt das Projekt.
 
Zuletzt bearbeitet:
Die Ursache ist der Bug und nicht die Umgebung, da es anscheinend eine fehlende Komponente ist bzw. fehlerhafte. Wenn mein Auto nicht mehr lenkt, ist die Fehlerursache ja auch nicht das Auto sondern die Ursache liegt beim Lenksystem.
Und es wird ja anscheinend ein Standard Browser genutzt, siehe userAgent.
 
Ich hab hier "AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ " also eine ältere Version als du und da funktioniert dein Code.
 
@jspit: .getAttribute() gibt entweder NULL oder einen String zurück. Was anderes kann da nicht kommen.
Ja, wenn das Objekt ein node eines HTML-Elementes ist. Es war für mich aus dem obigen Code nicht eindeutig ersichtlich, was geliefert wird, 'GetCorrectElement' sagt mir nichts. Für ein eigenes Objekt kann ich eine Methode getAttribute definieren, die sonstwas liefert, wenn auch der Name mehr als unglücklich wäre. Für mich bleiben viele Widersprüche in den Aussagen des TE.

LG jspit
 
So hier mal ne Testseite.
Dazu noch ein paar Anmerkungen.

Das erste was auffällt ist, dass du HTML5 benutzt, aber dein Doctype etwas anderes sagt.

Diese inkonsistienz zieht sich auch durch dein JS Code.

Einerseits hast du jQuery eingebunden auf der anderen Seite bemühst du DOM Methoden. Oder getAttribute() und gleichzeitig den direkten Objektzugriff. Dann scheinst du nicht die literale Schreibweise zu kennen, die vorzuziehen ist und dir Schreibarbeit spart. Ausserdem scheint dir der Unterschied zwischen einem Object und einem Array nicht bekannt zu sein, da du überall Arrays verwendest, auch wenn du eigentlich ein Objekt willst. Das du mit globalen Variabeln arbeitest ist dann noch das i-Tüpfelchen.
 
Zurück
Oben