【问题标题】:$("")[0].click(); not working after ajax called$("")[0].click(); ajax调用后不工作
【发布时间】:2016-02-17 16:27:37
【问题描述】:

我会在调用ajax生成链接后模拟点击下载文件。

jQuery :

$(document).ready(function(){
    $(".vignette-dl").click(function() {
        var id = $(this).find("a").attr("value");
        $.ajax({
            type: "POST", 
            url: "testDL.php",
            data: { dossier: $("#selectDossier").val(), id_doc: id },
            success: function(result){
                $("#secretDiv").html(result);
            }
        });

        $(document).ajaxComplete(function(){
            alert("test");
            $("#forcedl")[0].click(function(){
                alert("test42");
            }); 
        });
    });
});

result var 在 secretDiv 中添加一个 id="forcedl" 的 html 链接并完美运行。

ajaxComplete 函数被调用是因为我看到了我的警报测试,但是点击模拟不起作用并且我没有看到警报 test42。

我不知道为什么..

【问题讨论】:

  • 你为什么使用 [0]?
  • 您正在尝试附加事件处理程序,而不是触发事件
  • @RoryMcCrossan 您应该将其添加为答案。还有 OP,请参阅文档:api.jquery.com/click
  • $("#forcedl").trigger('click');$("#forcedl").on('click',function(){ alert("test42"); }); 不确定您在尝试什么,但最后一个会在每个 ajaxComplete 上添加新的事件处理程序,所以不好。
  • alert($("#forcedl").length); 放在ajaxComplete 函数顶部的结果是什么? alert(JSON.stringify(result)); 在你的成功功能中还有什么作用?

标签: jquery ajax click


【解决方案1】:

jQuery.click(handler) 仅在单击元素时调用处理程序。

$(document).ready(function(){
    $(".vignette-dl").click(function() {
        var id = $(this).find("a").attr("value");
        $.ajax({
            type: "POST", 
            url: "testDL.php",
            data: { dossier: $("#selectDossier").val(), id_doc: id },
            success: function(result){
                $("#secretDiv").html(result);
                $("#forcedl").click();
            }
        });
    });
    $(document).on('click', '#forcedl', function(e) {
        e.preventDefault();
        window.location.href = $(this).attr('href'); // use href-attribute or just replace with your path/to/file
    })
});

为了下载 PDF,您需要更改 Response-Header - 这必须在服务器端完成。 参见下面的 .htaccess 示例,它将使所有以 .pdf 结尾的文件以任何大小写形式直接下载。

<FilesMatch "\.(?i:pdf)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

对于 php 示例,请查看下面的代码示例。

<?php
header('Content-type: application/pdf');
header('Content-disposition: attachment; filename=myNewFileName.pdf');
readfile("uri/to/my/file.pdf");

【讨论】:

  • 我猜你的问题是不同的: .click() 只模拟JavaScript事件,它实际上并没有点击元素。尝试将其替换为 window.location.href = '/path/to/my/file'; 我编辑了我的答案。
  • 不工作了,我在 chrome 和 ie11 中试过了。在 secretDiv 中带有 id="forcedl" 的 html 链接添加了 dinamiccaly 并且工作正常但不能下载
  • 我尝试在 e.preventDefault() 之后添加一个警报,但它没有出现
  • 啊,所以您在 ajax 调用中插入了#forcedl 元素。检查我更新的答案。
  • 好的,这样更好,pdf出现在网页上:)但我需要强制下载而不查看它
【解决方案2】:

从你的描述我相信这是愿望,但我做了一些假设。

$(document).ready(function() {
  $("#secretDiv").on('click', "#forcedl", function() {
    alert("test42");
  });
  $(".vignette-dl").click(function() {
    var id = $(this).find("a").attr("value");
    $.ajax({
      type: "POST",
      url: "testDL.php",
      data: {
        dossier: $("#selectDossier").val(),
        id_doc: id
      }
    }).done(function(result) {
      $("#secretDiv").html(result);
    }).complete(function() {
      alert("test");
      $("#forcedl").trigger('click');
    });
  });
});

【讨论】:

  • 这和我的代码结果一样,trigger('click') not working :/
【解决方案3】:

整个方法是不合逻辑的,你不能有以下 -

成功 -> 点击。

解决办法,创建一个变量设置为 = 0。

关于 ajax 成功方法 make variable = 1.

if === 0 {
 // nothing here
}else{
  // must ===1 something here
}

比其他人的想法快得多

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多