SharePoint 2010:通过jQuery跟踪文档链接点击并在自定义列表存改值
我之前在受限的SP2010+IE8环境下处理过几乎一模一样的需求,下面是经过验证的可行方案,分步骤拆解:
一、准备自定义跟踪列表
首先需要在SharePoint站点中创建一个自定义列表,用来存储点击数据,建议包含以下字段:
- 文档标题:单行文本,存储链接显示的文本内容
- 目标URL:单行文本,存储链接指向的真实外部/内部地址
- 点击次数:数字类型,默认值设为0,用于累计点击量
- 最后点击时间:日期时间类型,记录最近一次点击的时间
二、编写jQuery点击捕获与数据提交代码
注意:因为要兼容IE8,必须使用jQuery 1.12.x版本(这是最后一个支持IE8的jQuery大版本)。
1. 核心逻辑说明
- 定位所有“链接到文档”的元素:在SP2010中,这类链接的a标签通常会包含
onclick事件,或者父元素有特定的类标识(比如.ms-listlink结合列表项类型判断) - 捕获点击事件后,先提取链接的标题和真实目标URL
- 通过SharePoint的SP.js库(而非REST API,避免IE8兼容性问题)更新自定义列表的点击数据:如果该链接已存在则累加点击次数并更新时间,不存在则新增条目
2. 完整代码示例
// 确保页面加载完成且SP.js已加载 $(document).ready(function() { // 加载SP.js核心库 SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() { // 定位所有文档库中的"链接到文档"链接 // 这里的选择器需根据你的实际视图调整,比如.ms-listviewtable中的.ms-listlink $('.ms-listviewtable .ms-listlink').each(function() { var $link = $(this); // 提取真实目标URL:从onclick事件中解析,SP2010的链接到文档通常用NavigateTo函数 var onclickAttr = $link.attr('onclick'); var targetUrl = ''; var linkTitle = $link.text().trim(); // 解析onclick中的目标URL if (onclickAttr && onclickAttr.indexOf('NavigateTo') > -1) { // 匹配NavigateTo('xxx')中的URL部分 var urlMatch = onclickAttr.match(/NavigateTo\('([^']+)'\)/); if (urlMatch && urlMatch.length > 1) { targetUrl = urlMatch[1]; } } // 如果解析到目标URL,绑定点击事件 if (targetUrl) { $link.click(function(e) { // 先阻止默认跳转,等数据提交完成后再跳转 e.preventDefault(); var finalUrl = targetUrl; var title = linkTitle; // 调用自定义函数更新跟踪列表 updateClickTrackingList(title, finalUrl, function() { // 数据提交完成后跳转到目标地址 window.location.href = finalUrl; }); }); } }); }); }); // 自定义函数:更新点击跟踪列表 function updateClickTrackingList(docTitle, targetUrl, callback) { var clientContext = new SP.ClientContext.get_current(); var web = clientContext.get_web(); var list = web.get_lists().getByTitle('文档点击跟踪列表'); // 替换为你的列表名称 // 先查询是否已有该链接的记录 var camlQuery = new SP.CamlQuery(); camlQuery.set_viewXml( '<View><Query><Where><And>' + '<Eq><FieldRef Name="目标URL" /><Value Type="Text">' + targetUrl + '</Value></Eq>' + '<Eq><FieldRef Name="文档标题" /><Value Type="Text">' + docTitle + '</Value></Eq>' + '</And></Where></Query></View>' ); var listItems = list.getItems(camlQuery); clientContext.load(listItems); clientContext.executeQueryAsync(function() { var itemToUpdate; if (listItems.get_count() > 0) { // 已有记录,累加点击次数并更新时间 itemToUpdate = listItems.itemAt(0); var currentCount = itemToUpdate.get_item('点击次数'); itemToUpdate.set_item('点击次数', currentCount + 1); itemToUpdate.set_item('最后点击时间', new Date()); } else { // 无记录,创建新条目 var itemCreateInfo = new SP.ListItemCreationInformation(); itemToUpdate = list.addItem(itemCreateInfo); itemToUpdate.set_item('文档标题', docTitle); itemToUpdate.set_item('目标URL', targetUrl); itemToUpdate.set_item('点击次数', 1); itemToUpdate.set_item('最后点击时间', new Date()); } itemToUpdate.update(); clientContext.load(itemToUpdate); clientContext.executeQueryAsync(function() { // 回调函数,完成后跳转 if (callback) callback(); }, function(sender, args) { // 处理错误,即使提交失败也要允许跳转 console.log('更新跟踪数据失败: ' + args.get_message()); if (callback) callback(); }); }, function(sender, args) { console.log('查询跟踪列表失败: ' + args.get_message()); if (callback) callback(); }); }
3. 部署注意事项
- 将代码保存为.js文件,上传到SharePoint的Style Library或者Site Assets库
- 通过页面的内容编辑器Web部件或者母版页引用该脚本(确保先引用jQuery 1.12.x)
- 测试时注意IE8的兼容性,比如调试可以用IE8的开发者工具查看控制台错误
- 确保当前用户有自定义列表的添加/编辑权限,否则数据无法提交
三、额外优化建议
- 如果文档库视图有分页,需要在分页切换后重新绑定点击事件(可以监听SP的分页加载事件)
- 可以添加用户ID字段,跟踪不同用户的点击行为(需要额外获取当前用户信息)
- 考虑添加防抖机制,避免用户重复快速点击导致的重复提交
内容的提问来源于stack exchange,提问作者user2277052
相关产品推荐
相关产品推荐

