所以我有以下代碼:的JavaScript HTML5的drawImage與來自不同域的圖像
var element = document.getElementById("myCanvas");
var width = element.width;
var height = element.height;
var context = element.getContext("2d");
/* test 1 */
var img1 = new Image(width, height);
img1.src = "http://www.mydomain.com/image.jpg";
document.body.appendChild(img1); // <-- A: this works
context.drawImage(img1,0,0,width,height); // <-- B: this works
/* test 2 */
var img2 = new Image(width, height);
img2.src = "http://www.notmydomain.com/image.jpg";
document.body.appendChild(img2); // <-- C: this works
context.drawImage(img2,0,0,width,height); // <-- D: this does not work
好了,所以在看我的代碼,在test 1
我創建一個圖像對象與被在同一個域託管圖片作爲我的頁面。從A:
我可以看到它加載正常(A:
和C:
只是作爲測試以確保img對象加載正確)。而且B:
也適用,它將圖像繪製到我的畫布上。
在test 2
中,我加載託管在與我的網頁域不同的域上的圖像。 C:
工作正常,我知道你可以加載託管在其他域的圖像。但是,D:
不起作用。我得到以下錯誤:
Error: uncaught exception: [Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: ....
,從我的理解是指該算作跨站點腳本。
所以這裏的問題:
1)爲什麼這被認爲是跨站點腳本?我的意思是,我知道爲什麼 ......但爲什麼D:
不允許,當C:
是?國際海事組織他們在原則/精神上都是一樣的東西?
2)有沒有辦法解決這個問題,而不是傳統的跨站腳本解決方法?我想我將不得不使用AJAX將URL傳遞給服務器端腳本併發出請求,然後將該映像保存在服務器上並向其返回一個URL以使其位於同一個域中,或者其他(我認爲)我可以返回原始的base64編碼數據,並使用canvas方法從原始數據構建它。我可以生活在做這些事情之一,但...我有點希望也許我錯過了關於HTML5 /帆布的東西(我是新來的!)
aha!先生,你是對的。經過更多的探究,我發現它並不是拋出錯誤的'.drawImage()',而是後面對'.getImageData()'的調用!好吧,這樣做更有意義,與'A:'和'C:'東西更一致。 – slinkhi