2011-08-17 30 views
1

我有一個用window.opener.location.href = XXX修改其父頁面的登錄彈出窗口。代碼就像這樣。如何知道window.opener是否來自我的網頁?

if (window.opener) { 
     window.opener.location.href = window.location.href; 
     self.close(); 
    } 

這裏的問題是,如果有人有一個鏈接到我的網頁,如可以說,從電子郵件中的鏈接,該代碼會被執行,父是電子郵件客戶端。這將拋出一個JavaScript錯誤的原因我想改變一個網頁,是不是我的。(在Chrome中,它說:「不安全的JavaScript嘗試通過網址訪問框架」)

我想知道是否有一種方法我可以找出window.opener是否來自我的網頁。

+1

爲什麼你不能在'try ... catch ...'塊中粘住它? – zzzzBov

+0

出於某種原因在鉻,它不趕上它 – e3matheus

+1

你可以嘗試檢查開啓者的領域。假設您使用單個域。真正的問題是:你爲什麼要執行JS重定向? – zzzzBov

回答

2

不是防彈的,但是您能否在您的主頁上定義一些功能,然後檢查它是否存在您的頁面?包裹在try/catch中以避免頁面不屬於你的其他錯誤?

// on parent, make this function name something unlikely to appear 
// on other pages 
function checkParentIdentity() { return "some ID string"; } 


// on popup 
try { 
    if (window.opener 
     && window.opener.checkParentIdentity 
     && window.opener.checkParentIdentify() === "some ID string") { 
    window.opener.location.href = window.location.href; 
    self.close(); 
    } 
} catch(e) { 
    // error message here 
} 

話雖如此,我不建議它作爲一個想法,只是可能適合你的現有代碼的想法。如果是我,我會將location.href更新移動到父級上的函數中,然後讓子窗口調用該函數來告訴父級更新自己 - 這可以通過對我發佈的代碼進行最小限度的更改來完成。但是,如果是我,我可能根本不會使用彈出窗口,因爲我可以在主頁上執行動態對話框覆蓋thingy(jQuery的對話框只是一個簡單的方法)。

並說,爲什麼人們會直接鏈接到您的登錄頁面?假設他們可能,要測試右側父窗口是否存在的地方是登錄首次顯示時,而不是在用戶輸入他們的詳細信息並嘗試提交之後。

+0

要理解的一件事是在我網站的每一頁上,我有一個下拉表單,就像twitter中的一個,所以你可以登錄。 所以考慮到這一點,這裏是我的答案。 1)location.href不能在父函數中,因爲它根據你想要記錄的頁面而變化。 2)它的Facebook登錄彈出窗口,這就是爲什麼我不使用JQuery對話框。 這就是說,你提供的代碼有效。顯然,Chrome中的捕獲技術確實能夠捕獲異常,但它仍然會在開發人員工具中顯示錯誤。有沒有辦法讓這個錯誤不顯示? – e3matheus

+0

沒有try/catch塊沒有辦法做到這一點嗎?在嘗試使用它之前無法檢查window.opener.location以檢查有效性嗎?嘗試/趕上是相當昂貴的... –

+0

@JoeShelby - 一個單一的try/catch並不昂貴 - 它不像是在一個循環或其他東西。我很高興知道,如果您想提出建議,還有更好的方法嗎? – nnnnnn

相關問題