SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




JavaScript beim Erstellen eines WebParts registrieren

Unbeantwortet Dieser Beitrag hat 13 Antworten

Ohne Rang
22 Beiträge
Wadik1977 erstellt 19 Feb. 2015 13:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo an alle!

Bei der Programmierung von WebParts greife ich oft zu jQuery und anderen jQuery-Plugins. Alle JavaScripts lasse ich mit "RegisterClientScriptInclude" registrieren.  In meiner Entwicklungsumgebung habe ich keine Probleme, in der produktiven Umgebung werden manche Plugins bzw. JavaScript nicht geladen. Ich verstehe es nicht, warum das so ist. Mir ist aufgefallen, dass wenn ich mich in WebPart-Einstellungen befinde, dann alle JavaScripts geladen werden (???)

Es gibt ja viele Möglichkeiten, um JavaScripts in einem WebPart zu registrieren. Ich habe sie schon alle ausprobiert, und alle funktionieren in meiner Entwicklungsumgebung, jedoch nicht in der produktiven Umgebung.

Kann mir jemand erklären auf was ich sonst noch achten muss?

Mfg

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Feb. 2015 13:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Woher referenzierst Du denn die Dateien? Ich nehme stark an, daß nicht das Registrieren der Scripte fehlschlägt, sondern daß die Benutzer einfach keine Berechtigungen auf die Quelle haben und deshalb die Dateien nicht geladen werden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 19 Feb. 2015 13:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Dateien füge ich dem Projekt in VS2010 hinzu. Sie befinden sich dann in "Layouts -> Projektname -> Scripts". Meine WebParts teste ich mit meinem Adminkonto.

Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 19 Feb. 2015 15:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

In etwa so registriere ich ein JavaScript:

            Type csType = this.GetType();
            ClientScriptManager cs = Page.ClientScript;

            String jQuery1112 = "/_layouts/MetroButtons/Scripts/jquery.js";
            String gridStack = "/_layouts/MetroButtons/Scripts/gridstack.js-master/src/gridstack.js";

            if (!cs.IsClientScriptIncludeRegistered(csType, "jquery1112.js"))
            {
                cs.RegisterClientScriptInclude(csType, "jquery1112.js", jQuery1112);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "gridstack.js"))
            {
                cs.RegisterClientScriptInclude(csType, "gridstack.js", gridStack);
            }

Hier treten Probleme mit dem "gridstack.js" auf. Es wird in der produktiven Umgebung nicht geladen.

Danke übrigens für deine Antwort!

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Feb. 2015 08:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Genau sowas hatte ich vermutet ;-)

Ich mache mal ein Beispiel:
Eine SharePoint-Webanwendung läuft unter der Adresse http://sharepoint. Die Websitesammlung mit Deinem Webpart läuft unter dem relativen Pfad /sites/Anwendung, insgesamt also unter http://sharepoint/sites/Anwendung.
Du bindest die Scripte über den server-relativen Pfad ein: /_layouts/... und das ergibt insgesamt http://sharepoint/_layouts/... Wenn jetzt jemand nur Zugriff auf Deine Anwendung hat, aber keinen ZUgriff auf die Websitesammlung direkt unter http://sharepoijnt dann bekommt er die Scriptdateien nicht. Du als Admin merkst das natürlich nicht (was übrigens auch ein Grund ist, warum man immer auch mit einem normalen Account testen sollte).

Lösung: binde die Scripte mit der URL der Website ein:
SPWeb web = SPContext.Current.Web;
string URL = SPUrlUtility.CombineUrl(web.Url, "_layouts/...");

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 20 Feb. 2015 09:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi!

Vielen Dank für diese logische Erklärung! Jedoch ist es in meinem Fall keine Lösung. Ich habe die Scripte so eingebunden wie du vorgeschlagen hast. Immernoch das gleiche Problem. Ich habe auch am Anfang geschrieben, dass das Problem auch mit dem Adminkonto auftritt. Hier ist der Code:

            SPWeb web = SPContext.Current.Web;

            String jQuery = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/jquery.js");
            String gridStack = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/gridstack.js-master/src/gridstack.js");

            if (!cs.IsClientScriptIncludeRegistered(csType, "jquery.js"))
            {
                cs.RegisterClientScriptInclude(csType, "jquery.js", jQuery);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "gridstack.js"))
            {
                cs.RegisterClientScriptInclude(csType, "gridstack.js", gridStack);
            }

 

Der Browser spuckt diese Fehlermeldung aus:

TypeError: $(...).gridstack is not a function


Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Feb. 2015 10:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das heißt wohl, jQuery wird eingebunden, aber gridstack nicht. Bist Du sicher, daß Pfad und Dateiname stimmen? Ich kenne das Plugin nicht, kann es sein, daß es noch andere Abhängigkeiten hat?

Tut mir leid, aber sonst habe ich dazu auch keine Idee mehr.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 20 Feb. 2015 10:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, jQuery wird eingebunden. Und ja, es gibt noch weitere Scripts, die eingebunden werden. Der Pfad stimmt definitif. Wie ich schon geschrieben habe, die Scripte werden in VS importiert. Bei der Veröffentlichung werden sie auf den anderen Server auch kopiert. Ich habe testweise die Stringdefinitionen vertauscht, und siehe da, es funktioniert.

Ich habe lediglich die Stringdefinitionen vertauscht, das verstehe ich nicht, wo ist die Logik?? Warum geht das jetzt?

Vorher:

            String jqueryUI1112 = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/jquery-ui-1.11.2.custom/jquery-ui.js");
            String underscore = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/gridstack.js-master/src/underscore-min.js");

            String ajaxLoader = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/ajaxLoader/ajaxLoader.js");
            String gridStack = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/gridstack.js-master/src/gridstack.js");
           
            String countdown = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/jQuery.countdown-master/src/countdown.js");

Nachher:

            String jqueryUI1112 = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/jquery-ui-1.11.2.custom/jquery-ui.js");
            String gridStack = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/gridstack.js-master/src/gridstack.js");
            String underscore = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/gridstack.js-master/src/underscore-min.js");
            String ajaxLoader = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/ajaxLoader/ajaxLoader.js");
            String countdown = SPUrlUtility.CombineUrl(web.Url, "/_layouts/MetroButtons/Scripts/jQuery.countdown-master/src/countdown.js");

Dieser Teil wurde nicht verändert:

           if (!cs.IsClientScriptIncludeRegistered(csType, "jquery.js"))
            {
                cs.RegisterClientScriptInclude(csType, "jquery.js", jQuery);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "jqueryUI1112.js"))
            {
                cs.RegisterClientScriptInclude(csType, "jqueryUI1112.js", jqueryUI1112);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "underscore.js"))
            {
                cs.RegisterClientScriptInclude(csType, "underscore.js", underscore);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "ajaxLoader.js"))
            {
                cs.RegisterClientScriptInclude(csType, "ajaxLoader.js", ajaxLoader);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "gridstack.js"))
            {
                cs.RegisterClientScriptInclude(csType, "gridstack.js", gridStack);
            }

            if (!cs.IsClientScriptIncludeRegistered(csType, "countdown.js"))
            {
                cs.RegisterClientScriptInclude(csType, "countdown.js", countdown);
            }

Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 20 Feb. 2015 10:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein, funktioniert doch nicht! Ich war bei WebPart-Einstellungen, da werden komischerweise die Scripts geladen!

 

Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 20 Feb. 2015 11:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe vorerst die Scripte in MasterPage inkludiert, bis ich die Lösung gefunden habe. Danke Andi für deine Mühe:)

Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 11 März 2015 12:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Langsam denke ich, dass ich weiß, wo Probleme liegen könnten. Obwohl wir mittlerweile schon IE 11 haben, fürht SharePoint alle Seiten, aufgrund dieser Zeile in MasterPage "<meta http-equiv="X-UA-Compatible" content="IE=8" />", im IE 8 Modus aus. Einige JavaScript-Plugins unterstützen IE 8 gar nicht.
Ich weiß aber auch, dass es Probleme geben könnte, wenn ich auf IE 11 abändere. Wie ist denn eure Erfahrung? Funktioniert das gut?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 März 2015 12:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

IE11 macht an einigen Stellen Probleme. Aber es gibt ja zwischen IE8 und IE11 noch zwei weitere Versionen und die funktionieren ganz gut.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
22 Beiträge
Wadik1977 Als Antwort am 11 März 2015 12:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi!

Danke für deine schnelle Reaktion!

D.h. ich kann ohne Bedenken auf IE 10 umstellen?

[quote user="Andi Fandrich"]

IE11 macht an einigen Stellen Probleme. Aber es gibt ja zwischen IE8 und IE11 noch zwei weitere Versionen und die funktionieren ganz gut.

[/quote]

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 März 2015 12:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, kannst Du.

Viele Grüße
Andi
af @ evocom de
Blog