SharePoint 2013 擴展查閱項功能


  SharePoint 2013的查閱項功能,就是可以擴展其他列表字段為當前列表選項,但是選項太多的時候,會造成選擇起來非常麻煩,所以,我們采取JS+Ajax的方式,改善一下這個展示,使操作更加方便。

展現效果

  如下圖,當我在Textbox里輸入北京,會把北京開頭的選項,加載到下拉選項中,如果什么都不輸入,就是全部下拉選項,這樣比較方便選項多的時候,進行篩選選擇;

clip_image001

原理介紹

1、 使用JS隱藏原來的Select控件;

  使用F12查看Select的Html代碼,發現有Title是字段名,還有id屬性,而option的value就是該item的id,所以,我們可以使用JS來操作這個select,如下圖;

clip_image002

  隱藏Select的JS腳本,就是獲取所有的select控件對象,然后找到title相符合的,當然你也可以根據id來獲取,id的格式應該是內部字段名稱+列表GUID+字段類型標識,看你的習慣了,附JS腳本如下:

function HiddenField(strSelectTitle)
{
    var selectObj = document.getElementsByTagName("select");
    for(var i=0;i<selectObj.length;i++)
    {
        if(selectObj[i].title==strSelectTitle)
        {
            selectObj[i].style.display='none';
        }
    }
}
setTimeout("HiddenField('所在城市')",1)

2、 使用JS在原來Select位置下面,添加一個Text類型Input,輸入文字;

  這一步主要是在找到的select節點以后,使用parentNode找到父節點,然后在父節點的innerHTML里加入我們需要的Input,JS腳本附后:

if(selectObj[i].title==strSelectTitle)
{
    selectObj[i].style.display='none';
    var Par=selectObj[i].parentNode;
    Par.innerHTML=Par.innerHTML + "<table width='135' style='background-color:white' border='0' cellspacing='0' cellpadding='0'><tr><td><table width='100%' bordercolor='#666666' border='0' cellspacing='0' cellpadding='0' style='border-collapse:collapse;cursor:default' onclick='showHide()'><tr><td align='center'><input type='text' name='C_Select' id='C_Select' onpropertychange='vChange()'></td></tr></table></td></tr><tr><td><div id='oOption' onselectstart='return false'></div></td></tr></table>";
}

3、 添加下拉菜單;

  以下主要就是你JS腳本,放在頁面上就可以,沒有什么特別需要說明的地方。當然,我們可以在相關事件上,添加我們需要的代碼段。

特別:這些腳本是百度上查到的,但是他也是轉載,沒有原文鏈接,所以沒有附后;

<!--隱現層的函數-->

<script type="text/javascript">
function showHide(obj){
    sh={block:"none",none:"block"}
    //層的display屬性值在"block"和"none"間不斷輪換,
    //達到輪換隱藏和顯示的效果
    oOption.runtimeStyle.display=sh[oOption.currentStyle.display]
}
</script>

<!--鼠標移上id為oOption的對象時執行本段代碼-->

<script event="onmouseover" for="oOption">
    obj=event.srcElement
    
    //判斷onmouseover事件是否發生在單元格上
    if(obj.tagName=="TD"){
    
    //設置事件發生所在的單元格的背景顏色
    obj.style.backgroundColor="#dedede"
    
    //設置事件發生所在的單元格的字體顏色
    obj.style.color="#FFFFFF"
}
</script>

<!--鼠標從id為oOption的對象上移開時執行本段代碼-->

<script event="onmouseout" for="oOption">
    obj=event.srcElement
    //判斷onmouseout事件是否發生在單元格上
    if(obj.tagName=="TD"){
    //設置事件發生所在的單元格的背景顏色
    obj.style.backgroundColor="#FFFFFF"
    //設置事件發生所在的單元格的字體顏色
    obj.style.color="#000000"
}
</script>

<!--id為oOption的對象被單擊時執行本段代碼-->

<script event="onclick" for="oOption">
    obj=event.srcElement
    //判斷onmouseover事件是否發生在單元格上
    if(obj.tagName=="TD"){
        showHide()//隱藏層
        //設置id為oSelect的對象內的文本為被點擊的單元格內的文本
        document.getElementById("C_Select").innerText=obj.innerText
        var selectObj=document.getElementsByTagName('SELECT');
        for(var i=0;i<selectObj.length;i++)
        {
            if(selectObj[i].title=="所在城市")
            {
                var objvalue=obj.id.substring(8,obj.id.length);
                selectObj[i].value=objvalue;
            }
        }
    }
</script>

4、 寫Ajax根據Input的值變化,更新下面的下拉結果;

<!—Ajax更新方法,將更新的Table放到Id為oOption的div里-->

function ajax() {
    //創建XMLHttpRequest對象
    var xmlHttp = new XMLHttpRequest();
    //獲取值
    var k = escape(document.getElementById("C_Select").value);
    var url = "http://10.5.97.92/GetLookUpAjax/GetData.aspx?k=" + k;
    //配置XMLHttpRequest對象
    xmlHttp.open("get", url);
    //設置回調函數
    xmlHttp.onreadystatechange = function () {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
        document.getElementById("oOption").innerHTML = xmlHttp.responseText;
    }
    }
    //發送請求
    xmlHttp.send(null);
}

<!—監視Input值變化,如果變化則執行ajax方法更新下拉列表-->

  這個方法利用Input的onpropertychange事件,但是這個時間每有一個鍵盤動作,就會執行一次,所以我用一個隱藏域存上一次的Value的Length,和這一次比較,不一樣的話執行Ajax事件,否則就當做輸入但是Input域的Value值並沒有變化。

function vChange()
{
    document.getElementById("hiddenNum").value=document.getElementById("C_Select").value.length;
    if(document.getElementById("C_Select").value.length>document.getElementById("hiddenNum").value.length)
    { 
        ajax(); 
    }
}

5、 開發一個Ajax訪問的頁面,返回相關結果;

  這個方法沒有太多要說明的,記得提升權限;利用Caml語句,獲取與傳入值匹配的項目集合,拼成Table返回,提供Ajax使用。

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    //此處放置需要以系統賬號身份運行的代碼
    using (SPWeb web = new SPSite("http://10.10.10.11").OpenWeb())
    {
        SPQuery query = new SPQuery();
        if (k != string.Empty)
        {
            query.Query = @"<Where>
                          <BeginsWith>
                             <FieldRef Name='Title' />
                             <Value Type='Text'>" + HttpUtility.UrlDecode(k) + @"</Value>
                          </BeginsWith>
                       </Where>";
        }
        else
        {
            query.Query = "";
        }
        
        SPListItemCollection itemcoll = web.Lists["City"].GetItems(query);
        if (itemcoll.Count != 0)
        {
            rev = "<table cellsapcing=‘0‘ cellspadding=‘3‘ border=‘0‘ width=‘100%‘> ";
            foreach (SPListItem item in itemcoll)
            {
                rev = rev + "<tr><td id=myselect" + item["ID"].ToString() + ">" + item["Title"].ToString() + "</td></tr>";
            }
            rev = rev + "</table> ";

        }
    }
});
View Code

  整個功能的原理如上所示,利用JS替換頁面的標簽,變為自己的Input+下拉列表(div模擬),並監聽Input的值變化,變化時通過Ajax更新div下拉列表,選擇下拉列表,更新Input同時使用JS腳本更新隱藏的自帶查閱項的Value值,完成我們的效果。

  功能十分簡單,代碼段也沒有難度,就是簡單介紹的一個小例子,給有相關需求的人一個參考;也算自己對於SharePoint 2013里使用Ajax的一個練習吧,希望在實踐中提高自己的能力。

Ø 完整的Ajax實例

http://www.cnblogs.com/oneword/archive/2011/06/04/2072558.html

Ø 使用div 模仿下拉框

http://hi.baidu.com/wangtanbao/item/6debfe0f6ae8ab21a0312d27


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM