SharePointCommunity
Die deutschsprachige Community für SharePoint, Office 365 und mit Azure

JS-Programmierung für Sharepoint

bewertet von 0 Usern
Beantwortet Dieser Beitrag hat 1 Geprüfte Antwort | 15 Antworten | 1 Follower

Top-50-Beitragsschreiber
Weiblich
246 Beiträge
ExpoIT erstellt in 12 Jun 2017 12:58

Hallo, 

ich habe ein Button, welches bei einem Klick eine Funktion ausführen soll. Das sieht so aus:

html: <button onclick="execute()">OK</button>

im Javascript:

function execute(){ alert("Hallo Test"); }

Es funktioniert nicht und ich finde einfach den Fehler nicht.

Vielleicht hat jemand doch einen heißen Tipp für mich.

Viele Grüße AS

Beantwortet Geprüfte Antwort

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Ach so, noch was: bevor man die Elemente aus SharePoint benutzen kann, müssen sie geladen werden. Dazu braucht es zum einen ctx.load(object) und zum zweiten einen Aufruf von executeQueryAsync. Das ist immer asynchron, aber wenn man mit anonymen Methoden arbeitet, hat man immer Zugriff auf die vorher definierten Variablen:

var list = ...
ctx.load(list);
ctx.executeQueryAsync(function() {
// Erfolg. Hier hat man Zugriff auf die Variable "list"
}, function() {
// Fehler
});

Man kann übrigens problemlos mehrere Sachen auf einmal laden, also mehrere ctx.load() hintereinander haben (z.B. für mehrere Listen und Listenelemente) und die dann mit einem einzigen executeQueryAsync wirklich laden.

Viele Grüße
Andi
af @ evocom de
Blog

Alle Antworten

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Bei dem was Du gepostet hast, wird der alert nicht aufgerufen? Das wäre sehr seltsam.

Schau nochmal ins HTML. Wirklich alles richtig geschrieben? JavaScript ist case-sensitive. Sind um die function herum <script> Tags? Geht es, wenn Du direkt onclick="alert('Hallo Welt')" schreibst?

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
Weiblich
246 Beiträge

mein html steht im script editor (webpart)

<table><tr>

<td><select id="tstList"><option>Aufgaben</option></select></td>

<td><button onclick="execute()">OK</button></td>

</tr></table>

 

das js-script referenziere ich hier. Ist also separat als js-datei gespeichert, da brauche ich doch keine <script> Tags!?!

function execute() {

      alert("Hallo")

   

steht vor der while-schleife

Ja, es geht, wenn ich es direkt im html eingebe. onclick="alert('Hallo Welt')"

Da steckt bestimmt wieder so ein mini-wurm drin....

 

Viele Grüße AS

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

ExpoIT:
das js-script referenziere ich hier. Ist also separat als js-datei gespeichert, da brauche ich doch keine <script> Tags!?!

Nein, in dem Fall brauchst Du die nicht.

ExpoIT:
steht vor der while-schleife

Das verwirrt mich - ich sehe keine while-Schleife?

Ich vermute mal, daß Du damit die execute-function irgendwo eingebettet hast, also z.B. in einer anderen function. Sorge einfach dafür, daß sie auf höchster Ebene steht. Oder schreie sowas:
window.execute = function() { alert("Hallo Welt"); }

ExpoIT:
Da steckt bestimmt wieder so ein mini-wurm drin....

Das ist es ja meistens, aber die sind oft auch am schwierigsten zu finden :-)

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
Weiblich
246 Beiträge

Andi Fandrich:

Ich vermute mal, daß Du damit die execute-function irgendwo eingebettet hast, also z.B. in einer anderen function. Sorge einfach dafür, daß sie auf höchster Ebene steht.

Das war es!

Mein Script sieht folgendermaßen aus:

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {

loadSharepointList();

});

function execute(){ alert("Hallo Test");}

function loadSharepointList() {

var context = SP.ClientContext.get_current();

var list = context.get_web().get_lists().getByTitle('Hauptaufgaben');

//var list2 = context.get_web().get_lists().getByTitle('Unteraufgaben'); //ist das der richtige Platz?

//var list3 = context.get_web().get_lists().getByTitle('Liste User');   //??

 

var caml = new SP.CamlQuery();

caml.set_viewXml("<Query><Where><IsNotNull><FieldRef Name='Title' /></IsNotNull></Where></Query>");

 

var listItems = list.getItems(caml);

context.load(listItems, 'Include(Title)');

context.executeQueryAsync(

    Function.createDelegate(this, function () {

     var listEnumerator = listItems.getEnumerator();

    var list = document.getElementById("tstList");

    while (listEnumerator.moveNext()) {

     var listItem = listEnumerator.get_current();

     var fieldValue = listItem.get_item('Title');

     var option = document.createElement("option");

    option.text = fieldValue;

    list.add(option);

       }

    return "<option>" + fieldValue + "</option>";

      }),

 

    Function.createDelegate(this, function () {

    alert('Error fetching data from Sharepoint!');

    }));

}

-------------------

ich habe ein select-Tag in dessen options alle items aus List1 geholt werden, dann habe ich mein OK-Button ( mit der function execute()).

Sobald eine Hauptaufgabe gewählt wurde und OK gedrückt wurde:

if(Klick auf OK-Button){

if(List2Column1 == gewählte Option){

List2Column2 in "Tasks" einfügen

if(List3Column2 == List2Column2){

List3Column3 in "Tasks" einfügen

}}}

 Ist die Überlegung so richtig?

 

Viele Grüße AS

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Ob das so richtig ist, kann ich Dir nicht sagen. Ich weiß nicht, was es mit den Columns auf sich hat.

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
Weiblich
246 Beiträge

das sind keine definierten Variablen, sondern nur Bezeichnungen meinerseits.

z.B. List2Column1 = Hier ist die Abfrage nach der Spalte 1 in Liste 2

Wenn also etwas gewählt wurde in der Liste Haupaufgaben und auf OK gedrückt wird, wird Liste 2 aufgeschlagen und geschaut was in Spalte 2 steht, ist dieser Wert gleich die gewählte Option, wird aus der Liste 2 der Wert in Spalte 1 in die "Tasks"-Liste eingefügt. Danach wird noch in Liste 3 in Spalte 2 nachgeschaut, ob hier der Wert gleich mit der Spalte 1 in Liste 2 ist und falls ja, die Spalte 1 aus Liste 3 in die "Tasks"-Liste eingefügt.

Liste 1:

Spalte 1 Spalte 2
Berlin Stadt
Spanien Land

 

Liste 2:

Spalte 1 Spalte 2 Spalte 3
Verwaltung Berlin xxxx
Buchhaltung Spanien yyyyy

Liste3:

Spalte 1 Spalte 2 Spalte 3 Spalte 4
Herr Maier Verwaltung
Frau Ahrens Buchhaltung

Es wird Berlin gewählt, dann kommt in Tasks-Liste folgender Eintrag:

Verwaltung Herr Maier

Ich hoffe so ist es verständlicher, was ich eigentlich vorhabe. Ich weiß leider nicht, unter welchem Schlagwort ich hier nachschauen kann.

Danke

Viele Grüße AS

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Nach Deinem ersten Absatz war mir noch etwas schwindlig, aber dank des Beispiels geht es jetzt wieder...

Ja, das kann man so umsetzen und ich halte es in SharePoint sogar für eine vernünftige Lösung. Aber wenn Du noch irgendwo Hilfe brauchst, mußt Du konkreter fragen.

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
Weiblich
246 Beiträge

super, das freut mich, dass es machbar ist. 

Meine aktuelle Frage ist eigentlich die, wie der code aussehen muss, dazu habe ich ja im vorherigen Beitrag meine Vorstellung der Codezusammensetzung dargestellt. Ich frage nicht nach dem Code, welches zur Lösung führt, sondern eher nach der Struktur.

Ich werde 3 Listen abrufen, wo kann ich diese definieren, global? wo muss ich die Abfrage, nach dem OK-Button-Click hinsetzen?

Viele Grüße AS

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Hm, das klingt eher nach einer kleinen JavaScript-Schulung? Wobei Du ja schon ganz schön weit bist...

Mal zum Grundsätzlichen: daß man Scripte in eigene Dateien auslagert, weißt Du ja schon. Damit man nicht zu viele globale Variablen erzeugt, gibt es in JavaScript mehrere Ansätze ähnlich den Namespaces in C#. Am einfachsten geht sowas:

window.myNamespace = window.myNamespace || { };
window.myNamespace.someVariable = "This is sample text";
window.myNamespace.someFunction = function() {
  // function code here
};

Zugriff auf Variablen und Aufrufen von Funktionen dann immer mit window.myNamespace... Beim Button also z.B. onclick="window.myNamespace.someFunction();"

Zugriff auf SharePoint-Elemente geht immer über den ClientContext (SP.ClientContext.get_current() ) und dann über das Web. An eine bestimmte Liste kommt man z.B. so:
var list = ctx.get_web().get_lists().getByTitle("Name der Liste");

Abfragen von bestimmten Elementen einer Liste geht mit einer sog. CamlQuery:
var query = new SP.CamlQuery();
query.set_viewXml("<View><Query><Where>...</Where></Query></View>");

Zur grundlegenden Syntax von Caml schau Dir das mal an (ist zwar für serverseitigen Code, aber Caml ist dasselbe): https://andifandrich.wordpress.com/2010/12/03/caml-abfragen-in-sharepoint/

Disclaimer: Code ist ungetestet aus dem Kopf und kann Fehler enthalten :-)

Viele Grüße
Andi
af @ evocom de
Blog
Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Ach so, noch was: bevor man die Elemente aus SharePoint benutzen kann, müssen sie geladen werden. Dazu braucht es zum einen ctx.load(object) und zum zweiten einen Aufruf von executeQueryAsync. Das ist immer asynchron, aber wenn man mit anonymen Methoden arbeitet, hat man immer Zugriff auf die vorher definierten Variablen:

var list = ...
ctx.load(list);
ctx.executeQueryAsync(function() {
// Erfolg. Hier hat man Zugriff auf die Variable "list"
}, function() {
// Fehler
});

Man kann übrigens problemlos mehrere Sachen auf einmal laden, also mehrere ctx.load() hintereinander haben (z.B. für mehrere Listen und Listenelemente) und die dann mit einem einzigen executeQueryAsync wirklich laden.

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
Weiblich
246 Beiträge

Danke, dass du dir soviel Mühe gegeben hast, das alles zu schreiben!!!

Das mit Caml und ClientContext ist mir klar gewesen, allerdings werde ich mich jetzt mit den globalen Variablen auseinandersetzen. 

Vielen vielen Dank Andy!

Viele Grüße AS

Top-50-Beitragsschreiber
Weiblich
246 Beiträge

Also irgendwie klappt es doch nicht soo, mein Hirn brennt gerade:

function loadSharepointlist(){

//holt alle 3 Listen mit

var listx= context.get_web().get_lists().getByTitle('X');

//erstelle Query

var camlx = new SP.CamlQuery();

camlx.set_viewSml("<Query>.......</Query>");

//Listenelemente holen

var listItemsx = list.getItems(camlx);

//laden der Listen

context.load(listItemsx, 'Include(Title),....');

//Liste 1 erscheint im <select><option>-tag, wenn die anderen Listen nicht geladen werden. Muss ich für jede Liste eine eigene Funktion schreiben???

Wie hole ich die Abfrage in function execute(), dh. nachdem der Button betätigt wurde?

 

Viele Grüße AS

Top-10-Beitragsschreiber
Männlich
18.084 Beiträge

Also wie oben bereits geschrieben, brauchst Du nicht für jede Liste eine eigene Funktion, sondern Du kannst alle Daten in einem Rutsch laden.

Leider verstehe ich aber den Rest der Frage nicht so ganz. Ich dachte, das ist die Funktion, die statt execute() aufgerufen wird?

Viele Grüße
Andi
af @ evocom de
Blog
Top-50-Beitragsschreiber
Weiblich
246 Beiträge

Ich dachte eigentlich an 2 Funktionen: eine um die Listen zu laden und die andere, die nach dem Drücken des Buttons ausgelöst wird. :-/

Wäre eine Funktion in dem Falle doch besser? Funktion lädt die Listen und fragt ab, ob das Button gedrückt wurde, danach kommen die Abfragen???

Viele Grüße AS

Seite 1 von 2 (16 Elemente) 1 2 Weiter > | RSS