2011-06-28 14 views
4

最終的なイメージが表示されるページにimgタグがある場合は、302リダイレクトの後に来ます。リダイレクト後に最終的なURLを得るためのjavascriptがありますか? img.srcでjavascriptを使用すると、リダイレクト先のURLではなく、最初のURL(ページ内の内容)が取得されます。javascriptを使用して、img srcの302リダイレクト後に最終結果URLを取得するにはどうすればよいですか?

がここにjsfiddleイラストです:http://jsfiddle.net/jfriend00/Zp4zG/

答えて

4

いいえ、これは不可能です。 srcは属性であり、変更されません。

+1

+1です:) –

+0

@デビッドthanky笑^ _^ – Neal

+1

私は変更する.SRC期待し、しかしがあるかどう思っていませんよ他の方法で最終的なURLを入手できますか? – jfriend00

0

http://jsfiddle.net/jfriend00/Zp4zGに基づいて、これはのFirefox 17.0で作品をスニペット:

alert(document.getElementById("testImage").baseURI) 

それはChromeで動作しません。何もテストされていません -

+2

Firefox 17で私にとってはうまくいかないようです:http://jsfiddle.net/jfriend00/wCXmn/。私が得るプロンプトは 'http:// fiddle.jshell.net/jfriend00/wCXmn/show /'ですが、実際のイメージパスはもっと次のようなものです: 'http://www.smugmug.com/Family/Alaska- Trip-2005/i-v7L6qdv/0/Ti/DSC_0438-Ti.jpg'となります。 – jfriend00

+0

もっと詳しく答えてもいいかもしれません – ppaulojr

+0

はFFやクロームでは機能しません – jterrace

1

私はこの質問が古いと既に回答がマークされていることを知っていますが、私が答えようとしていた別の質問はこれの複製としてマークされ、既存の回答 HTTPヘッダーを介して真のURLを取得します。簡単な例(ページ上に単一の画像タグがあると仮定した場合)は、次のようなものになります。

var req = new XMLHttpRequest(); 

req.onreadystatechange=function() { 
    if (req.readyState===4) {// && req.status===200) { 
     alert("actual url: " + req.responseURL); 
    } 
} 

req.open('GET', $('img').prop('src'), true); 
req.send(); 
+1

これは画像の302リダイレクトにどのように役立ちますか?私はこれがどのように問題に関連しているかに従わない。 – jfriend00

+0

@jfriendこれは、302がある場合、ソースURLを解決する方法の質問に答えます。しかし、これを機能させるには、クロスサイトスクリプティングメカニズムのいくつかのタイプ(CORS、jsonpなど)が必要です。これは、イメージサーバーにCORSが有効になっていないため、状況に応じて機能しません。私は、この質問を、それが閉じられたときに最初に答えようとしていた、これの複製とマークされたものに加えて、この質問に答えるので、私はここにこの回答を掲載しました。 –

+0

素晴らしい、ありがとう! –

0

これは私が見つけた回避策です。しかし、それは、同じドメイン上の画像は、そうでなければ、空の文字列を取得する場合にのみ機能します:

var img = document.getElementById("img"); 

getSrc(img.getAttribute("src"), function (realSrc) { 
    alert("Real src is: " + realSrc); 
}); 

function getSrc(src, cb) { 
    var iframe = document.createElement("iframe"), 
     b = document.getElementsByTagName("body")[0]; 

    iframe.src = src; 
    iframe.className = "hidden"; 
    iframe.onload = function() { 
     var val; 

     try { 
      val = this.contentWindow.location.href; 
     } catch (e) { 
      val = ""; 
     } 

     if (cb) { 
      cb(val); 
     } 


     b.removeChild(this); 
    }; 

    b.appendChild(iframe); 
} 

http://jsfiddle.net/infous/53Layyhg/1/

1

あなたはこれを行うことができるサードパーティ製のプロキシを使用する開いている場合。明らかにはjavacriptの解決策ではありませんこれはcors-anywhere.herokuapp.comのプロキシサービスを使用しています。プロキシに公開されている人にこのソリューションを追加するだけで、バックエンドでこれを実装するのを嫌っています。ここで

私より、賢く、そしてより高速であることのためfork of the original fiddle

$.ajaxPrefilter(function (options) { 
    if (options.crossDomain && jQuery.support.cors) { 
    var http = (window.location.protocol === 'http:' ? 'http:' : 'https:'); 
    options.url = http + '//cors-anywhere.herokuapp.com/' + options.url; 
    //options.url = "http://cors.corsproxy.io/url=" + options.url; 
    } 
}); 

$.ajax({ 
    type: 'HEAD', //'GET' 
    url:document.getElementById("testImage").src, 
    success: function(data, textStatus, request){ 
     alert(request.getResponseHeader('X-Final-Url')); 
    }, 
    error: function (request, textStatus, errorThrown) { 
     alert(request.getResponseHeader('X-Final-Url')); 
    } 
    }); 
関連する問題