2

I have a javascript code that will run on different SharePoint platforms ( Office365, SharePoint 2013 & SharePoint 2016 )

I would like to detect the environment my code is running on, so I can add some CSS classes to control page behvaior based on the environment that I am running on.

How can I detect all those environment, note that code should still work if page is accessed anonymously ( SP.ClientContext is not an option here )

something like:

if ( isSharePoint2013() ) {
  document.documentElement.className += ' sharepoint-2013';
} else if ( isSharePoint2016() ) {
  document.documentElement.className += ' sharepoint-2016';
} else if ( isOffice365() ) {
  document.documentElement.className += ' office-365';
}

so what could be the logic behind those detection methods, in order to detect the right platform type ?

3
  • check this sharepoint.stackexchange.com/questions/74978/…
    – Waqas Sarwar MVP
    Jan 4, 2017 at 17:11
  • have you tried the mbauer's code?it give the server version not UR
    – Waqas Sarwar MVP
    Jan 4, 2017 at 17:26
  • @WaqasSarwarMVP all of the answers in your posted link, are using the same technique by detecting the UI version of the platform, unfortunately, UI version is the same for all 2013, 2016 & Office365 which is 15 Jan 4, 2017 at 17:26

2 Answers 2

2

This code will work anonymously if you uncheck Remote Interfaces permission

 var clientContext;
// Make sure the SharePoint script file 'sp.js' is loaded before your code runs.
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', sharePointReady);

// Create an instance of the current context.
function sharePointReady() {
    clientContext = SP.ClientContext.get_current();
    clientContext.executeQueryAsync(onRequestSucceeded, onRequestFailed);
}
function onRequestSucceeded() {
    //here you get the version
    console.log(clientContext.get_serverVersion());
}
function onRequestFailed(){
    console.log("Failed!");   
}
6
  • 1
    Having to wait for an async response to complete, will affect the overall user experience, as you can see I need to add classes as soon as possible. Jan 4, 2017 at 17:54
  • 1
    for o365, you could say if(window.location.href.indexOf("sharepoint.com") > 0){ //its o365}
    – Mike
    Jan 4, 2017 at 17:59
  • thanks, but it won't work if client has registered a custom domain Jan 4, 2017 at 18:34
  • theres also a _spPageContextInfo.tenantAppVersion will be "0" if it's not hosted in the cloud.
    – Mike
    Jan 4, 2017 at 19:14
  • 2
    @AnasNakawa SharePoint online will always have sharepoint.com in it's URL no matter wheather you registered your domain or not Jan 4, 2017 at 20:24
2

JSOM requires SP.js, so you can not check for version info early on in the Browser.

This is a snippet of the REST call I use to monitor SPOnline progress

fetch('/_vti_pvt/buildversion.cnf', {
    headers: new Headers({"content-type": "text/plain"})
}).then(function (r) {
    return r.text();
}).then(function (buildtext) {
    var build = buildtext.split('vti_buildversion:SR|')[1].split('\n')[0];
    console.info('SharePoint build:',build);
}).catch(function(e){
    console.error(,e);
});

This outputs 16.0.6008.1203 on one of my SPOnline tenants today
note: This changes weekly, sometimes hourly, and I even see Microsoft retract versions

On-Prem this version will only change on updates.
BUT read this: https://blogs.technet.microsoft.com/stefan_gossner/2016/08/23/sharepoint-does-not-have-a-build-version-full-stop/

Since I only monitor SPOnlines deltas I don't care about what the Buildversion is.

The fetch API (http://caniuse.com/#feat=fetch) is standard in Chrome,
for IE you need the PolyFill: https://github.com/github/fetch

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.