惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hacker News: Front Page
S
Secure Thoughts
N
News | PayPal Newsroom
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Threatpost
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
A
Arctic Wolf
Cisco Talos Blog
Cisco Talos Blog
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
NISL@THU
NISL@THU
H
Heimdal Security Blog
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler
The Hacker News
The Hacker News
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
小众软件
小众软件
V
V2EX
K
Kaspersky official blog
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
Cisco Blogs
S
Schneier on Security
Recorded Future
Recorded Future
阮一峰的网络日志
阮一峰的网络日志
AI
AI
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
I
InfoQ
G
Google Developers Blog
博客园_首页
Hugging Face - Blog
Hugging Face - Blog

博客园 - 陈典洪

ASP.NET生成Excel文件的历程总结 C# Excel操作类 SharePoint 2010 安装部署 用VSTA动态改变infopath数据源查询参数与反回查询结果 将excel2003转换为excel2007格式 用VS2010为SharePoint 2010 添加Ribbon自定义按钮 在sql server 中如何移动tempdb到新的位置 禁用MOSS2007“我的网站”功能 使用Exchange 2007搭建多域名邮件系统 Exchange 2007 配置 如何简化Exchange 2007 OWA URL访问 MOSS中自定义WebService与客户端应用 将项目从vs2008转到Vs2005的办法 如何控制列表视图栏位的宽度? WSS(MOSS)如何修改Rich文本编辑器的宽度 WSS 3.0 and MOSS 2007 SDK 更新到了1.5版本啦 moss 自定义文档库文档图标 - 陈典洪 - 博客园 moss 列表类型和对应类型编号 MOSS LIST的一些属性说明
[转载]利用MOSS文档库自制一个山寨版mp3在线播放器 - 陈典洪 - 博客园
陈典洪 · 2009-10-23 · via 博客园 - 陈典洪

本文转载自“利用MOSS文档库自制一个山寨版mp3在线播放器 "

前几天突然心血来潮,看到别人做了一个利用文档库实现在线视频播放,我就想,定制一下文档库的下拉菜单,就是下图,来实现mp3的在线播放。

先看一下做完后的效果吧。

定制完后的下拉菜单只有试听这一项,当点击试听后,弹出一个小的播放页面,类似于大家非常熟悉的百度mp3试听,如图:

      这个新小页面我一点样式都没加,非常丑,但既然是自己做的,可以任意BT定制,这个在后面有时间的时候我再来美化一下。
      首先来看一下怎么来自定义文档库的下拉菜单。这部分内容,最早是参考otec老杜的一篇文章,当时只是想修改一下下拉菜单里的条目名称,这个东西是完全在前台实现的, 并且sharepoint提供了JS接口去修改它,只需要在页面上添加一段JS,通常用一个内容编辑器就可以很容易的做到。
  比如如果自定义文档库列表的话, 就放一个Custom_AddDocLibMenuItems方法
如果是普通列表的话, 就放一个Custom_AddListMenuItems方法
举个例子来说:
<script language='javascript'>
function Custom_AddListMenuItems(m, ctx)
{
  var menuOption;
  strDisplayText="Say Hello";
  strAction="javascript:alert('Hello!')";
  strImagePath=ctx.imagesPath+"exptitem.gif";
  menuOption=CAMOpt(m, strDisplayText, strAction, strImagePath, null, 550);
  menuOption.id="ID_Custom";
  return true;
}
</< SPAN>script>
这个方法会去掉下面webpart的默认菜单项, 并且添加一个Say Hello菜单项, 点击后alert
CAMOpt是内置的创建菜单项的方法
第二个参数指定名称, 第三个指定一个action(javascript函数), 第三个指定image(没有写"")
第四个指定image的alt属性, 第五个是菜单项的顺序编号
如果Custom_AddListMenuItems返回true, 那么不会创建默认的那些菜单项
如果返回false或者不些return语句, 默认的那些菜单项还在,前段时间有人问怎么将列表的下拉菜单去掉,我就给他一句代码,在Custom_AddListMenuItems里return true就可以了。
  接下来是怎样通过JS来取得对应的mp3名字,并传给试听页面以及试听页面的相关处理过程。思路类似于实现单点登陆,首先来创建一个试听页面,这个页面接受一个参数,然后生成一个mp3的绝对路径,并赋值给播放器控件,这样就可以播放mp3了。如果是视频的话,同样也可以用这种方式来实现在线播放。
首先来看一下给定制的下拉菜单绑定处理事件。完整的JS代码如下:
<script language='javascript'>
function Custom_AddDocLibMenuItems(m, ctx)
{
var menuid= m.id.split('_')[0];
var url=document.getElementById(menuid).Url;
var menuOption;  
strDisplayText="试听";
strAction="javascript:CreateMp3('"+url+"')";
strImagePath=ctx.imagesPath+"exptitem.gif";
menuOption=CAMOpt(m, strDisplayText, strAction, strImagePath, null, 550);  
menuOption.id="ID_Custom";
return true;
}
function CreateMp3(url)
{
   var mp3url="/_layouts/mp3.htm?p="+url.split('/')[3];
   openpage(mp3url);
}
function openpage(htmlurl) 
{
        var newwin=window.open(htmlurl,"newWin","toolbar=no,location=no,directories=no,status=no,scrollbars=yes,menubar=no,resizable=no,top=100,left=200,width=400,height=200");
        newwin.focus();
        return false;
 }
</script>
解释一下,首先在Custom_AddDocLibMenuItems中,为“试听”选项绑定了一个事件,strAction="javascript:CreateMp3('"+url+"')";,CreateMp3方法接受一个参数url,即为当前选中的mp3的名城,通过document.getElementById(menuid).Url;来获得,然后在CreateMp3中拼凑形成试听地址,并将这个名称传递给它,这样再调用openpage方法,打开试听页面并适当的修改一下试听窗口的属性,如大小,导航菜单不可见等等。
然后再来看一下试听页面的处理过程。完整的页面代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; CHARSET=utf-8" />
    <meta name="Robots" content="NOINDEX, NOFOLLOW" />
    <title>MP3试听</title>
    <script type="text/javascript">   
    function getParameter(queryString, parameterName)
    {
      var parameterName = parameterName + "=";
      if (queryString.length > 0) {
        begin = queryString.indexOf(parameterName);
        if (begin != -1) {
            begin += parameterName.length;
            end = queryString.indexOf("&", begin);
            if (end == -1) {
                end = queryString.length;
            }
            return unescape(queryString.substring(begin, end));
        }
        return "null";
     }
    }
        function playList_dblClick(){
         var queryString = window.location.search.substring(1);
         var mp3url='文档库地址'+getParameter(queryString,'p');
         
         MediaPlayer1.detachEvent("PlayStateChange",checkPlayStatus);
         MediaPlayer1.fileName=mp3url;
         MediaPlayer1.play();
         setTimeout('MediaPlayer1.play();MediaPlayer1.attachEvent("PlayStateChange",checkPlayStatus);',1000);
        }
        function init(){
         MediaPlayer1.AutoRewind=false;
         MediaPlayer1.AutoStart=true;
         MediaPlayer1.SendPlayStateChangeEvents=true;
         MediaPlayer1.attachEvent("PlayStateChange",checkPlayStatus);
        }

        function checkPlayStatus(oldState,newState){
         try{
          if(MediaPlayer1.PlayState==0){
           MediaPlayer1.detachEvent("PlayStateChange",checkPlayStatus);
           MediaPlayer1.stop();
           if(playList.options.selectedIndex<playList.options.length-1){
            playList.options[playList.options.selectedIndex+1].selected=true;
           }else{
            playList.options[0].selected=true;
           }
           MediaPlayer1.fileName=playList.value;
           MediaPlayer1.play();
           setTimeout('MediaPlayer1.play();MediaPlayer1.attachEvent("PlayStateChange",checkPlayStatus);',1000);
          }
         }catch(e){}
        }
</script>
</head>
<body onload="playList_dblClick();">
<object classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" id="MediaPlayer1" width="286" height="225" STANDBY="Loading Windows Media Player components..." TYPE="application/x-oleobject">
    <param name="AudioStream" value="-1"/>
    <param name="AutoSize" value="-1"/>
    <!--是否自动调整播放大小-->
    <param name="AutoStart" value="0"/>
    <!--是否自动播放-->
    <param name="AnimationAtStart" value="-1"/>
    <param name="AllowScan" value="-1"/>
    <param name="AllowChangeDisplaySize" value="-1"/>
    <param name="AutoRewind" value="0"/>
    <param name="Balance" value="0"/>
    <!--左右声道平衡,最左-9640,最右9640-->
    <param name="BaseURL" value>
    <param name="BufferingTime" value="15"/>
    <!--缓冲时间-->
    <param name="ClickToPlay" value="-1"/>
    <param name="CursorType" value="0"/>
    <param name="CurrentPosition" value="0"/>
    <!--当前播放进度 -1 表示不变,0表示开头 单位是秒,比如10表示从第10秒处开始播放,值必须是-1.0或大于等于0-->
    <param name="CurrentMarker" value="0"/>
    <param name="DisplayBackColor" value="0"/>
    <param name="DisplayForeColor" value="16777215"/>
    <param name="DisplayMode" value="0"/>
    <param name="DisplaySize" value="0"/>
    <embed src="-1.mp3" width="286" id="m1" height="225" autostart="0"></embed>
</object>
</body>
</html>
在body的onload事件中,调用playList_dblClick()方法,它会取得传递过来的mp3名称,并通过var mp3url='文档库地址'+getParameter(queryString,'p');这种方式来拼成mp3在文档库中的绝对地址,并赋值给播放器,然后播放,MediaPlayer1.fileName=mp3url;
MediaPlayer1.play();,这样,就可以试听mp3了。
    到此为止,山寨版mp3在线播放器就做完了,比较原始,纯粹是闲的。