0

AJAX を使用して a[href$='.pdf'] の値を変更することは可能ですか? いくつかのリンクがあるページがあります。リンクされたすべての PDF の先頭に「/download.php?file=」を挿入して、ブラウザで開く代わりにダウンロードを強制する必要があります。

これは JS/jQuery だけで実行できることはわかっていますが、AJAX で実行する必要があります。私はこれまで AJAX をあまり使ったことがなく、Google で答えを探してもうまくいきません。以下は、オンラインで調べて思いついたコードですが、何もしていません。それが可能かどうかはわかりません。

$(function (){
var collID = document.location.pathname.match(/[^\/]+$/)[0];
    collID = collID.substring(0, collID.length - 5);
    $("a[href$='.pdf']").each(function () {
        $.ajax ({
            type: 'POST',
            dataType: 'json',
            success: function() {
                $(this).attr("href", "/download.php?file=collections/ms/" + collID + "/" + curA);
            }               
        }); 
    });
});

更新: PDF のサイズを挿入するために既に AJAX を少し使用しているため、これには AJAX を使用するように勧められました。jQuery を使用して href 値を変更すると、ファイルへの直接リンクではなくなるため、ファイル サイズを挿入するビットが機能しなくなります。これがそのコードです。

 function hdrDetails(i, elm, cl) {
    cl = cl / 1024;
    //divide content-length by 1024 (KB)
    var sz = cl > 1024 ? "MB" : "KB";
    //if cl is still big, set to MB
    cl = cl > 1024 ? cl / 1024 : cl;
    //if cl is still big, divide again
    var len = $(elm).eq(i).text().length;
    //check the link's text length
    if (len > 0) {
        //add a file size
        var $e = $(elm).eq(i);
        var t = $e.text();
        $e.html(t.slice(0, -1) + "<span class=\"size\"> (" + cl.toFixed(2) + " " + sz + ")</span>" + t.slice(-1));
    }
}
$(function () {
    var elm = "a[href$='.pdf']," + //only the file types we want
    "a[href$='.doc']," + "a[href$='.ppt']," + "a[href$='.xls']," + "a[href$='.docx']," + //don't forget 2007 versions
    "a[href$='.pptx']," + "a[href$='.mht']," + "a[href$='.xlsx']";
    $(elm).each(function (i, e) {
        if (e.hostname && e.hostname == location.hostname) {
            $.ajax({
                type: "HEAD",
                url: $(this).attr("href"),
                complete: function (xhr, textStatus) {
                    var cl = xhr.getResponseHeader("content-length");
                    if (textStatus == "success") {
                        var cl = xhr.getResponseHeader("content-length");
                        hdrDetails(i, elm, cl);
                        //call the calculation fn
                    } else {
                        var $e = $(elm).eq(i);
                        var t = $e.text();
                        $e.html(t.slice(0, -1) + "<span class=\"size\"> (File Not Found)</span>" + t.slice(-1));
                    }
                }
            });
        }
    });
});
4

1 に答える 1

1

コードで呼び出しが必要な理由がわかりません$.ajax... JavaScriptを介してアンカータグを修正できるようにするために必要なデータがサーバーにありますか? これが、AJAX 呼び出しが必要であることがわかった唯一の理由です。また、AJAX 呼び出しを行うときは、通常、jQuerysuccess関数に渡されるパラメーターである応答を使用します。使用していないため、AJAX 呼び出しは必要ないようです。

余談ですが、ループ (.each()はループ) から AJAX 呼び出しを行うことは一般的に悪い習慣です。ループ内で AJAX 呼び出しを行うと、サーバーに大きな負荷がかかる可能性があります。必要なデータを取得するには、1 つの大きなバッチ リクエスト/レスポンスを実行することをお勧めします。

于 2013-10-25T14:42:26.140 に答える