【问题标题】:Using javascript to loop through links on page and set target attribute使用 javascript 循环浏览页面上的链接并设置目标属性
【发布时间】:2017-12-14 14:19:45
【问题描述】:

我在 SharePoint 2010 中有一个文档库,该库将保存不同类型的文件:Word、Excel、PDF、HTML...

大多数文件类型在应用程序中打开。那些没有的,如 .htm 通讯,在同一个窗口中打开。 Sharepoint 文档库链接到文件,但不允许设置目标属性。

我想以编程方式设置这个 onload。

我已经开始尝试编写代码了:

for(var i = 0, l=document.links.length; i<l; i++) {
var id = document.links[i].href;
var idl = id.length;

if(idl >=7 ){

    var lastfour = id.substr(id.length - 4); 
    var lastfive = id.substr(id.length - 5); 

    if (lastfour == ".pdf"){
        //alert(document.links[i].href);
        document.links[i].setAttribute('target', '_blank');
        document.links[i].setAttribute('onfocus', 'return flase;');
    }


    if (lastfour == ".htm"){
        //alert(document.links[i].href);
        document.links[i].setAttribute('target', '_blank');
        document.links[i].setAttribute('onfocus', 'return false;');
    } 

    if (lastfive == ".html"){
        //alert(document.links[i].href);
        document.links[i].setAttribute('target', '_blank');
        document.links[i].setAttribute('onfocus', 'return false;');
    }  


}
}

这是有效的,因为它会导致链接在新窗口中打开,但也会在主窗口中打开。经过进一步研究,我发现 SharePoint 对链接做了一些古怪的事情:

<a onfocus="OnLink(this)" href="/Diocesan/2017 Diocesan Special Collection Calendar.pdf" onmousedown="return VerifyHref(this,event,'0','PdfFile.OpenDocuments','')" onclick="return DispEx(this,event,'TRUE','FALSE','FALSE','','0','PdfFile.OpenDocuments','','','','1210','0','0','0x400001f07fbf1bff','','')">2017 Diocesan Special Collection Calendar</a>

我认为我的问题是由于设置了 onfocus 属性或者可能是 onclick。我不确定发生了什么。我应该尝试设置 onmousedown、onclick 和 onfocus = "" 吗?

【问题讨论】:

标签: jquery sharepoint


【解决方案1】:

SharePoint 在当前窗口中打开它的原因与附加到 &lt;a&gt; 元素的 OnClick 事件侦听器有关。它调用的DispEx()函数用于检测用户是否有相应的应用程序可以打开文件,如果可能的话,使其在正确的Office应用程序中打开Office文件(而不是下载文件并提示用户保存或打开)。

方便的是,OnClick 事件通过 HTML 中的 onclick 属性内联附加,因此您可以通过破坏该属性中的值来规避此行为。

 var links = document.querySelectorAll("a");
 for(var i = 0, len = links.length; i < len; i++){
      links[i].target = "_blank";
      links[i].onclick = "return false";
 }

缺点是 SharePoint 将不再执行其花哨的步骤来尝试在正确的应用程序中打开文件。

为了解决这个问题,如果您知道要在新窗口中打开哪些类型的文件,则可以在弄乱targetonclick 属性之前执行额外的检查。

例如,假设您希望所有 .htm、.pdf 和 .txt 文件在新窗口中打开,但您希望保持其他文件类型的行为不变。

以下代码在更改点击行为之前检查文件名是否包含指定的文件类型之一。

 var links = document.querySelectorAll("a");
 for(var i = 0, len = links.length; i < len; i++){
      var link = links[i].href;
      if(link.indexOf(".htm") & link.indexOf(".pdf") & link.indexOf(".txt") >= 0){
          links[i].target = "_blank";
          links[i].onclick = "return false";
      }
 }

可以通过检查文件名是否以指定的文件扩展名结尾而不是将它们包含在其 URL 中的任何位置来改进代码。

 var links = document.querySelectorAll("a");
 for(var i = 0, len = links.length; i < len; i++){
      var link = links[i].href;
      if(endsWith(link,".htm") || endsWith(link,".pdf") || endsWith(link,".txt")){
          links[i].target = "_blank";
          links[i].onclick = "return false";
      }
 }
 function endsWith(text,target){
    return text.indexOf(target) == text.length - target.length;
 }

【讨论】:

  • 我在您修改的最后一个文本块中添加了一些警报命令,以便在新窗口中加载 .htm 和 .html 链接。警报命令永远不会执行,并且链接在主窗口中加载而不是新的。也许我需要做一些特别的事情才能在页面加载完成后执行代码?
  • 是的。从第一行删除 [Field='LinkFilename'] 并按预期触发。您可能需要编辑您的答案,以便我将其标记为答案。
  • 很抱歉给您带来了困惑!这只是一个示例 CSS 选择器,用于从列表视图 Web 部件的名称字段(假设该字段已公开)中获取链接,而不是获取页面上的所有链接,但我可以将其删除并使其通用,如果你喜欢。
  • 感谢您的帮助。我最终遍历了页面上的所有链接,并且只使用了 .htm &.html 文件。这可以正常工作,因为网站页面是 .aspx,因此不受影响。其他文件(如 PDF 和办公文档)在应用程序中打开。
猜你喜欢
  • 2014-09-23
  • 2012-05-25
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
相关资源
最近更新 更多