javascript - 来自 NSIWebBrowserPersist 的 saveDocument() 函数

标签 javascript css firefox firefox-addon mozilla

据我所知,Firefox 浏览器的“另存为..”功能也使用了此功能,因此我尝试在我的代码中实现此功能。

除了保存的 css 和 javascript 文件外,一切顺利。它们包含奇怪的数字。 Firefox 中的“另存为...”不会执行此操作。我做错了什么吗?

我做了什么:

webBrowserPersist.saveDocument(content.document, file, dir, null, null, null);

我错过了什么吗?我应该更改 MIME 或编码标志吗? (顺便说一下这第4个和第5个参数我没看懂)

提前致谢。

最佳答案

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebBrowserPersist#saveDocument%28%29

第四个参数用于放置编码标志。因此,从上面的页面(我们寻找其中包含单词编码的标志),我们可以像这样传递给它:

persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);

persist.saveDocument(gBrowser.contentDocument, localFile, dataPath, persist.ENCODE_FLAGS_ENCODE_BASIC_ENTITIES, null, null);

第五是它的格式化标志。我们可以通过按位或运算符连接它们来使用多个,例如:

persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);

persist.saveDocument(gBrowser.contentDocument, localFile, dataPath, null, persist.PERSIST_FLAGS_FORCE_ALLOW_COOKIES | persist.PERSIST_FLAGS_BYPASS_CACHE, null);

诸如此类

最后一个参数是关于如何包装它的。我想有一些包装标志。也许尝试传递一个数字。

工作示例:

var file = "c:\\test2.htm";
var data = "c:\\test2_data";
localFile = Components.classes["@mozilla.org/file/local;1"]
           .createInstance(Components.interfaces.nsILocalFile);
localFile.initWithPath(file)

dataPath = Components.classes["@mozilla.org/file/local;1"]
          .createInstance(Components.interfaces.nsILocalFile)
dataPath.initWithPath(data)

persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
         .createInstance(Components.interfaces.nsIWebBrowserPersist);

persist.saveDocument(gBrowser.contentDocument, localFile, dataPath, null, null, null);

盗自:https://github.com/aptana/Jaxer/blob/f7994fc75a768c9873f094e29868c22e88b46b50/server/src/mozilla/embedding/qa/jstests/nsIWebBrowserPersistTest2.txt#L77


顺便说一句,这就是 save us 功能在菜单中使用的内容:

/*
function saveDocument(aDocument, aSkipPrompt)
{
  if (!aDocument)
    throw "Must have a document when calling saveDocument";

  // We want to use cached data because the document is currently visible.
  var ifreq =
    aDocument.defaultView
             .QueryInterface(Components.interfaces.nsIInterfaceRequestor);

  var contentDisposition = null;
  try {
    contentDisposition =
      ifreq.getInterface(Components.interfaces.nsIDOMWindowUtils)
           .getDocumentMetadata("content-disposition");
  } catch (ex) {
    // Failure to get a content-disposition is ok
  }

  var cacheKey = null;
  try {
    cacheKey =
      ifreq.getInterface(Components.interfaces.nsIWebNavigation)
           .QueryInterface(Components.interfaces.nsIWebPageDescriptor);
  } catch (ex) {
    // We might not find it in the cache.  Oh, well.
  }

  internalSave(aDocument.location.href, aDocument, null, contentDisposition,
               aDocument.contentType, false, null, null,
               aDocument.referrer ? makeURI(aDocument.referrer) : null,
               aDocument, aSkipPrompt, cacheKey);
}
*/

保存文档(gBrowser.contentDocument, true)

这是保存菜单项使用的功能。

关于javascript - 来自 NSIWebBrowserPersist 的 saveDocument() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570831/

相关文章:

firefox - 更新至 28.0 后无法确定 FireFox 的当前版本

javascript - jquery如何访问选定的数据

javascript - 查找 Modernizr 设置

css - 在 Dreamweaver 中更改 DIV AP 标签的位置

css - 在 :hover 上覆盖样式

javascript - document.onkeydown 在 Firefox 中不起作用

java.lang.Optional 的 JavaScript 模拟?

javascript - 在 MongoDB 的 Node.js 中链接多个 promise 函数

javascript - 如何在Jquery中找到其父级的所有子级?

c# - 在 Mozilla Firefox 中通过 ASP.NET 显示多行工具提示 - 这可能吗?