Ohne Alert-Fenster funktioniert das JavaScript nicht!?!

preko

Erfahrenes Mitglied
Ich habe ein Script, bei dem, wenn ich eine bestimmte Alert-Anweisung nicht angebe, der Ablauf des Scripts nicht durchläuft. Sobald die Alert-Anweisung angegeben wird, läuft das Script durch und funktioniert. Ich bin absolut ratlos, da JavaScript bisher nicht meins war und ich mich versuche in diesen Bereich einzuarbeiten.

Dazu muss ich vielleicht noch erwähnen, dass ich mit dem Script auf eine Liste eines SharePoint-Servers zugreife.

Der Aufruf des Scripts erfolgt über einen Button:
HTML:
<input id="okButton" type="button" class="round" value="Termin(e)" onclick="repeater()" />

Dargestellt wird das Script in einem DIV-Container:
HTML:
<div id="displayTermine"></div>

Das Script sieht wie folgt aus:
Code:
var itemId; 
var targetListItem;      
var counter = 1;
var iterator = 0;
var start = "<p><table id='listOutput' class='table table-hover table-responsive table-condensed table-bordered myTable'>" +
            "<thead class='success'>" +
            "<tr class='info text-center success'>" +
            "<th class='th text-center'>Nr.</th>" +
            "<th class='th text-center'>Eingangsdatum</th>" +
            "<th class='th text-center'>Terminart</th>" +
            "<th class='th text-center'>Titel</th>" +
            "<th class='th text-center'>Beginn</th>" +
            "<th class='th text-center'>Ende</th>" +
            "<th class='th text-center'>Beschreibung</th>" +
            "<th class='text-center' style='border-top: 0; border-right: 0;'>Aktion</th>" +
            "</tr>" +
            "</thead>" +      
            "<tbody>";  
var end = "</tbody>" +
            "</table></p><br /><br />";
var terminListe = [];

function runCode(itemId) {
    alert(itemId);
    var clientContext = new SP.ClientContext();
    var targetList = clientContext.get_web().get_lists().getByTitle('Anfragen');
    targetListItem = targetList.getItemById(itemId);
    clientContext.load(targetListItem, 'ID', 'Terminart', 'Title', 'abcd', 'efgh', 'ijkl', 'Eingangsdatum');
    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));  
}

function onQuerySucceeded(sender, args) {
    terminListe.push("<tr>" +
    "<td class='text-center'>" + targetListItem.get_item('ID') + "</td>" +
    "<td class='text-left strong'>" + targetListItem.get_item('Terminart') + "</td>" +
    "<td class='text-left'>" + targetListItem.get_item('Title') + "</td>" +
    "<td class='text-center'>" + targetListItem.get_item('abcd').format('dd.M.yyyy - hh:mm') + " Uhr</td>" +
    "<td class='text-center'>" + targetListItem.get_item('efgh').format('dd.M.yyyy - hh:mm') + " Uhr </td>" +
    "<td class='text-left'>" + targetListItem.get_item('ijkl') + "</td>" +
    "<td class='text-center'>" + targetListItem.get_item('Eingangsdatum').format('dd.M.yyyy') + "</td>" +
    "<td class='text-center'><input id='okButton' type='button' class='btn btn-outline-success btn-ok round' value='&#10003;' title='Termin annehmen' /><input  id='noButton' type='button' class='btn btn-outline-success round' value='x' title='Termin ablehnen' /></td>" +
    "</tr>");
}

function onQueryFailed(sender, args) {
    //alert(counter + '\nAbfrage fehlgeschlagen. \n\nFehler: \n' + args.get_message() + '\n\nStapelverfolgung (StackTrace): \n' + args.get_stackTrace());
    return;
}


function repeater() {
    counter = 1;
    do {
       runCode(counter++);
    } while (counter <= 3);
  
    document.getElementById("displayTermine").innerHTML = start + terminListe + end;
}

Es geht speziell um die Alert-Anweisung in diesem Codeteil:
Code:
function runCode(itemId) {
    alert(itemId);


Wird der weggelassen, passiert "nichts". Ist die Alert-Anweisung hinterlegt, zeigt das Alertfenster die ItemId wie es sein soll und der Code läuft durch und zeigt auch zum Schluss alles an.

Ich verstehe nicht, warum die Alert-Anweisung notwendig ist. Ursprünglich war sie nur zur Entwicklung gedacht und sollte dann raus. Dabei fiel dann dieses unerklärliche Verhalten auf. o_O

Hat jemand eine Idee, was hier passiert?

Beste Grüße!
 
Fehlermeldung:
if(SP.ScriptUtility.isUndefined(a))throw Error.create(SP.ResResources.getString(SP.ResourceStrings.propertyHasNotBeenInitialized));

Fehlertext Konsole:
Die Eigenschaft oder das Feld wurde nicht initialisiert. Es ist keine Anforderung erfolgt, oder die Anforderung wurde nicht ausgeführt. Ggf. muss eine ausdrückliche Anforderung erfolgen.
 
Ergänzung zum ursprünglichen Thread:

selbst wenn ich "nur" einen leeren Alert, also
Code:
alert();
in der Funktion runCode() ausgeben lasse, läuft der Rest einwandfrei! Es muss also nicht einmal
Code:
alert(itemId);
stehen.
 
if(SP.ScriptUtility.isUndefined(a))throw Error.create(SP.ResResources.getString(SP.ResourceStrings.propertyHasNotBeenInitialized));

Naja, beim ersten Aufruf ist das Objekt SP.ScriptUtility nicht intitialisiert. Da ich die Zeile in deinem geposteten Code nicht finde, denke ich, dass die Fehlermeldung von der von dir verwendeten Bibliothek kommt.

An deiner Stelle würde ich die Zeile
Code:
var clientContext = new SP.ClientContext();
als globale Variable deklarieren. Aktuelle erstellst du beim Schleifendurchslauf jedes Mal ein neues Objekt.
 
@Kalito: vielen Dank für die Antwort.

Habe es wie von Dir vorgeschlagen versucht, aber leider scheitert der Versuch und es tritt das gleiche Verhalten auf wie vor der Änderung - ohne alert() läuft nix! :(

Die Bibliothek, die anscheinend in der Datei sp.js liegt, die eine SharePoint-eigene Datei ist, habe ich gar nicht angerührt. Laut Darstellung von Microsoft soll das Script auch so gestaltet werden wie ich es aufgeführt habe.
 
Welche Javascript-Dateien hast du in welcher Reihenfolge eingebunden?

Hast du schon hier nach einer Lösung nachgesehen?

Was passiert, wenn du statt alert folgenden Code eingibst:

Code:
console.log('Test');

Ist zwar etwas russisch, könnte aber helfen.
 
der Code läuft durch und zeigt auch zum Schluss alles an.
Was meinst Du damit? Die Anzeige der Terminliste hier?:
Code:
document.getElementById("displayTermine").innerHTML = start + terminListe + end;
Dann liegt das Problem auf der Hand: Ich kenne zwar diese API nicht, aber offensichtlich sind die Abläufe asynchron. Die Antwort trifft mit Verzögerung ein und wenn Du das innerHTML von #displayTermine gleich hinter der Schleife setzt, ist terminListe noch gar nicht gefüllt, weil die Antworten noch nicht eingetroffen sind.
Abhilfe: #displayTermine im success-Callback (onQuerySucceeded) füllen:
Code:
function onQuerySucceeded(sender, args) {
    terminListe.push("<tr>" +
    "<td class='text-center'>" + targetListItem.get_item('ID') + "</td>" +
    "<td class='text-left strong'>" + targetListItem.get_item('Terminart') + "</td>" +
    "<td class='text-left'>" + targetListItem.get_item('Title') + "</td>" +
    "<td class='text-center'>" + targetListItem.get_item('abcd').format('dd.M.yyyy - hh:mm') + " Uhr</td>" +
    "<td class='text-center'>" + targetListItem.get_item('efgh').format('dd.M.yyyy - hh:mm') + " Uhr </td>" +
    "<td class='text-left'>" + targetListItem.get_item('ijkl') + "</td>" +
    "<td class='text-center'>" + targetListItem.get_item('Eingangsdatum').format('dd.M.yyyy') + "</td>" +
    "<td class='text-center'><input id='okButton' type='button' class='btn btn-outline-success btn-ok round' value='&#10003;' title='Termin annehmen' /><input  id='noButton' type='button' class='btn btn-outline-success round' value='x' title='Termin ablehnen' /></td>" +
    "</tr>");
    counterCallback++;
    if (counterCallback == 3) document.getElementById("displayTermine").innerHTML = start + terminListe + end;
}
function onQueryFailed(sender, args) {
    //alert(counter + '\nAbfrage fehlgeschlagen. \n\nFehler: \n' + args.get_message() + '\n\nStapelverfolgung (StackTrace): \n' + args.get_stackTrace());
    return;
}
var counterCallback = 0;
function repeater() {
    counter = 1;
    do {
       runCode(counter++);
    } while (counter <= 3);
    //document.getElementById("displayTermine").innerHTML = start + terminListe + end;
}
Möglicher Weise muss man dann noch Vorkehrungen treffen für den Fall, dass eine Abfrage fehl schlägt.
 

Neue Beiträge

Zurück