负载上的Sharepoint多行值

时间:2016-05-24 19:13:14

标签: javascript sharepoint sharepoint-2010

我正在尝试在初始加载编辑表单期间使用JavaScript捕获SharePoint表单的所有字段。不知何故,只有前两个多行字段被正确捕获。当我改变字段的顺序时,这是有效的。例如: 领域1 领域2 第3场

字段1& 2被捕获。

如果我更改它们出现的顺序: 领域2 领域3 第1场

字段2& 3被捕获。

这似乎不受代码本身的影响,而是与在SharePoint中加载有关。但无论如何这里是代码:

$(window).load(function()
{
if(document.readyState === 'complete')
{
    getFields();
    getValues();
    var myStatement =  $("textarea[Title='Problem Statement']").closest("span").find("iframe[Title='Rich Text Editor']").contents().text();
    var myScope =  $("textarea[Title='Scope']").closest("span").find("iframe[Title='Rich Text Editor']").contents().text();
}
});

我也在使用SPUtility来捕获价值,并且很难获得其他地方的支持。

SPUtility代码:

scope = SPUtility.GetSPField('Scope');
scopeVal = scope.GetValue();

在window.load期间,上述代码中的getFields()和getValues()中的上述代码都捕获了所有字段。

感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

每个字段都嵌入在包含以下HTML注释的<td>中:

<!-- FieldName="Field1"
         FieldInternalName="Field1"
         FieldType="SPFieldNote"
      -->

虽然您无法显式查询DOM以获取此注释,但您可以查询以获取表单上的所有字段,然后循环遍历它们,检查其innerHTML属性以查看它们是否包含所需的注释字符串。

通过这种方式,您可以确定任何所需字段的确切父<td>元素。这使您比使用jQuery的.closest()函数更精确。

要记住的另一件事是增强的富文本,富文本和纯文本多行字段每个都以不同的方式呈现,因此需要不同的查询选择器参数来获取它们的值。

以下示例代码获取内部名称为Field1,Field2或Field3的多行字段的值,并将值存储在对象中。

var richTextFieldNames = ["Field1","Field2","Field3"];
var richTextFieldValues = {};
var fieldRows = document.querySelectorAll(".ms-formtable td.ms-formbody");
for(var i = 0, len = richTextFieldNames.length; i<len; i++){
    currentFieldName = richTextFieldNames[i];
    for(var j = 0, jlen = fieldRows.length; j<jlen; j++){
        var currentRow = fieldRows[j];
        if(currentRow.innerHTML.indexOf("FieldInternalName=\""+currentFieldName+"\"") > -1){
            var element = currentRow.querySelector(".ms-rtestate-field[role=\"textbox\"]"); // enhanced rich text
            if(!element){
                var iframe = currentRow.querySelector("iframe[title=\"Rich Text Editor\"]");
                if(iframe){
                    element = iframe.contentDocument.querySelector("body"); // rich text
                }else{
                    element = currentRow.querySelector("textarea"); // plain text
                }
            }
            richTextFieldValues[currentFieldName] = element.innerText ? element.innerText : element.textContent;
            break;
        }
    }
}

然后可以使用数组或点表示法将值作为richTextFieldValues对象的属性进行访问,例如: var myScope = richTextFieldValues["Scope"];richTextFieldValues.Scope;(假设Scope是多行字段的内部名称)。