2016-05-24 20 views
0

編集フォームの最初の読み込み時に、JavaScriptを使用してSharePointフォームのすべてのフィールドを取得しようとしています。何とか、最初の2つのマルチラインフィールドだけが適切にキャプチャされています。フィールドの順序を変更すると、これは機能します。例えば: フィールド1つのフィールド2 フィールド3つのSharepoint複数行の値ロード時

フィールド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(); 

フィールドのすべてが(れるGetFields上記コードごと取り込まれている)とでgetValues()はwindow.load間に上記のコードで呼ばれます。

何か助けやアドバイスをいただければ幸いです。

答えて

0

すべてのフィールドは、次のHTMLコメントが含まれていること<td>に埋め込まれている:

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

あなたが明示的にこのコメントのためのDOMを照会することはできませんが、フォーム上のすべてのフィールドを取得するために照会することができますし、それらをループしてinnerHTMLプロパティをチェックし、目的のコメント文字列が含まれているかどうかを確認します。

これにより、任意のフィールドに正確な親の<td>要素を指定することができます。これにより、jQueryの.closest()関数を使用するよりも正確にすることができます。

強化されたリッチテキスト、リッチテキスト、およびプレーンテキストの複数行フィールドがそれぞれ異なる方法でレンダリングされるため、値を取得するために異なるクエリセレクタパラメータが必要になります。

次のコード例は、内部名がField1、Field2、またはField3の複数行フィールドの値を取得し、その値をオブジェクトに格納します。値は、その後、例えば、アレイまたはドット表記法を使用してrichTextFieldValuesオブジェクトのプロパティとしてアクセスすることができる

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; 
     } 
    } 
} 

var myScope = richTextFieldValues["Scope"];またはrichTextFieldValues.Scope;(Scopeは複数行フィールドの内部名です)。

+0

これは期待通りに機能していますが、私が 'richTextFieldValues'で値を呼び出そうとしたときを除いて、あなたが言及した2つの方法のいずれかで、私は定義されません。実際、私は 'displayVal = richTextFieldValues [" \ "" + currentFieldName + "\" "];'を使用しています。何か案は? – Ryan

+0

Hmm ... 'JSON.stringify'を使って' richTextFieldValues'にどのような値が格納されているかを確認しましょう。 'alert(JSON。stringify(richTextFieldValues)); – Thriggle

+0

この結果は、{"FieldName1": "FieldName1Value"、 "FieldName2": "FieldName2Value"}になります。 7つのフィールドがあります。だから私は最初の2つのフィールドだけをキャプチャするという同じ問題に取り掛かっています。これはページロードでのみ発生し、私はPreSaveAction()関数を持ち、すべての値を完全に取得します。 – Ryan

関連する問題