很多時候我遇到過問題併發帖尋求幫助,QueryInterface是這麼多次的解決方案。我已經很長一段時間的插件編程,但從來沒有理解QueryInterface。它看起來像魔術,就像它擁有一切的解決方案。QueryInterface上的一些詞magic
喜歡:
window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
所以我的問題是我看到一個QueryInterface鏈,我不明白爲什麼鏈條,我絕對沒有得到如何創建自己的鏈。我不明白你怎麼知道從nsiInterfaceRequester鏈接到nsiWebNavigation而不是從nsiInterfaceRequester直接到nsiDOMWindow
非常感謝這個回覆我一直想要一個,但我開始覺得我是這個世界上最棘手的傢伙哈哈,我就是這樣,不能是真的因爲我吸哈哈。我的意思是魔術就像用QueryInterface有沒有辦法找到另一個選項卡是從哪裏打開?就像你知道選項卡打開相對正確,我看到了某處,但不記得他們是如何做的,這就像魔術。 – Noitidart
你怎麼現在DOM窗口實現'nsIInterfaceRequestor'?因爲當我去'''Services.appShell.hiddenDOMWindow.console.log(window);''',然後點擊瀏覽器控制檯中的,然後在通過nsI的VariableViewer篩選器中,我看不到任何地方有nsIInterfaceRequestor的圖像[這裏](http://img.photobucket.com/albums/v135/noitidart/i20dont20see20nsIInterfaceRequestor_zps7bfc9d43.png) – Noitidart
@Noitidart:要檢查窗口是否實現了'nsIInterfaceRequestor',你需要'window instanceof Ci.nsIInterfaceRequestor' - 這將調用QueryInterface ()'隱式地,你不能通過查看對象的屬性來檢查支持的接口。對於支持的接口的完整列表,您必須轉到源代碼。 –