Недавно, работая над очередным решением для фермы SharePoint 2013, я использовал метод JavaScript - SetUrlKeyValue для редактирования параметра в строке запроса.
Устанавливает значение ключа в URL. Третий параметр указывает - необходимо ли значение кодировать.
function SetUrlKeyValue(keyName, keyValue, bEncode, url) { if (url == null) url = window.location.href + ""; var val = keyValue; var uri = new URI(url, { disableEncodingDecodingForLegacyCode: true }); url = uri.getQuery(); if (bEncode) val = escapeProperly(val); if (url.indexOf(keyName + "=") < 0) { if (url.length > 1) url += "&"; else if (url.length == 0) url += "?"; url += keyName + "=" + val; } else { var re = new RegExp(keyName + "=[^&]*"); url = url.replace(re, keyName + "=" + val); } uri.setQuery(url); return uri.getString(); }
И все было прекрасно, метод великолепно выполнял свое назначение, и я был доволен.
Тем не менее, изначально, я не учел очень важную особенность работы метода SetUrlKeyValue - он выполняется в среде, запущенной от имени пользователей, обладающих, как минимум, правами для совместной работы с текущим контентом.
Меня это не устраивало, так как метод должен выполняться и для пользователей с правами только для чтения текущей страницы. И таких пользователей, как правило, должно быть большинство. Не давать же в конце концов им всем права на совместное пользование сайтом SharePoint☺.
Вот фрагмент моей функции, который изначально мною использовался:
$("a[title='zamena']").each(function () { var url = $(this).attr("href"); var _BZnaniyId_ = url.indexOf('BZnaniyId='); if (_BZnaniyId_ > 0) { var BZnaniyId = parseInt(GetUrlKeyValue("BZnaniyId")); if (BZnaniyId > 1) { try{ var url1 = SP.Utilities.UrlBuilder.removeQueryString(url, "BZnaniyId"); if (typeof url1 != "undefined") { var url2 = SetUrlKeyValue("BZnaniyId", BZnaniyId, false, url1); if (typeof url2 != "undefined") { $(this).attr("href", url2); } } } catch (e) { console.log('Ошибка: ' + e); } } }
});
Присваивание значения переменной url2 вызывало исключение. После некоторых экспериментов я решил поменять способ инициализации переменной. И это стало выглядеть следующим образом:$("a[title='zamena']").each(function () { var url = $(this).attr("href"); var _BZnaniyId_ = url.indexOf('BZnaniyId='); if (_BZnaniyId_ > 0) { var BZnaniyId = parseInt(GetUrlKeyValue("BZnaniyId")); if (BZnaniyId > 1) { try{ var url1 = SP.Utilities.UrlBuilder.removeQueryString(url, "BZnaniyId"); if (typeof url1 != "undefined") { var url2 = updateQueryStringParameter("BZnaniyId", BZnaniyId, url1); if (typeof url2 != "undefined") { $(this).attr("href", url2); } } } catch (e) { console.log('Ошибка: ' + e); } } } });
Для инициализации переменной url2 я использовал другой метод чтения и редактирования строки запроса.
Реализация этого метода выглядит следующим образом:
function updateQueryStringParameter(key, value, uri) { var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf('?') !== -1 ? "&" : "?"; if (uri.match(re)) { return uri.replace(re, '$1' + key + "=" + value + '$2'); } else { return uri + separator + key + "=" + value; } }
В моем случае все прекрасно работает.
Публикую здесь информацию в надежде на то, что кому-нибудь информация будет полезной.
No comments:
Post a Comment