【问题标题】:How to check link is available or not using Jquery如何使用 Jquery 检查链接是否可用
【发布时间】:2019-05-29 15:52:36
【问题描述】:

在我的 Asp.net MVC 应用程序中,我使用 Jquery 数据表来显示数据。我的问题是在这里你可以看到我使用数据表中的链接来打开文件。当文件在下载文件夹中不可用时显示 404 服务器错误,而不是我需要指向另一个页面。如何检查此数据表中的文件是否可用。文件类型为.html

<script>

    $("#cribTable").DataTable({

        "ajax": {

            "url": "/CribManual/GetAllDownloadedCribs",
            "type": "GET",
            "processing": true,
            "datatype": "JSON",
            "serverSide": true
        },
        "columns": [
            {
                "data": "ID", "render": function (data) {

                    return `<button type="button"  data-toggle="confirmation" data-title="Are you sure?" href='@Url.Action("DeleteCrib", "CribManual")/${data
                        }'" class="btn btn-danger">Delete</button>`;
                },

                orderable: false
            },
            { "data": "CUS_NAME" },
            { "data": "CUS_NIC" },
            { "data": "STATUS" },
            { "data": "LOCATION" },
            {
                "data": "LOCATION", 'render': function (data, type, full, meta) {
                   return '<a href="/Downloads/' + data + '">Read File</a>';
                }
            }
        ]

    });

</script>

【问题讨论】:

  • 如果您从服务器上的脚本获取链接,我建议该脚本返回 NULL 值或其他值,这样就不会创建链接。或者,如果data 不包含正确的值,则链接到另一个值。

标签: jquery datatables


【解决方案1】:

不建议使用此解决方案,但您可以在执行 AJAX 调用时捕获错误代码。参考:Capture 404 status with jQuery AJAX

这可能看起来像这样:

{
  "data": "LOCATION",
  "render": function (data, type, full, meta) {
    var dUrl = "/Downloads/" + data;
    var result = $("<a>").html("Read File");
    $.ajax({
      cache: false,
      url: dUrl,
      success: function(dat, stat, xhr){
        result.attr("href", dUrl);
      },
      error: function (xhr, stat, err){
        if(xhr.status==404) {
          result.attr("href", "#").addClass("no-file");
        }
      }
    });
    return result.prop("outerHTML");
  }
}

DoS 警告 这将为表中呈现的每个文件生成一个 HTTP 请求。如果是 3 或 4,您的 Web 服务器将能够处理它。但是,如果它是 10、50、100、500、1000 等等等等,那么您本质上就是对您的 Web 服务器执行拒绝服务攻击。大多数 Web 服务器都配置为允许 10 个同时连接到服务器。您可以在配置中进行设置,但最终可能会耗尽资源。

服务器可能无法打开和关闭足够多的套接字来处理所有请求,并将开始对它们进行排队。这将导致浏览器必须等待更长的时间才能执行脚本,并可能导致超时。根据列表的大小,浏览器可能会开始消耗更多的内存资源,并且可能会锁定或崩溃。

再次,我强烈建议让服务器端脚本完成繁重的工作。如果该项目在服务器上不存在,则它不应该返回数据,或者它应该返回一个 Datatable 可以使用而无需执行大量潜在威胁工作的值。

这是来自经验而非理论。

希望对您有所帮助。

【讨论】:

  • 谢谢,我试过你的代码,但链接(“读取文件”)不可点击。
  • @Adam 您在控制台中看到任何警报吗?还要查看网络部分,看看它是否在进行 AJAX 调用以及结果是什么。
  • 请查看此图片。 i.imgur.com/lK0w3VJ.png 我将这一行更改为 var result = $("a").html("Read File"); 现在链接是可点击的。但问题是所有锚标记都重命名为Read File。如果一个文件丢失了数据表中的所有链接,则作为 else 选项。
  • 如果所有文件都在特定位置可用。打开该文件的所有链接都显示为第一个文件位置。有链接是错误的。例如,如果我点击第二条记录读取文件链接,它打开的第一个文件链接,与其他记录相同
  • @Adam 在我的回答中,我指的是$("&lt;a&gt;"),它创建了一个新元素。您的代码引用了$("a"),它是具有&lt;a&gt; 的所有元素的选择器。它们非常不同。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2022-11-09
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多