6

ユーザーが投稿した画像 URL に画像タグを追加するための jQuery の単純な正規表現関数があります。たとえばwww.example.com/image.jpg 、ユーザーが画像タグを投稿すると、ユーザーが URL をクリックしなくても画像を表示できるように、画像タグが追加されます。

var hostname = window.location.hostname.replace(/\./g,'\\.');
var re = new RegExp('(http:\\/\\/[^' + hostname + ']\\S+[\\.jpeg|\\.png|\\.jpg|\\.gif])','g');

$(".texthold ").each(function() {
    $(this).html($(this).html().replace(re, '<a href="$1"><img src="$1" /></a>')); 
});

画像を表示可能にする前に、画像のファイル サイズを確認するにはどうすればよいですか? たとえば、画像ファイルのサイズが 5MB を超える場合、画像は表示されず、代わりに URL が表示されます。

4

2 に答える 2

4
var url = ...; // here you build URL from regexp result

var req = $.ajax({
  type: "HEAD",
  url: url,
  success: function () {
    if(req.getResponseHeader("Content-Length") < 5 * 1048576) // less than 5 MB?
      ; // render image tag
    else
      ; // render URL as text   
  }
});
于 2013-06-01T23:52:49.870 に答える
1

画像に対するサーバーの応答に適切な Cross Origin Resource Sharing (CORS) ヘッダーと content-length ヘッダーが含まれている場合にのみ、目的を達成することができます。

さらに、置換ループで ajax リクエストが満たされるのに必要な時間を考慮する必要があります。

以下は、最終的なソリューションがどのようになるかを示す jQuery (1.9.1) の例です。これを機能させるには、適切な CORS ヘッダーを返すサーバーへのリンクを更新するか、ブラウザのセキュリティを無効にする必要があります。この例はjsfiddleにもあります。

var largeImage = "http://eoimages.gsfc.nasa.gov/images/imagerecords/49000/49684/rikuzentakata_ast_2011073_lrg.jpg";
var smallImage = "http://eoimages.gsfc.nasa.gov/images/imagerecords/81000/81258/kamchatka_amo_2013143_tn.jpg";
var urls = [largeImage, smallImage];
var maxSize = 5000000;

$.each(urls, function(index, value) {
    conditionalMarkupUpdater(value, maxSize);
});

var onShouldBeViewable = function () {
    alert('This is a small image...Display it.');
};

var onShouldNotBeViewable = function () {
    alert('This is a large image...Only provide the url.');
};

var onError = function() {
    alert('There was an error...likely because of CORS issues see http://stackoverflow.com/questions/3102819/chrome-disable-same-origin-policy and http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/"');
};

function checkSize(url) {
    var sizeChecker = new jQuery.Deferred();

    var onSuccess = function (data, textStatus, jqXHR) {
        var length = jqXHR.getResponseHeader('Content-Length');
        if (!length) {
            sizeChecker.reject("No size given");
        } else {
            sizeChecker.resolve(parseInt(length));
        }
    };

    var onFailure = function (jqXHR, textStatus, errorThrown) {
        sizeChecker.reject("Request failed");
    };

    $.when($.ajax({
        type: "HEAD",
        url: url
    })).then(onSuccess, onFailure);

    return sizeChecker.promise();
};

function conditionalMarkupUpdater(url, maxSize) {
    $.when(checkSize(url)).then(

    function (size) {
        if (size <= maxSize) {
            onShouldBeViewable();
        } else {
            onShouldNotBeViewable();
        }
    },

    function (status) {
        onError();
    })
};
于 2013-06-02T02:15:29.437 に答える