我正在运行Firefox 30。 我打开了一些标签。其中一个是我的local-html文件,我尝试将window.id或document.id设置为" myhtmlpage"。
...
function init() {
document.name = 'myhtmlpage';
document.id = 'myhtmlpage';
// or window.name ='myhtmlpage';
// window.id = 'myhtmlpage';
}
</script></head>
<body onload="init();">
...
使用以下代码(来自某些mozilla帮助页面),我可以找到contentDocument,但它根本没有.id或.name属性或属性。
function findTabPerURL(url) {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var browserEnumerator = wm.getEnumerator("navigator:browser");
// Check each browser instance for our URL
var found = false;
while (!found && browserEnumerator.hasMoreElements()) {
var browserWin = browserEnumerator.getNext();
var tabbrowser = browserWin.gBrowser;
// Check each tab of this browser instance
var numTabs = tabbrowser.browsers.length;
for (var index = 0; index < numTabs; index++) {
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
if (url == currentBrowser.currentURI.spec) {
// The URL is already opened. Select this tab.
tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];
// Focus *this* browser-window
browserWin.focus();
found = true;
return tabbrowser;
break;
}
}
}
}
var tab; tab = findTabPerURL("file:///F:/myfile.html");
var cd = tab.contentDocument;
alert(cd.id); // doesn't exist. I checked the contentDocument with a for (var each in cd) loop.
使用这个contentDocument(cd)我可以操作内容。 (比如改变textarea的值。)所以这没关系。
但我希望通过比较id来找到合适的文档对象,而不是通过比较URL!我怎么能这样做?
(这里有一个类似的问题,答案建议在选项卡上使用linkedBrowser。但是该选项卡没有该属性。它会抛出一个错误并检查for(var中的每个选项卡)不是&#39 ; t显示它。)
答案 0 :(得分:2)
首先,您的代码实际上并不返回浏览器,而是tabbrowser
(即窗口的gBrowser
)。
document.id
不是document
的标准属性。因此,由于它是在另一个安全上下文中定义的,因此您无法立即访问它。这是为了防止网站覆盖默认实现,并通过这种方式可以提供附加的假值。
由于您知道该值是网站定义的(因此无法欺骗相信假值),因此可以通过访问.wrappedJS
属性来unwrap the document
object。
纠正两者,这里有一些应该有用的代码(虽然我没有测试它):
function findBrowserPerURL(url) {
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var browserEnumerator = wm.getEnumerator("navigator:browser");
// Check each browser instance for our URL
while (browserEnumerator.hasMoreElements()) {
var browserWin = browserEnumerator.getNext();
var tabbrowser = browserWin.gBrowser;
// Check each tab of this browser instance
var numTabs = tabbrowser.browsers.length;
for (var index = 0; index < numTabs; index++) {
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
if (url == currentBrowser.currentURI.spec) {
// The URL is already opened. Select this tab.
tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];
// Focus *this* browser-window
browserWin.focus();
return currentBrowser;
}
}
}
return null;
}
var browser = findBrowserPerURL("file:///F:/myfile.html");
if (browser) {
alert(browser.contentDocument.wrappedJSObject.id + " " + browser.contentDocument.wrappedJSObject.name);
}